Def) 서브 쿼리: SQL문 (주로 SELECT문) 안에 포함되는 SELECT문
- 질의문 / 갱신문 위치에 사용가능하다.
1. 주의 사항
1) 컬럼참조 시 주의 사항: 메인쿼리에서 볼 때, 서브쿼리는 블랙 박스
- inline view(FROM절 서브쿼리)의 경우, 메인쿼리는 inline view의 컬럼을 자유롭게 참조한다.
2) ORDER BY절 사용 제한
- WHERE절 서브쿼리에서는 ORDER BY절을 사용하지 못한다.
- inline view의 경우, 사용 가능.
- WHERE절 서브쿼리
1) 단일값 서브쿼리 (scalar sunquery)
2) 다중값 서브쿼리 (column subquery): ANY | SOME | ALL
3) 다중행 서브쿼리 (table subquery): 여러 개의 투플이 나온다.
Ex) 다중행 서브쿼리
- [NOT] IN: 서브쿼리 결과에 존재하는 투플과 동일한 투플의 존재 여부를 확인 ( "=ANY", "=SOME" 대체가능)
- [NOT] EXISTS: 서브쿼리 결과를 만족하는 투플의 존재 여부 확인, 조건을 만족하는 투플을 최초 1개만 찾는다.
-> EXISTS는 항상 연관 서브쿼리
- 동작하는 방식에 따른 분류
1) 비연관 서브쿼리 (uncorrelated subquery): 메인쿼리와 서브쿼리의 테이블이 다르다.
2) 연관 서브쿼리 (correlated subquery): 서브쿼리에 메인 쿼리 테이블의 컬럼이 사용된다. 메인쿼리 테이블의 부분 집합이다.
Ex) 비연관 다중값 서브쿼리: SELECT문이 단일값의 집합일 경우, 반드시 그 앞에 ANY / SOME/ ALL 중 하나를 써야한다.
Ex) 비연관 다중행 서브쿼리
Ex) 연관 다중값 서브쿼리: 메인쿼리 테이블 각각의 투플마다 "조인 조건으로 선택(filtering)된 서브쿼리 투플 집합"에 대해 서브쿼리를 실행한다.
Note) 교집합, 차집합(AND / AND NOT)은 연산 서브쿼리로 나타낼 수 있다.
2. 연관 서브쿼리와 조인의 차이
- 조인은 두 테이블의 Cartesian product의 부분 집합을 리턴한다.
-> 두 테이블이 대등한 관계이므로 select절에서 컬럼을 자유롭게 사용 가능
- 연관 서브 쿼리를 포함한 메인쿼리는 메이쿼리 테이블의 부분 집합을 리턴한다.
3. WHERE절 이외의 서브쿼리
1) Scalar Subquery (SELECT절 서브쿼리) : 새로운 컬럼을 생성하기위해 사용한다.
2) Inline View (FROM절 서브쿼리) : 임시 테이블을 생성한다.
- 다중행 서브쿼리
- WITH절과 기능이 동일하다.
- FROM절 안에 ORDER BY절을 사용가능하다.
- MySQL에서는 FROM절 서브쿼리에 반드시 Alias를 사용해야한다.
3) HAVING 절 서브쿼리
4. 질의문(SELECT문) 서브쿼리의 용도
1) 테이블 필터로 사용 (WHERE절 서브쿼리)
2) 새로운 컬럼을 생성 (SELECT절 서브쿼리)
3) 임시테이블을 생성 (FROM절 서브쿼리)
본 게시글은 프로그래머스의 "학교 밖에서 듣는 전공 필수SQL/DB Essentials" 강의 내용을 토대로 업로드 했습니다.
(코드리뷰 개선 과정)
'컴퓨터 과학 > [프로그래머스] SQL DB Essentials' 카테고리의 다른 글
[5주차] 강의노트 SubQuery & DDL (0) | 2022.03.26 |
---|---|
Chapter 10 DDL : 무결성 유지 메카니즘, 뷰와 데이터 사전 (0) | 2022.03.23 |
[4주차] 강의노트 DML(다중 테이블 쿼리) (0) | 2022.03.19 |
Chapter 08 DML : 조인 연산을 사용한 검색문 (다중 테이블 검색문) (0) | 2022.03.13 |
Chapter 07 DML : 집합과 조인 연산을 사용한 검색문 (다중 테이블 검색문) (0) | 2022.03.12 |