서브쿼리와 집합 연산자

이강용·어제

SQLD

목록 보기
12/13

다중행 서브쿼리

IN 연산자

  • IN은 서브쿼리 결과 중 어느 하나라도 일치하면 true
  • 다중 값을 OR로 연결한 것과 동일 (A IN (1,2,3) = A = 1 OR A = 2 OR A = 3)
  • ANY와 의미가 같음
  • NOT IN 결과에 NULL이 한 건이라도 있으면 결과가 0건이 되는 함정이 있음
WHERE 컬럼 IN (SELECT 컬럼 FROM 테이블 WHERE ...);
WHERE 컬럼 NOT IN (SELECT 컬럼 FROM 테이블 WHERE ...);
연산자동작
IN서브쿼리 결과 중 하나라도 일치하면 true
NOT IN서브 쿼리 결과 모두와 달라야 true. NULL 포함 시 0건 함정

ANY/SOME 연산자

  • ANY는 서브쿼리 결과 중 어느 하나라도 비교 조건을 만족하면 true
  • SOME은 ANY의 동의어이며 동일하게 동작
  • = ANY는 IN과 같음
  • > ANY는 최솟값보다 크며 true -> >MIN(서브쿼리)와 등가
  • < ANY는 최댓값보다 작으며 ture -> <MAX(서브쿼리)와 등가

ALL 연산자

  • ALL은 서브쿼리 결과의 모든 값에 대해 비교 조건을 만족해야 true
  • > ALL은 최댓값보다 커야 true -> > MAX(서브쿼리)와 등가
  • < ALL은 최솟값보다 작아야 true -> < MIN(서브쿼리)와 등가
  • <> ALL은 모든 값과 달라야 하므로 NOT IN과 등가
WHERE 컬럼 비교 연산자 ALL(SELECT 컬럼 FROM 테이블 WHERE...);

EXISTS 연산자

  • EXISTS는 서브쿼리 결과에 행이 1건이라도 존재하면 true를 반환
  • 서브쿼리의 SELECT 절은 평가되지 않으므로 관용적으로 SELECT 1로 작성
  • 메인쿼리 컬럼을 서브쿼리에서 참조하는 상호연관 형태로 자주 사용
  • NOT EXISTS는 서브쿼리 결과가 없으면 true이며, NULL의 영향을 받지 않음
WHERE EXISTS(SELECT 1 FROM 테이블 WHERE 메인.컬럼 = 서브.컬럼 ...);
WHERE NOT EXISTS(SELECT 1 FROM 테이블 WHERE 메인.컬럼 = 서브.컬럼 ...);

다중컬럼 서브쿼리

다중컬럼 서브쿼리의 개념

  • 다중컬럼 서브쿼리는 결과가 N행 M열로 반환되는 서브쿼리임
  • 메인쿼리에서 (컬럼1, 컬럼2) 형태의 컬럼 묶음으로 비교
  • 메인쿼리와 서브쿼리의 컬럼 수가 반드시 일치해야함
  • 부서별 최고 연봉자처럼 두 컬럼이 함께 의미를 가지는 경우에 사용
  • Oracle은 표준 지원하지만 SQL Server는 지원하지 않음
WHERE(컬럼1, 컬럼2) IN (SELECT 컬럼1, 컬럼2 FROM 테이블 WHERE ...);

스칼라 서브쿼리/ 인라인 뷰/ 상호연관 서브쿼리

스칼라 서브쿼리

  • 스칼라 서브쿼리는 SELECT절에 위치하여 행마다 단일 값을 함께 조회

  • 반드시 1행 1열만 반환해야 하며, 2행 이상이면 오류가 발생

  • 결과가 0행이면 NULL이 반환

  • JOIN의 대안으로 사용할 수 있으며, 한 컬럼만 가져올 때 가독성이 좋음

  • 메인쿼리 행마다 한 번씩 실행되므로 행 수가 많을수록 비용이 증가

    SELECT 컬럼,
       (SELECT 단일값 FROM 테이블 WHERE 조건) AS 별칭
     FROM 테이블;

    인라인 뷰

  • 인라인 뷰는 FROM 절의 서브쿼리이며, 결과를 임시 테이블처럼 사용

  • 별칭(Alias) 부여가 사실상 필수이며, 메인쿼리에서 별칭으로 컬럼을 참조

  • GROUP BY 집계 결과에 조건을 경우 HAVING의 대안으로 쓸 수 있음

  • TOP-N 쿼리(상위 N건 조회)는 인라인 뷰와 ROWNUM을 결합

  • 일회성 가상 테이블이며, 별도 객체로 저장되면 일반 뷰가 됨

    SELECT 컬럼
       FROM (SELECT...FROM 테이블 WHERE...) 별칭
     WHERE 조건;

상호연관 서브쿼리

  • 상호연관 서브쿼리는 서브쿼리에서 메인쿼리 컬럼을 참조하는 서브쿼리
  • 메인쿼리 행마다 서브쿼리가 한 번씩 실행되며, 행마다 다른 결과를 반환할 수 있음
  • EXISTS와 결합하여 자주 사용
  • 비상관 서브쿼리는 메인쿼리와 무관하게 한 번만 실행되고 결과를 전달
  • 성능은 비상관이 유리하나, 표현력은 상호연관이 풍부

집합 연산자

집합 연산자의 개념과 종류

  • 집합 연산자(Set Operator)는 두 개 이상의 SELECT 문 결과를 하나의 집합으로 결합하는 연산자
  • 수학의 합집합·교집합·차집합 개념을 SQL에 적용한 형태
  • 두 SELECT 결과를 수직 방향(행 기준)으로 결합
  • JOIN이 컬럼 기준 결합인 점과 구분
  • 종류는 UNION,UNION ALL,INTERSECT,MINUS(Oracle),EXCEPT(ANSI)
연산자의미중복처리정렬
UNION합집합중복제거자동 정렬 발생
UNION ALL합집합중복유지정렬 없음
INTERSECT교집합중복제거자동 정렬 발생
MINUS/EXCEPT차집합중복제거자동 정렬 발생
profile
HW + SW = 1

0개의 댓글