서브 쿼리 (Subquery)
- 서브 쿼리란 하나의 SQL 문안에 포함돼 있는 또 다른 SQL 문을 지칭
- 메인 쿼리가 서브 쿼리를 포함하는 종속적인 관계
- 조인은 조인에 참여하는 모든 테이블이 대등한 관계에 있기 때문에 조인에 참여하는 모든 테이블의 칼럼을 어느 위치에서라도 자유롭게 사용할 수 있는 반면 서브 쿼리는 메인 쿼리의 칼럼을 모두 사용할 수 있지만, 메인 쿼리는 서브 쿼리의 칼럼을 사용할 수 없음
- 질의 결과에 서브 쿼리 칼럼을 표시해야 할 경우 조인 방식으로 변환하거나 함수, 스칼라 서브 쿼리 등을 사용해야 함
- 서브 쿼리는 서크 쿼리 레벨과는 상관없이 항상 메인 쿼리 레벨로 결과 집합이 생성됨
- i.g. 메인 쿼리로 조직(1), 서브 쿼리로 사원(M) 테이블을 사용하면 결과 집합은 조직(1) 레벨이 됨
- SQL 문에서 서브 쿼리 방식을 사용해야 할 때 잘못 판단해 조인 방식을 사용하는 경우가 있음
- ex) 결과는 조직 레벨이고 사원 테이블에서 체크해야 할 조건이 존재한다고 가정했을 때 조인을 사용한다면 결과 집합은 사원(M) 레벨이 될 것, 이렇게 되면 원하는 결과가 아니기 때문에 SQL 문에 DISTINCT를 추가해 결과를 다시 조직(1) 레벨로 만들어야 함
- 이와 같은 상황에서는 메인 쿼리로 조직을 사용하고 서브 쿼리로 사원 테이블을 사용하여 결과 집합을 조직 레벨이 되도록 해야 함
- 서브 쿼리를 사용할 때 다음 사항에 주의해야 함
- 서브 쿼리는 괄호로 감싸서 기술
- 서브 쿠커리는 단일 행 또는 복수 행 비교 연산자와 함께 사용 가능, 단일 행 비교 연산자는 서브 쿼리의 결과가 반드시 한 건 이하이어야 하고 복수 행 비교 연산자는 서브 쿼리의 결과 건수와 상관없음
- 중첩 서브 쿼리 및 스칼라 서브 쿼리에서는 ORDER BY를 사용하지 못함
- 서브 쿼리의 종류는 동작하는 방식이나 반환되는 데이터의 형태에 따라 분류할 수 있음
- 동작하는 방식에 따라 서브 쿼리를 분류하면 아래와 같이 두 가지로 나눌 수 있음
- 서브 쿼리는 메인 쿼리 내 포함된 종속적인 관계이기 때문에 논리적인 실행 순서는 항상 메인 쿼리에서 읽힌 데이터를 서브 쿼리에서 해당 조건이 만족하는지 확인하는 방식으로 수행돼야 함
- 그러나 실제 서브 쿼리의 실행 순서는 상황에 따라 달라질 수 있음
- 반환되는 데이터의 형태에 따라 서브 쿼리는 아래와 같이 분류됨
1. 단일 행 서브 쿼리
- 서브 쿼리가 단일 행 비교 연산자(=, <, <=, >, >=, <> 등)와 함께 사용될 때는 서브 쿼리의 결과 건수가 반드시 한 건 이하이어야 함
- 만약 서브 쿼리의 결과 건수가 두 건 이상을 반환하면 SQL 문은 Runtime 오류가 발생하며 이런 종류의 오류는 컴파일 시점에 알 수 없는 오류
- 테이블 전체에 대해 집계함수를 적용할 때는 그 결과 값이 단 한 건만 생성되기 때문에 단일 행 서브 쿼리로서 사용할 수 있음
2. 다중 행 서브 쿼리
- 서브 쿼리의 결과가 두 건 이상 반환될 수 있다면, 반드시 다중 행 비교 연산자 (IN, ALL, ANY, SOME)와 함께 사용해야 하며 그렇지 않으면 SQL 문은 오류를 반환함
- 다중 행 비교 연산자는 다음과 같음
3. 다중 칼럼 서브 쿼리
- 다중 칼럼 서브 쿼리는 서브 쿼리의 결과로 여러 개의 칼럼이 반환돼 메인 쿼리의 조건과 동시에 비교되는 것을 의미
- SQL Server에서는 지원되지 않는 문법
4. 연관 서브 쿼리 (Correlated Subquery)
- 서브 쿼리 내 메인 쿼리 컬럼이 사용된 서브 쿼리
- EXISTS 서브 쿼리는 항상 연관 서브 쿼리로 사용하며 EXISTS 서브 쿼리의 특징은 아무리 조건을 만족하는 건이 여러 건이더라도 조건을 만족하는 한 건만 찾으면 추가적인 검색을 진행하지 않음
5. 그 밖의 위치에서 사용하는 서브 쿼리
가. SELECT 절에 서브 쿼리 사용하기
- 스칼라 서브 쿼리는 한 행, 한 컬럼 (1 Row, 1 Column)만을 반호나하는 서브 쿼리를 지칭
- 스칼라 서브 쿼리는 칼럼을 쓸 수 있는 대부분의 곳에서 사용할 수 있음
- 위 그림은 두 개의 SQL 문으로 구성돼 있고 선수들의 정보를 출력하는 SQL 문 (메인 쿼리)과 해당 선수의 소속팀별 평균 키를 알아내는 SQL 문 (서브 쿼리)으로 구성됨
- 여기서 선수의 소속팀별 평균 키를 알아내는 스칼라 서브 쿼리는 메인 쿼리의 결과 건수만큼 반복 수행 됨
- 스칼라 서브 쿼리 또한 단일 행 서브 쿼리이기 때문에 결과가 두 건 이상 반환될 경우 SQL 문은 오류를 반환함
나. FROM 절에서 서브 쿼리 사용하기
- FROM 절에서 사용되는 서브 쿼리를 인라인 뷰 (Inline View)라고 지칭
- 인라인 뷰를 사용하면 서브 쿼리의 결과를 마치 테이블처럼 사용 가능
- DB에 SELECT 문을 객체로서 저장해 테이블처럼 사용하는 뷰와 달리, 인라인 뷰는 쿼리 내에서 즉시 처리됨
- 인라인 뷰에서는 ORDER BY 절을 사용할 수 있음
- 인라인 뷰에 먼저 정렬을 수행하고 정렬된 결과 중에서 일부 데이터를 추출하는 것을 TOP-N 쿼리라고 함
다. HAVING 절에서 서브 쿼리 사용하기
- HAVING 절은 집계함수와 함께 사용될 때 그룹핑 된 결과에 대해 부가적인 조건을 주기 위해 사용
6. 뷰
- 테이블은 실제로 데이터를 갖고 있는 반면, 뷰는 실제 데이터를 갖고 있지 않음
- 뷰는 단지 뷰 정의 (View Definition)만을 갖고 있음
- 질의에서 뷰가 사용되면 뷰 정의를 참조해서 DBMS 내부적으로 질의를 재작성해 질의를 수행
- 뷰는 다음과 같은 장점을 가짐
- 뷰는 다음과 같이 CREATE VIEW 문으로 생성할 수 있음
- 뷰를 포함하는 뷰를 잘 못 생성하는 경우 성능상의 문제를 유발할 수 있으므로, 뷰와 SQL의 수행 원리를 잘 이해하고 사용해야 함
- 뷰를 사용하는 방법은 다음과 같음
- 뷰를 제거하기 위해서는 DROP VIEW 문을 사용해야 함
참고
SQL 전문가 가이드 2020 개정판 - 한국데이터산업진흥원
반응형
'DB > SQL 전문가 가이드' 카테고리의 다른 글
[과목 II 1장 8절] 표준 조인 (0) | 2025.03.26 |
---|---|
[과목 II 1장 7절] 조인 (0) | 2025.03.25 |
[과목 II 1장 6절] ORDER BY절 (0) | 2025.03.24 |
[과목 II 1장 5절] GROUP BY, HAVING 절 (0) | 2025.03.23 |
[과목 II 1장 4절] WHERE 절 (0) | 2025.03.23 |