DB/SQL 전문가 가이드

[과목 II 2장 1절] 서브 쿼리

꾸준함. 2025. 3. 26. 22:53

서브 쿼리 (Subquery)

  • 서브 쿼리란 하나의 SQL 문안에 포함돼 있는 또 다른 SQL 문을 지칭
  • 메인 쿼리가 서브 쿼리를 포함하는 종속적인 관계
  • 조인은 조인에 참여하는 모든 테이블이 대등한 관계에 있기 때문에 조인에 참여하는 모든 테이블의 칼럼을 어느 위치에서라도 자유롭게 사용할 수 있는 반면 서브 쿼리는 메인 쿼리의 칼럼을 모두 사용할 수 있지만, 메인 쿼리는 서브 쿼리의 칼럼을 사용할 수 없음
    • 질의 결과에 서브 쿼리 칼럼을 표시해야 할 경우 조인 방식으로 변환하거나 함수, 스칼라 서브 쿼리 등을 사용해야 함

 

  • 서브 쿼리는 서크 쿼리 레벨과는 상관없이 항상 메인 쿼리 레벨로 결과 집합이 생성됨
    • i.g. 메인 쿼리로 조직(1), 서브 쿼리로 사원(M) 테이블을 사용하면 결과 집합은 조직(1) 레벨이 됨

 

  • SQL 문에서 서브 쿼리 방식을 사용해야 할 때 잘못 판단해 조인 방식을 사용하는 경우가 있음
    • ex) 결과는 조직 레벨이고 사원 테이블에서 체크해야 할 조건이 존재한다고 가정했을 때 조인을 사용한다면 결과 집합은 사원(M) 레벨이 될 것, 이렇게 되면 원하는 결과가 아니기 때문에 SQL 문에 DISTINCT를 추가해 결과를 다시 조직(1) 레벨로 만들어야 함
    • 이와 같은 상황에서는 메인 쿼리로 조직을 사용하고 서브 쿼리로 사원 테이블을 사용하여 결과 집합을 조직 레벨이 되도록 해야 함

 

  • 서브 쿼리를 사용할 때 다음 사항에 주의해야 함
    • 서브 쿼리는 괄호로 감싸서 기술
    • 서브 쿠커리는 단일 행 또는 복수 행 비교 연산자와 함께 사용 가능, 단일 행 비교 연산자는 서브 쿼리의 결과가 반드시 한 건 이하이어야 하고 복수 행 비교 연산자는 서브 쿼리의 결과 건수와 상관없음
    • 중첩 서브 쿼리 및 스칼라 서브 쿼리에서는 ORDER BY를 사용하지 못함

 

  • 서브 쿼리의 종류는 동작하는 방식이나 반환되는 데이터의 형태에 따라 분류할 수 있음
  • 동작하는 방식에 따라 서브 쿼리를 분류하면 아래와 같이 두 가지로 나눌 수 있음
    • 서브 쿼리는 메인 쿼리 내 포함된 종속적인 관계이기 때문에 논리적인 실행 순서는 항상 메인 쿼리에서 읽힌 데이터를 서브 쿼리에서 해당 조건이 만족하는지 확인하는 방식으로 수행돼야 함
    • 그러나 실제 서브 쿼리의 실행 순서는 상황에 따라 달라질 수 있음

 

https://itofk.tistory.com/275

 

  • 반환되는 데이터의 형태에 따라 서브 쿼리는 아래와 같이 분류됨

 

https://itofk.tistory.com/275?pidx=1

 

1. 단일 행 서브 쿼리

  • 서브 쿼리가 단일 행 비교 연산자(=, <, <=, >, >=, <> 등)와 함께 사용될 때는 서브 쿼리의 결과 건수가 반드시 한 건 이하이어야 함
    • 만약 서브 쿼리의 결과 건수가 두 건 이상을 반환하면 SQL 문은 Runtime 오류가 발생하며 이런 종류의 오류는 컴파일 시점에 알 수 없는 오류

 

  • 테이블 전체에 대해 집계함수를 적용할 때는 그 결과 값이 단 한 건만 생성되기 때문에 단일 행 서브 쿼리로서 사용할 수 있음

 

https://velog.io/@zinu/SQLD-2%EA%B3%BC%EB%AA%A9-SQL-%EA%B8%B0%EB%B3%B8-%EB%B0%8F-%ED%99%9C%EC%9A%A9-%EC%84%9C%EB%B8%8C%EC%BF%BC%EB%A6%AC-%EA%B7%B8%EB%A3%B9%ED%95%A8%EC%88%98

 

 

