SQLD 서브쿼리, 집합연산자, 그룹함수

Soondol·2024년 5월 20일
post-thumbnail

서브쿼리

  • 하나의 SQL 문 안에 포함되어있는 또 다른 SQL문을 말함
  • 반드시 괄호로 묶어야함

서브쿼리 사용 가능한 곳

  • SELECT
  • FROM
  • WHERE
  • HAVING
  • ORDER BY
  • 기타 DML (INSERT, DELETE, UPDATE)
  • GROUP BY절 사용 불가

서브쿼리 종류

동작하는 방식에 따라

1. UN-CORRELATED(비연관) 서브쿼리
	- 서브쿼리가 메인쿼리 컬럼을 가지고 있지 않은 형태의 서브쿼리
	- 메인쿼리에 서브쿼리가 실행된 결과 값을 제공하기 위한 목적
2.  CORRELATED(연관) 서브쿼리    
	- 서브쿼리가 메인쿼리 컬럼을 가지고 있는 형태의 서브쿼리
	- 일반적으로 메인쿼리가 먼저 수행된 후에 서브쿼리에서 조거닝 맞는지 확인하고자 할 때

위치에 따라

1. 스칼라 서브쿼리
	- SELECT에 사용하는 서브쿼리
    - 서브쿼리 결과를 마치 하나의 컬럼처럼 사용하기위해 주로 사용
			SELECT * | 컬럼명 | 표현식.
            	(SELECT * | 컬럼명 | 표현식 FROM 테이블 or 뷰명 WHERE 조건)
            FROM 테이블명 or 뷰명
2. 인라인뷰
	- FROM 절에 사용하는 서브쿼리
    - 서브쿼리 결과를 테이블처럼 사용하기 위해 주로 사용
			SELECT * | 컬럼명 | 표현식.
            	FROM (SELECT * | 컬럼명 | 표현식 FROM 테이블 or 뷰명)
            WHERE 조건;
3. WHERE절 서브쿼리
	- 가장 일반적인 서브쿼리
    - 값을 전달하기 위한 목적으로 주로 사용 (상수항의 대체)
			SELECT * | 컬럼명 | 표현식.
            	FROM 테이블 or 뷰명
            WHERE 조건연산자 (SELECT * | 컬럼명 | 표현식 FROM 테이블 or 뷰명 WHERE 조건)
	- WHERE 절 서브쿼리 종류
        1. 단일행 서브쿼리
            - 서브쿼리 결과가 1개의 행이 리턴되는 형태
        2. 다중행 서브쿼리
            - 서브쿼리 결과가 여러 행이 리턴되는 형태
            - 비교연산자 (=, >, < ...) 사용 불가
            - 다중행 서브쿼리 연산자  
                |IN|같은 값을 찾음|
                |> ANY|최소값을 반환함|
                |< ANY|최대값을 반환함|
                |< ALL|최소값을 반환함|
                |> ALL|최대값을 반환함|
        3. 다중컬럼 서브쿼리
        	- 서브쿼리 결과가 여러 컬럼이 리턴되는 형태
		4. 상호연관 서브쿼리
        	- 메인쿼리와 서브쿼리의 비교를 수행하는 형태
	- 인라인뷰 (Inline View)
    	- 쿼리 안의 뷰의 형태로 테이블처럼 조회할 데이터를 정의하기 위해 사용
        - 테이블명 존재 X, 다른테이블과 조인시 반드시 테이블 별칭 명시
        - 서브쿼리 결과를 메인쿼리의 어느 절에도 사용할 수 있음
    - 스칼라 서브쿼리
    	- SELECT절에 사용하는 쿼리, 하나의 컬럼처럼 표현하기 위해 사용
        - 각 행마다 스칼라 서브쿼리 결과가 하나여야함
        - 조인의 대체 연산

서브쿼리 주의 사항

  • 특별한 경우(TOP-N 분석 등)을 제외하고는 서브쿼리절에 ORDER BY 절 사용 불가
  • 단일, 다중 행 서브쿼리에 따라 연산자 선택이 중요

집합 연산자

  • SELECT문 결과를 하나의 집합으로 간주, 그 집합에 대한 합,교,차집합 연산
  • SELECT문과 SELECT문 사이에 집합 연산자 정의
  • 두 집합의 컬럼이 동일하게 구성되어야 함 (각 컬럼의 데이터 타입과 순서 일치 필요)

합집합

  • 두 집합의 총 합(전체) 출력
  • UNION, UNION ALL

UNION

  • 중복된 데이터는 한 번만 출력
  • 중복된 데이터를 제거하기 위해 내부적으로 정렬 수행
  • 중복된 데이터가 없을경우는 UNION사용 대신 UNION ALL 사용 (불필요한 정렬이 발생할 수 있으므로)

UNION ALL

  • 중복된 데이터도 전체 출력

교집합

  • 두 집합 사이에 INTERSECT
  • 두 집합의 교집합(공통으로 있는 행) 출력

