SQL #13

SQL 활용

서브쿼리

하나의 SQL문 안에 포함되어 있는 또 다른 SQL문을 말한다. 반드시 괄호로 묶어야 한다. ex. SELECT 안에 SELECT문, INSERT, UPDATE, DELETE 안의 SELECT문.

서브쿼리 사용 가능한 곳

  1. SELECT 절
  2. FROM 절
  3. WHERE 절
  4. HAVING 절
  5. ORDER BY 절
  6. 기타 DML(INSERT, DELETE, UPDATE) 절

GROUP BY 절 사용 불가!

서브쿼리 종류

  1. 동작하는 방식에 따라
    UN-CORRELATED(비연관) 서브쿼리: 서브쿼리가 메인쿼리 컬럼을 가지고 있지 않은 형태의 서브쿼리. 메인쿼리에 서브쿼리가 실행된 결과 값을 제공하기 위한 목적으로 사용.
    CORRELATED(연관) 서브쿼리: 서브쿼리가 메인쿼리 컬럼을 가지고 있는 형태의 서브쿼리. 일반적으로 메인쿼리가 먼저 수행된 후에 서브쿼리에서 조건이 맞는지 확인하고자 할 때 사용.
  2. 위치에 따라
    스칼라 서브쿼리: SELECT에 사용하는 서브쿼리. 서브쿼리 결과를 마치 하나의 컬럼처럼 사용하기 위해 주로 사용.
    인라인뷰:
    FROM 절에 사용하는 서브 쿼리. 서브쿼리 결과를 테이블처럼 사용하기 위해 주로 사용.
    WHERE 절
    서브쿼리: 가장 일반적인 서브 쿼리. 비교 상수 자리에 값을 전달하기 위한 목적으로 주로 사용. (상수항의 대체) 리턴 데이터의 형태에 따라 단일행 서브쿼리, 다중행 서브쿼리, 다중컬럼 서브쿼리, 상호연관 서브쿼리로 구분.

WHERE절 서브쿼리 종류

  1. 단일형 서브쿼리: 서브쿼리 결과가 1개의 행이 리턴되는 형태. 단일행 서브쿼리 연산자 종류.
    더보기
    연산자 : 의미
    = : 같다.
    <> : 다르다.
    > : 크다.
    >= : 크거나 같다.
    < : 작다.
    <= : 작거나 같다.
  2. 다중형 서브쿼리: 서브쿼리 결과가 여러 행이 리턴되는 형태. =,>,<와 같은 비교 연산자 사용불가. (여러 값이랑 비교할 수 없는 연산자들) 서브쿼리 결과를 하나로 요약하거나 다중행 서브쿼리 연산자를 사용.
  3. 다중컬럼 서브쿼리: 서브쿼리 결과가 여러 컬럼이 리턴되는 형태. 메인쿼리와의 비교 컬럼이 2개 이상. 대소 비교 전달 불가. (두 값을 동시에 묶어 대소비교 할 수 없다.)
  4. 상호연관 서브쿼리: 메인쿼리와 서브쿼리의 비교를 수행하는 형태. 비교할 집단이나 조건은 서브쿼리에 명시.(메인쿼리절에는 서브쿼리 컬럼이 정의되지 않았기 때문에 에러 발생.)

인라인뷰(Inline View)

  • 쿼리 안의 뷰 형태로 테이블처럼 조회할 데이터를 정의하기 위해 사용.
  • 테이블명이 존재하지 않기 때문에 다른 테이블과 조인 시 반드시 테이블 별칭 명시.(단독으로 사용하는 경우 불필요)
  • WHERE절 서브쿼리와 다르게 서브쿼리 결과를 메인 쿼리의 어느 절에서도 사용할 수 있다.
  • 인라인뷰의 결과와 메인쿼리 테이블과 조인할 목적으로 주로 사용.
  • 모든 연산자 사용 가능.

스칼라 서브쿼리

  • SELECT 절에 사용하는 쿼리로, 마치 하나의 컬럼처럼 표현하기 위해 사용.(단, 하나의 출력 대상만 표현 가능)
  • 각 행마다 스칼라 서브쿼리 결과가 하나여야 한다. (단일행 서브쿼리 형태)
  • 조인의 대체 연산.
  • 스칼라 서브쿼리를 사용한 조인 처리 시 OUTER JOIN이 기본. (값이 없더라도 생략되지 않고 NULL로 출력)

서브 쿼리 주의 사항

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

집합 연산자

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

합집합

두 집합의 총 합(전체) 출력. UNION과 UNION ALL 사용 가능.

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

교집합

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

차집합

두 집합 사이에 MINUS 전달. 두 집합의 차집합(한 쪽 집합에만 존재하는 행) 출력. A-B  B-A 는 다르므로 집합 순서 주의.

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

  1. 두 집합의 컬럼 수 일치.
  2. 두 집합의 컬럼 순서 일치.
  3. 두 집합의 각 컬럼의 데이터 타입 일치.
  4. 각 컬럼의 사이즈는 달라도 된다.
  5. 개별 SELECT 문에 ORDER BY 전달 불가.(GROUP BY 전달 가능)
더보기

UNION 절 위에 ORDER BY 문 기입 시 에러. but, 가장 하단에 ORDER BY 기입시 UNION이 끝나고 전체 결과에 대해 정렬한다는 의미를 내포하므로 사용 가능.

그룹 함수

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

COUNT

  • 행의 수를 세는 함수.
  • 대상 컬럼은 * 또는 단 하나의 컬럼만 전달 가능. (* 사용 시 모든 컬럼의 값이 NULL일 때만 COUNT 제외)
  • 문자, 숫자, 날짜 컬럼 모두 전달 가능.
  • 행의 수를 세는 경우 NOT NULL 컬럼을 찾아 세는 것이 좋다. (PK 컬럼)

SUM

총 합 출력. 숫자 컬럼만 전달 가능.

AVG

평균 출력. 숫자 컬럼만 전달 가능. NULL을 제외한 대상의 평균을 리턴하므로 전체 대상 평균 연산 시 주의.

MIN / MAX

최소 / 최대 출력. 날짜, 숫자, 문자 모두 가능. (오름차순 순서대로 최소, 최대 출력)

VARIANCE / STDDEV

분산과 표준편차. 표준편차는 분산의 루트값.

GROUP BY FUNCTION

GROUP BY 절에 사용하는 함수. 여러 GROUP BY 결과를 동시에 출력(합집합)하는 기능. 그룹핑할 그룹을 정의.(전체 소계 등)

  1. GROUPING SETS(A, B...): A별, B별 그룹 연산 결과 출력. 나열 순서 중요하지 않다. 기본 출력에 전체 총계는 출력되지 않는다. NULL 혹은 0 사용하여 전체 총 합 출력 가능.
  2. ROLLUP(A, B): A별, (A, B)별, 전체 그룹 연산 결과 출력.나열 대상의 순서가 중요. 기본적으로전체 총 합 출력.
  3. CUBE(A, B): A별, B별, (A, B)별, 전체 그룹 연산 결과 출력. 그룹으로 묶을 대상의 나열 순서 중요하지 않다. 기본적으로 전체 총 합이 출력.

 

 

 

 

 

 

 

참고) https://www.youtube.com/watch?v=hLvv0GN0rT8&t=4127s

'SQL' 카테고리의 다른 글

SQL #15  (0) 2025.02.02
SQL #14  (0) 2025.02.02
SQL #12  (0) 2025.01.30
SQL #11  (0) 2025.01.28
SQL #10  (0) 2025.01.20