DB/SQL튜닝

업무에 바로 쓰는 SQL튜닝 입문 - 9교시(subquery와 함수의 활용)

Kang_hobin 2022. 9. 27. 22:44

1. 모든 서브쿼리는 메인 쿼리보다 먼저 실행된다?

X : Correlated subquery의 경우에는 메인 쿼리가 먼저 실행된다.

2. 스칼라(Scalar) 서브쿼리는 한번에 리턴 할 수 있는 최대 row 수가 1건이다?

O : 스칼라 서브쿼리는 최대 1건 리턴이며, 없는 경우에는 null을 리턴한다.

group by절 제외하고 다 가능!

 

NESTED SUBQUERY 
SELECT A, B
  FROM TABLE
 WHERE C = (SELECT C
              FROM TABLE2
             WHERE A = 1)

여기서의 서브쿼리임!

메인보다 먼저 실행됨!

 

Correlated SUBQUERY

메인보다 나중에 실행됨. EXISTS네!!

Exists는 메인을 먼저 읽고 그 row를 가져와야 비교가 가능하니까!

 

 Scalar SUBQUERY

함수같은 놈임. 1row만 뱉음!

select 절에서 자주 쓰는 subquery임. 그런것들은 main 건수마다 실행되게 되버림.

 

ROLLUP() & CUBE()

ROLLUP()은 각각 GROUP BY 마다 총계의 개념을 넣을 수 있음

여기에 각각의 소계까지 넣을거면 CUBE() 사용 하면 됨

사용법 :

SELECT D.DNAME
     , E.JOB
     , COUNT(*) AS CNT
     , SUM(E.SAL) AS TOT_SAL
  FROM DEPT D, EMP E
 WHERE D.DEPTNO = E.DEPTNO
 GROUP BY ROLLUP(D.DNAME, E.JOB) -- DNAME, JOB별 합계가 나온다!
 ORDER BY 1, 2;

 

ROLLUP 시
CUBE 시

 

GROUPING SETS()
SELECT D.DNAME
     , E.JOB
     , COUNT(*) AS CNT
     , SUM(E.SAL) AS TOT_SAL
  FROM DEPT D, EMP E
 WHERE D.DEPTNO = E.DEPTNO
 GROUP BY GROUPING SETS((D.DNAME, E.JOB), (D.DNAME), (E.JOB), ()) --CUBE와 동일하게 출력 가능
 ORDER BY 1, 2;

 

ANALYTICAL FUNCTIONS

RANK() OVER, ROW_NUMBER, SUM() OVER 등이 다 ANALYTICAL FUNCTIONS다.

 

처음 본 것! RATIO_TO_REPORT(SAL) OVER(PARTITION BY JOB)

-- 그룹 내 비율 관련
-- EMP 테이블에서 JOB별로 총SAL를 기준으로 각 ENAME의 급여를 백분률(소수점)으로 구하기!
SELECT JOB, ENAME, SAL
     , RATIO_TO_REPORT(SAL) OVER(PARTITION BY JOB) AS RR -- 요놈!!
FROM EMP;

호오.. 비율을 구하는 것이다! 쓸만 할 듯 하네.