본문 바로가기

문돌이 존버/DB 및 SQL 스터디

SQLD NOT EXISTS(), 집합연산자, ROLLUP(), CUBE() 예제

반응형

WHERE NOT EXISTS(): 서브쿼리를 만족하는 조건이 하나라도 존재하지 않으면 True, 존재하면 False

메인 쿼리에 있는 테이블 A를 기준으로 한다. 

SELECT DISTINCT A.C1
FROM T1 A
WHERE NOT EXISTS (SELECT 1
                     FROM T2 X
                     WHERE X.C1 = A.C1);
                     
# or 집합연산자 사용(차집합, 중복 값 제거)
SELECT C1 FROM T1
MINUS
SELECT C1 FROM T2;

WHERE EXISTS(): 서브쿼리를 만족하는 조건이 하나라도 존재하면 True, 존재하지 않으면 False
SELECT A.C1
FROM T1 A
WHERE EXISTS (SELECT 1
                     FROM T2 X
                     WHERE X.C1 = A.C1);

SELECT DISTINCT A.C1
FROM T1 A
WHERE EXISTS (SELECT 1
                     FROM T2 X
                     WHERE X.C1 = A.C1);
                     
# or 집합연산자 사용(교집합, 중복 값 제거)
SELECT C1 FROM T1
INTERSECT
SELECT C1 FROM T2;

2. 그룹 함수

GROUP BY ROLLUP(E1, E2): (E1, E2) 소계 / (E1) 소계 / () 총합계
ROLLUP()에서 지정한 표현식을 뒤쪽에서부터 하나씩 제거한다고 생각
SELECT deptno, job, ename, SUM(sal)
FROM emp
GROUP BY ROLLUP(deptno, job, ename);

오라클 기본 테이블 EMP를 사용해본다. 아무런 박스가 쳐지지 않은 행은 (deptno, job, ename)별 소계이고, 노란색 박스가 (deptno, job)별 소계이며, 빨간색 박스는 (deptno)별 소계이다. 마지막 행에 표시된 "29025"가 총계에 해당한다. 

GROUP BY CUBE(E1, E2): (E1, E2) 소계 / E1 소계 / E2 소계 / () 총합계
CUBE()에서 지정한 표현식의 모든 조합을 집계한다
SELECT deptno, job, ename, SUM(sal)
FROM emp
GROUP BY CUBE(deptno, job, ename);

박스가 쳐지지 않은 행, 빨간색 박스, 노란색 박스는 위의 ROLLUP과 똑같다. 하지만 초록색 박스를 보면 (deptno, ename) 별 소계임을 알 수 있다. 하늘색 박스는 (ename)별 소계이다. 

GROUP BY GROUPING SETS(E1, E2): E1 소계 / E2 소계
명시적으로 지정한 표현식 그룹으로만 집계한다
SELECT deptno, job, ename, SUM(sal)
FROM emp
GROUP BY GROUPING SETS(deptno, job, ename);

보라색 박스는 (ename)별 소계이며, 핑크색 박스는 (job) 별 소계, 박스가 쳐지지 않은 행은 (deptno) 별 소계이다. 

ROLLUP 특이 예제(GROUPING_ID 등)는 마이자몽님의 블로그를 참고해보자.

728x90
반응형