서브쿼리 = 하나의 서SQL 문에 포함되어 있는 또 다른 sql 문
- 메인쿼리에 서브쿼리가 들어가 있는 종속적인 관계
- sub 쿼리는 main 쿼리의 컬럼을 사용할 수 있음 O.
- 하.지.만 main 쿼리는 sub쿼리의 컬럼 사용할 수 없음 X.
- subquery 괄호로 묶어서 사용해주기
- 단일 행 / 복수 행 비교 연산자와 함께 사용하기
- subquery애는 order by 사용 X
Scalar Subquery
- 하나의 Column 반환
- 컬럼이 리턴값이라서 SELECT 절에서 사용!!
<기본 구조>
Inline View
- 인라인뷰 서브쿼리 결과값은 Table로 인식
- 리턴값을 view table이라고 하며 테이블이라서 FROM 절에서 사용!!
- 메인쿼리에서는 인라인 뷰에서 조회한 Column 만 사용 가능
<기본 구조>
Nested Subquery (중첩 서브쿼리)
- WHERE 절에서 사용하는 서브쿼리
Nested Subquery (중첩 서브쿼리)
1. Single Row = 하나의 열을 검색하는 서브쿼리
2. Multiple Row - 하나 이상의 열을 검색하는 서브쿼리
3. Multiple Column - 하나 이상의 행을 검색하는 서브쿼리
하나의 열 column 검색 = 결과값 하나!
서브쿼리가 비교연산자( =, >, >=, <, <=, <>, !=)와 사용되는 경우,
서브쿼리는 결과값 = 한 개
<기본 구조>
주의할 점
- 결과값이 두 개 이상의 row인 경우 error!
- 괄호 없으면 error
Multiple Row 종류
IN | EXISTS | ANY | ALL
- IN = 서브쿼리 결과 중에 포함 될 때
<기본 구조>
-> column_name이 서브쿼리 중에 있다면
EXISTS = 서브쿼리 결과에 값이 있으면 반환
<기본 구조>
ANY = 서브쿼리 결과 중에 최소한 하나라도 만족한다면 (비교연산자 사용)
<기본 구조>
-> column_names를 조회할 건데 이 컬럼 이름이 any 뒤의 subquery에 있다면 조회하겠다!
- 예제)
celeb 테이블에서 이름을 조회할 건데
이 이름이 = any 서브쿼리인 snl_host 테이블의 host에 있다면!
ALL = 서브쿼리 결과를 모두 만족하면 (비교 연산자 사용)
- 예제)
any랑 subquery가 다름!!
서브쿼리 결과를 where절의 'name'이 모두 만족해야 하기 때문에 'id=1'로 조건 결과값을 하나로 제한
Multi Column Subquery (연관 서브쿼리)
= 여러 개의 컬럼 반환해주는 서브쿼리
<기본 구조>