[실무에서 바로 쓰는 SQL 기본과 SQL 튜닝][ORACLE] 17강

MinHee·2023년 5월 20일
0
post-thumbnail

계층형 질의문으로 서열을 주고 데이터 출력하기

START WITH와 CONNECT BY PRIOR절을 작성하면 LEVEL이라는 칼럼을 출력할 수 있음

SELECT ename, level, sal, job
FROM emp
START WITH ename = 'KING' -- KING을 서열 1위로 두고, 이후로 서열화
CONNECT BY PRIOR empno = mgr; -- 사원번호와 mgr이 연결됨

KING을 1위로 하여, MGR로 연결된 사원들을 서열화 함

SELECT RPAD(' ',level3) || ename, sal, job -- RPAD(' ',level3) : 서열만큼 공백이 채워져서 계층화되어 출력됨
FROM emp
START WITH ename = 'KING' -- KING을 서열 1위로 두고, 이후로 서열화
CONNECT BY PRIOR empno = mgr; -- 사원번호와 mgr이 연결됨

서열이 2위인 사원들의 이름과 서열 직업 출력하시오

SELECT RPAD(' ',level3) || ename, sal, job -- RPAD(' ',level3)
FROM emp
WHERE level = 2
START WITH ename = 'KING' -- KING을 서열 1위로 두고, 이후로 서열화
CONNECT BY PRIOR empno = mgr; -- 사원번호와 mgr이 연결됨

계층형 질의문으로 서열을 주고 데이터 출력하기

특정 행 포함 아래 서열들을 포함시키지 않고 출력하는 방법

SELECT RPAD(' ',level3) || ename, sal, job -- RPAD(' ',level3)
FROM emp
START WITH ename = 'KING'
CONNECT BY PRIOR empno = mgr
AND ename != 'BLAKE';

해당 조건을 WHERE절이 아니라 CONNECT BY절에 작성하여야 함
WHERE절에 작성하면 해당 행만 제외됨

SCOTT과 FORD를 포함한 그들의 팀원들이 제외하고 출력되도록 하시오

SELECT RPAD(' ',level3) || ename, sal, job -- RPAD(' ',level3)
FROM emp
START WITH ename = 'KING'
CONNECT BY PRIOR empno = mgr
AND ename NOT IN ('SCOTT','FORD');

계층형 질의문으로 서열을 주고 데이터 출력하기

특정 조건대로 서열화하여 출력하기

SELECT RPAD(' ',level3) || ename, sal, job -- RPAD(' ',level3)
FROM emp
START WITH ename = 'KING'
CONNECT BY PRIOR empno = mgr
ORDER SIBLINGS BY sal desc; -- 서열 순서를 유지하면서 월급 높은 순대로 출력/같은 레벨상의 행들은 월급 높은 순으로 정렬되어 출력됨

SIBLINGS 옵션을 작성하지 않으면 아래와 같이 서열 순서가 깨져서 나옴

BLAKE를 포함한 팀원들만 출력하는데 서열을 유지한 상태로 월급이 낮은 사원부터 출력하시오

SELECT RPAD(' ',level3) || ename, sal, job -- RPAD(' ',level3)
FROM emp
WHERE level = 2
START WITH ename = 'BLAKE'
CONNECT BY PRIOR empno = mgr
ORDER SIBLINGS BY sal ASC;

SIBLINGS를 작성하지 않으면 단순히 서열 관계없이 월급이 낮은 순대로만 출력하게 됨

계층형 질의문으로 서열을 주고 데이터 출력하기

SYS_CONNECT_BY_PATH() : 서열 순서를 가로로 출력할 수 있음

SELECT ename, sys_connect_by_path(ename,'/') as path
FROM emp
START WITH ename = 'KING'
CONNECT BY PRIOR empno = mgr;

다음과 같이 월급도 같이 출력되게 하시오

SELECT ename || '(' || sal || ')', sys_connect_by_path(ename || '(' || sal || ')' , '/') as path
FROM emp
START WITH ename = 'KING'
CONNECT BY PRIOR empno = mgr;

DDL : 테이블 생성/ 관리/ 삭제

CREATE TABLE : 일반 테이블 생성

CREATE TABLE 테이블명 (칼럼명 데이터타입,칼럼명 데이터타입,칼럼명 데이터타입,...);

예시)

CREATE TABLE emp3
(empno number(10), -- 숫자 10자리
ename varchar1(10), -- 문자(영어) 10자리 (한글은 한 글자당 2바이트이므로 5글자)
sal number(10,2), -- 총 10자리가 숫자인데, 그 중 2자리는 소수점
hiredate date); -- 날짜

CREATE TEMPORARY TABLE : 임시 테이블 생성

CREATE GLOBAL TEMPORARY TABLE 테이블명 ( ............) ON COMMIT DELETE ROWS;

COMMIT시 데이터가 사라짐
세션 종료 후 재접속시 데이터는 사라지고, 테이블만 존재

어떤 작업을 위해서 임시로 데이터를 저장해야 할 때가 있음

영구 테이블로 임시 데이터를 저장하고 사용할 시, 후에 삭제하는 과정이 부담이 발생할 수 있음
-- 임시 데이터의 테이블을 지우려다가, 지우면 안되는 테이블을 지우게 될 수도 있음 (삭제 과정은 확인을 많이 필요로 하는 작업)

섣불리 필요없을 것 같은 테이블임에도 섣불리 지워내지 못해서, 데이터 낭비가 발생하게 되는 경우를 방지

CREATE GLOBAL TEMPORARY TABLE emp3
( empno number(10)
ename varchar2(10)
sal number(10) )
ON COMMIT DELETE ROWS; -- COMMIT 실행시에 데이터가 삭제 됨 (테이블은 그대로고, 데이터만 사라짐)

임시테이블 옵션

  1. ON COMMIT DELETE ROWS : 커밋하면 데이터를 지워라
  2. ON COMMIT PRESERVE ROWS : 세션을 종료하면 데이터를 지워라 (커밋하면 데이터가 저장됨)
profile
성장하는 개발자

0개의 댓글