크리스피코드
'데이터베이스' 카테고리의 글 목록 (2 Page)

데이터베이스

데이터베이스/Oracle

[OracleDB] 실행계획 (Execution Plan)

실행계획 (Execution Plan) 실행계획은 SQL을 이용해 요구한 데이터를 추출하기 위해 DBMS가 차례로 수행한 ACCESS 과정을 말한다. 오라클에서 실행계획은 'EXPLAIN PLAN FOR'를 이용해 저장하고 'TABLE(DBMS_XPLAN.DISPLAY)'를 SELECT하여 확인할 수 있다. EXPLAIN PLAN FOR [실행계획을 조회할 SQL문]; SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY); 실행계획 예시 EXPLAIN PLAN FOR SELECT r.*, c.*, l.* FROM (SELECT * FROM regions WHERE region_name = 'Asia') r, countries c, locations l WHERE r.region_id =..

데이터베이스/Oracle

[OracleDB] Group By

Group By 집계 함수를 사용할 때 그 외의 컬럼들을 묶는데 사용한다. "부서별 급여", "직급별 급여"와 같이 "~별"을 정의하는 절(Clause)이다. SELECT d.DEPARTMENT_NAME AS "부서명", j.JOB_TITLE AS "직급명", SUM(e.SALARY) AS "부서 총 급여" FROM EMPLOYEES e, DEPARTMENTS d, JOBS j WHERE e.DEPARTMENT_ID = d.DEPARTMENT_ID AND e.JOB_ID = j.JOB_ID GROUP BY d.DEPARTMENT_NAME, j.JOB_TITLE ORDER BY DEPARTMENT_NAME, JOB_TITLE; ROLLUP ROLLUP은 이름처럼 컬럼을 하나씩 말아올리는(?) 형식의 그룹 ..

데이터베이스/Oracle

[OracleDB] 계층형 쿼리

계층형 쿼리 이름 그대로 결과를 계층형으로 조회할 수 있는 쿼리이다. 회사의 상사 - 부하 관계, 또는 게시글의 댓글 - 대댓글 등의 상하 관계가 존재하는 데이터를 계층형으로 조회할 때 사용할 수 있다. 계층형 쿼리의 기본 구성 SELECT * FROM EMPLOYEES START WITH MANAGER_ID IS NULL CONNECT BY [NOCYCLE] PRIOR EMPLOYEE_ID = MANAGER_ID ORDER SIBLINGS BY EMPLOYEE_ID; START WITH 계층형 쿼리를 어디서부터 시작할지 정의한다. 위 예시처럼 MANAGER_ID IS NULL 로 지정하면 상사가 없는 사원, 즉 가장 높은 사원부터 계층을 생성하기 시작한다. CONNECT BY ... PRIOR 계층형 ..

데이터베이스/Oracle

[PL/SQL] 반복문 (Loop)

반복문 (Loop) 이름 그대로 특정 작업을 반복해서 수행하기 위한 문(Statement)이다. Oracle PL/SQL에는 Loop와 For Loop가 있다. LOOP 프로그래밍 언어의 while(true)처럼 무한히 반복하는 반복문이다. while에서 break를 사용해 반복문을 탈출하 듯, LOOP에서는 EXIT WHEN을 사용해 반복문을 탈출한다. DECLARE v_index number := 1; BEGIN DBMS_OUTPUT.PUT_LINE('반복문 시작'); LOOP DBMS_OUTPUT.PUT_LINE(v_index || '회 반복중..'); EXIT WHEN v_index >= 10; v_index := v_index + 1; END LOOP; DBMS_OUTPUT.PUT_LINE('반..

데이터베이스/Oracle

[PL/SQL] 커서(Cursor)

커서(Cursor) 특정 SQL 문장을 처리한 결과를 담고 있는 메모리 영역을 가리키는 일종의 포인터이다. 묵시적 커서 SQL을 수행할 때 자동으로 생성되는 커서이다. 묵시적 커서를 사용하면 수행한 SQL에 대해서 여러가지 정보를 얻을 수 있다. * 묵시적 커서 사용하기 CREATE OR REPLACE PROCEDURE pr_increase_emp_sal (p_enum IN NUMBER) IS BEGIN UPDATE EMPLOYEES SET SALARY = SALARY + 100 WHERE EMPLOYEE_ID = p_enum; -- 영향 받은 행이 1개 이상 있을 경우 IF SQL%FOUND THEN DBMS_OUTPUT.PUT_LINE('해당 사원의 급여를 100만큼 증가시켰습니다.'); -- 영향 ..

데이터베이스/Oracle

[OracleDB] TIMESTAMP로 데이터 복구하기

TIMESTAMP OracleDB를 사용하다가 실수로 잘못된 데이터를 UPDATE하고 COMMIT까지 해버렸을 경우, TIMESTAMP를 사용하여 일정 시간 이전의 테이블을 불러와 데이터를 복구하는데 사용할 수 있다. 이 기능을 Flashback 이라고 부른다. 사용 설정 1. UNDO_MANAGEMENT를 'AUTO'로 변경 UNDO 관리시스템을 자동으로 설정한다. 수동으로 변경하고 싶을 때는 MANUAL로 설정하면 된다. ALTER SYSTEM SET UNDO_MANAGEMENT=AUTO; 2. UNDO_RETENTION 값 설정 UNDO_RETENTION은 과거 어느 시점까지의 UNDO 데이터를 보관할지 가리킨다. 단위는 초이며 기본값은 900초이다. ALTER SYSTEM UNDO_RETENTIO..

데이터베이스/Oracle

[OracleDB] 윈도우(Window) 함수

윈도우 (Window) 함수 OracleDB의 윈도우 함수는 행과 행 간의 관계를 정의하기 위해 사용할 수 있다. 지금까지 사용했던 집계(Aggregate) 함수는 여러 개의 행을 묶어 하나의 값을 냈다면, 윈도우 함수는 여러 개의 행의 값을 묶거나 비교하는 건 비슷하지만 각 행 마다 하나의 값을 만들어낼 수 있다. 윈도우 함수에서는 집계 함수 뿐만 아니라 순위 함수를 사용할 수 있고 그 이외에도 LAG, LEAD와 같은 앞뒤 행의 값을 가리키는 함수 등을 제공한다. 구성 SELECT 함수명() OVER([PARTITION BY 컬럼명] ORDER BY [컬럼명] [[ROWS|RANGE] BETWEEN 시작행 AND 마지막행]) FROM 테이블명; 여러가지 함수 집계 함수 COUNT(*) null 값을 ..

데이터베이스/MariaDB

[MariaDB] 계층형 쿼리

Oracle에서의 계층형 쿼리는 START WITH와 CONNET BY를 중심으로 구성된다. 하지만 MariaDB의 경우 WITH RECURSIVE ~ 라는 WITH 구문 형태로 계층형 쿼리를 작성한다. RECURSIVE라는 이름에서 알 수 있 듯, 재귀 쿼리를 의미한다. WITH RECURSIVE comments AS ( SELECT *, 1 AS LEVEL FROM comment WHERE target_comment_sn IS NULL UNION ALL SELECT c.*, cs.LEVEL + 1 AS LEVEL FROM comment c INNER JOIN comments cs on c.target_comment_sn = cs.co..