2. 다중 행 서브 쿼리

  • 서브 쿼리의 결과가 두 건 이상 반환될 수 있다면, 반드시 다중 행 비교 연산자 (IN, ALL, ANY, SOME)와 함께 사용해야 하며 그렇지 않으면 SQL 문은 오류를 반환함
  • 다중 행 비교 연산자는 다음과 같음

 

https://itofk.tistory.com/275?pidx=3

 

 

3. 다중 칼럼 서브 쿼리

  •  다중 칼럼 서브 쿼리는 서브 쿼리의 결과로 여러 개의 칼럼이 반환돼 메인 쿼리의 조건과 동시에 비교되는 것을 의미
  • SQL Server에서는 지원되지 않는 문법

 

 

4. 연관 서브 쿼리 (Correlated Subquery)

  • 서브 쿼리 내 메인 쿼리 컬럼이 사용된 서브 쿼리

 

 

 

  • EXISTS 서브 쿼리는 항상 연관 서브 쿼리로 사용하며 EXISTS 서브 쿼리의 특징은 아무리 조건을 만족하는 건이 여러 건이더라도 조건을 만족하는 한 건만 찾으면 추가적인 검색을 진행하지 않음

 

 

5. 그 밖의 위치에서 사용하는 서브 쿼리

 

가. SELECT 절에 서브 쿼리 사용하기

  • 스칼라 서브 쿼리는 한 행, 한 컬럼 (1 Row, 1 Column)만을 반호나하는 서브 쿼리를 지칭
  • 스칼라 서브 쿼리는 칼럼을 쓸 수 있는 대부분의 곳에서 사용할 수 있음

 

https://velog.io/@zinu/SQLD-2%EA%B3%BC%EB%AA%A9-SQL-%EA%B8%B0%EB%B3%B8-%EB%B0%8F-%ED%99%9C%EC%9A%A9-%EC%84%9C%EB%B8%8C%EC%BF%BC%EB%A6%AC-%EA%B7%B8%EB%A3%B9%ED%95%A8%EC%88%98

 

 

  • 위 그림은 두 개의 SQL 문으로 구성돼 있고 선수들의 정보를 출력하는 SQL 문 (메인 쿼리)과 해당 선수의 소속팀별 평균 키를 알아내는 SQL 문 (서브 쿼리)으로 구성됨
    • 여기서 선수의 소속팀별 평균 키를 알아내는 스칼라 서브 쿼리는 메인 쿼리의 결과 건수만큼 반복 수행 됨

 

 

 

  • 스칼라 서브 쿼리 또한 단일 행 서브 쿼리이기 때문에 결과가 두 건 이상 반환될 경우 SQL 문은 오류를 반환

 

나. FROM  절에서 서브 쿼리 사용하기

  • FROM 절에서 사용되는 서브 쿼리를 인라인 뷰 (Inline View)라고 지칭
  • 인라인 뷰를 사용하면 서브 쿼리의 결과를 마치 테이블처럼 사용 가능
  • DB에 SELECT 문을 객체로서 저장해 테이블처럼 사용하는 뷰와 달리, 인라인 뷰는 쿼리 내에서 즉시 처리됨


 

  • 인라인 뷰에서는 ORDER BY 절을 사용할 수 있음
  • 인라인 뷰에 먼저 정렬을 수행하고 정렬된 결과 중에서 일부 데이터를 추출하는 것을 TOP-N 쿼리라고 함


 

다. HAVING 절에서 서브 쿼리 사용하기

  • HAVING 절은 집계함수와 함께 사용될 때 그룹핑 된 결과에 대해 부가적인 조건을 주기 위해 사용


 

6. 뷰

  • 테이블은 실제로 데이터를 갖고 있는 반면, 뷰는 실제 데이터를 갖고 있지 않음
  • 뷰는 단지 뷰 정의 (View Definition)만을 갖고 있음
  • 질의에서 뷰가 사용되면 뷰 정의를 참조해서 DBMS 내부적으로 질의를 재작성해 질의를 수행
  • 뷰는 다음과 같은 장점을 가짐

 

https://itofk.tistory.com/275?pidx=8

 

  • 뷰는 다음과 같이 CREATE VIEW 문으로 생성할 수 있음
    • 뷰를 포함하는 뷰를 잘 못 생성하는 경우 성능상의 문제를 유발할 수 있으므로, 뷰와 SQL의 수행 원리를 잘 이해하고 사용해야 함

 

 

  • 뷰를 사용하는 방법은 다음과 같음


 

  • 뷰를 제거하기 위해서는 DROP VIEW 문을 사용해야 함


 

참고

SQL 전문가 가이드 2020 개정판 - 한국데이터산업진흥원

반응형