SQLD발행일 2024. 11. 13.원본 https://blog.naver.com/jword_/223659381476 ↗

[SQLD] SQL 집합연산자, UNION-ROLLUP, CUBE, GROUPING SETS

[SQLD] SQL 집합연산자, UNION-ROLLUP, CUBE, GROUPING SETS — #SQLD #개발자의도구들 #SQL집합연산자 #SQLUNION #SQLROLLUP #SQLCUBE #...

#SQLD#Naver Blog

#SQLD #개발자의도구들 #SQL집합연산자 #SQLUNION #SQLROLLUP #SQLCUBE #SQLGROUPINGSETS

​

24년도 SQLD 제 55회 시험을 대비하며 정리한 글입니다.

\* 본글은 PC버전에 최적화 되어있습니다.

​

**\* **전체 목차는 여기를 참고해주세요.

​

SQL 집합 연산자

출처: SQL자격검정 실전문제

본격적으로 개념정리를 확실하게 해두어야 하는 부분이 등장했습니다. 여러 예제코드와 함께 정리하겠습니다.

​

특히 UNION ALL과 ROLL UP, CUBE, 및 GROUPING SET 부분은 서로 동일한 코드로 변경이 가능한데, 이 부분을 집중적으로 암기하는 걸 추천드립니다.

집합 연산자

종류

👉 핵심정리UNION: 여러 개의 SQL문의 결과에 대한 합집합으로 결과에서 모든 중복된 행은 하나의 행으로 합친다.UNION ALLUNION에서 중복된 행도 그대로 결과로 표시된다.여러 질의 결과가 상호베타적인 경우 많이 사용한다.중복되지 않았다면 UNION과 동일(당연)INTERSECT여러 SQL문의 결과에 대한 교집합. 중복 행은 하나의 행으로 합친다.EXCEPTSQL 결과에서 뒤의 SQL 결과에 대한 차집합이다. 중복행은 하나의 행으로 합친다.일부 DB에서는 MINUS를 사용한다.

여기서 부터는 쿼리의 결과가 집합이라는 점을 명심해야 합니다. 행으로 표현되는 레코드들은 알고보면 모두 집합의 원소들입니다.

​

PYTHON의 SET()으로 생각해도 좋을 것 같네요.

javascript 코드 예제
                                    result = set([pk, co11, col2, col3], [pk, col1, col2. col3], ...)

집합 연산자 오답노트

TBL1

COL1COL2
AAA1
ABA2

TBL2

COL1COL2
AAA1
ABA2
ACA3
ADA4

​

javascript 코드 예제
                                    SELECT COL1, COL2, COUNT(*) AS CNT
FROM (SELECT COL1, COL2
      FROM TBL1
      UNION ALL
      SELECT COL1, COL2
      UNION
      SELECT COL1, COL2
      FROM TBL1
)
GROUP BY COL, COL2;

예상 결과는?
javascript 코드 예제
                                    A.
COL1COL2CNT
AAA11
ABA21
ACA31
ADA41
javascript 코드 예제
                                     💡 집합 연산자는 위에서 부터 차례로 진행된다. UNION ALL에서 중복이 발생했지만, 다시 UNION을 하여
중복을 없앴다. 결과는 위 테이블 처럼 나온다.

javascript 코드 예제
                                    Q. 설명으로 적절한 것은?
회원 기본정보(회원 ID(PK)) 1:1 회원 상세정보(회원 ID(PK))

1. 회원 ID 칼럼 대상으로 회원기본정보 EXCEPT 회원상세정보 연산을 수행하면 회원 상세정보가
등록되지 않은 회원 ID가 추출된다.

2. 회원 ID 칼럼을 대상으로 (회원기본정보 UNION ALL 회원 상세정보) 연산을 수행한 결과의 건수는
회원 기본 정보의 전체 건수와 동일하다.

3. 회원 칼럼을 대상으로 (회원기본정보 INTERSECT 회원상세정보) 연산을 수행한 결과의 건수와
두 테이블을 회원 ID로 JOIN연산을 수행한 결과의 건수는 동일하다.

4. 회원 ID 칼럼을 대상으로 (회원기본정보 INTERSECT 회원상세정보) 연산을 수행한 셜과와
(회원기본정보 UNION 회원상세정보) 연산을 수행한 결과는 다르다.

​

ROLL UP, CUBE, GROUPING SET

def

👉 핵심정리Group By 지정시 전체 집계, 그룹별 집계를 계산할 때 사용하는 함수들이다.UNION으로 대체가 가능하다.

집계범위

👉 핵심정리\* 상황 가정 : GROUBY BY로 2의 COL을 묶은 상태​ROLL UPGROUP BY로 묶은 제일 처음 COL 그룹에 대해서만 소계전체 합계​CUBEGROUP BY로 묶은 전체 COL 그룹에 대해서 모두 소계전체 합계​GROUPING SET그룹별 소계의 합만 출력 - ROLL UP & CUBE는 개별 출력

UNION ALL변환⭐⭐

👉 핵심정리\* 상황 가정 : GROUBY BY로 2의 COL을 묶은 상태​GROUP BY ROLLIP(col1, col2) = GROUP BY col1, col2 UNION ALL GROUP BY co1 UNION ALL 모든 집합 그룹 결과​GROUP BY CUBE(co1, co2)= GROUP BY co1, co2 UNION ALL GROUP BY col1 UNION ALL GROUP BY col2 UNION ALL 모든 집합 그룹 결과​​SELECT col1, col2, sum(some col) FROM TABLE GROUP BY GROUPING SET(col1, col2)= SELECT col1, col2, sum(some col) FROM TABLE GROUP BY col1 UNION ALL SELECT col1, col2, sum(some col) FROM TABLE GROUP BY col2

그룹 집계 오답노트

javascript 코드 예제
                                    Q. SQL 실행 결과가 다른 하나는?

1.
SELECT COL1, SUM(COL2)
FROM T1
GROUP BY COL1
UNION ALL

2.
SELECT COL1, SUM(COL2)
FROM T1
GROUP BY GROUPING SET (COL1)

3.
SELECT COL1, SUM(COL2)
FROM T1
GROUP BY ROLLUP(COL1)

4.
SELECT COL1, SUM(COL2)
FROM T1
GROUP BY CUBE (COL1)
javascript 코드 예제
                                    A. 2
javascript 코드 예제
                                    💡 GROUPING SET의 경우 COL1에 대한 소계만 구한다. 나머지는 모두 전체 합계도 함꼐 구함

​