차집합

  • 두 집합 사이에 MINUS
  • 두 집합의 차집합(한 쪽 집합에만 존재하는 행) 출력

집합 연산자 사용시 주의사항

  • 두 집합의 컬럼 수 일치
  • 두 집합의 컬럼 순서 일치
  • 두 집합의 각 컬럼의 데이터 타입 일치
  • 각 컬럼의 사이즈는 달라도됨

그룹함수

  • 숫자함수 중 여러값을 전달하여 하나의 요약값을 출력하는 다중행 함수
  • 수학/통계 함수들
  • GROUP BY 절에 의해 그룹별 연산 결과를 리턴
  • 반드시 한 컬럼만 전달
  • NULL 무시하고 연산

COUNT

  • 행의 수를 세는 함수
  • 대상 컬럼은 * or 단 하나의 컬럼만 전달 가능
  • 문자, 숫자, 날짜 컬럼 모두 전달 가능
SELECT COUNT(*), COUNT(EMPNO) FROM EMP;

SUM

  • 총 합 출력
  • 숫자 컬럼만 전달 가능
SELECT SUM(SAL) FROM EMP;

AVG

  • 평균 출력
  • 숫자 컬럼만 전달 가능
  • NULL을 제외한 대상의 평균을 리턴
SELECT 
	AVG(COMM),							// 550 (null을 재외한 평균)
    SUM(COMM) / COUNT(EMPNO) AS AVG2, 	// 157.142... (null 포함한 평균)
    AVG(NVL(COMM, 0)) AS AVG3			// 157.142... (null 포함한 평균)
FROM EMP;

MIN/MAX

  • 최소, 최대 출력
  • 날짜, 숫자, 문자 모두 가능(오름차순 순서대로 최소, 최대 출력)
SELECT MIN(ENAME), MAX(ENAME) FROM EMP;

GROUP BY FUNCTION

  • GROUP BY 절에 사용하는 함수
  • 여러 GROUP BY 결과를 동시에 출력(합집합)하는 기능

GROUPING SETS(A, B, ....)

  • A 별, B 별 그룹 연산 결과 출력
  • 나열 순서 중요 X
  • 기본 출력에 전체 총계는 출력되지 않음
  • NULL 혹은 () 사용하여 전체 총 합 출력 가능 GROUPING SETS(DEPTNO, JOB, ());
  • UNION ALL 로 대체 가능
SELECT DEPTNO, JOB, SUN(SAL) 
FROM EMP
GROUP BY GROUPING SETS(DEPTNO, JOB);
// 각각의 group by를 합쳐서 보여줌

SELECT DEPTNO, NULL AS JOB, SUM(SAL)
FROM EMP
GROUP BY DEPTNO
UNION ALL
SELECT NULL, JOB, SUM(SAL)
FROM EMP
GROUP BY JOB

ROLLUP(A, B)

  • A별, (A,B)별, 전체 그룹 연산 결과 출력
  • 나열 대상의 순서가 중요함
  • 기본적으로 전체 총 계가 출력됨
  • UNION ALL로 대체 가능
SELECT DEPTNO, JOB, SUM(SAL)
FROM EMP
GROUP BY ROLLUP(DEPTNO, JOB)
// DEPTNO별, (DEPTNO, JOB)별, 전체 연산 결과 출력

SELECT DEPTNO, JOB, SUM(SAL)
FROM EMP
GROUP BY DEPTNO, JOB
UNION ALL
SELECT DEPTNO, NULL, SUM(SAL)
FROM EMP
GROUP BY DEPTNO
UNION ALL
SELECT NULL, NULL, SUM(SAL)
FROM EMP

CUBE(A, B)

  • A별, B별, (A,B)별, 전체 그룹 연산 결과 출력됨
  • 그룹으로 묶을 대상의 나열 순서 중요하지 않음
  • 기본적으로 전체 총 계가 출력됨
  • UNION ALL로 대체 가능
  • GROUPING SETS로 대체
SELECT DEPTNO, JOB, SUM(SAL)
FROM EMP
GROUP BY CUBE(DEPTNO, JOB);
// DEPTNO, JOB, (DEPTNO, JOB), 전체 총계 / 총 4개의 그룹핑된 값이 나옴

SELECT DEPTNO, JOB, SUM(SAL)
FROM EMP
GROUP BY DEPTNO, JOB
UNION ALL
SELECT DEPTNO, NULL, SUM(SAL)
FROM EMP
GROUP BY DEPTNO
UNION ALL
SELECT NULL, JOB, SUM(SAL)
FROM EMP
GROUP BY JOB
UNION ALL
SELECT NULL, NULL, SUM(SAL)
FROM EMP

SELECT DEPTNO, JOB, SUM(SAL)
FROM EMP
GROUP BY GROUPING SETS(DEPTNO, JOB, (DEPTNO, JOB), ());

홍쌤의 데이터랩
SQLD 2과목 PART2. SQL 활용 완벽 정리 (2024년 신유형 반영) 강의에 대해
공부 및 개인적으로 정리한 글 입니다.

0개의 댓글