쿼리 안에 들어가는 또 다른 쿼리로 주 질의(main query)와 구분되는 부속 질의(sub query)이다.
➕ JOIN과 비교하였을 때, JOIN은 테이블을 합쳐서 조회하는 반면 서브쿼리는 필요한 데이터만을 조회하기 때문에 더 효율적일 수 있다.
- 괄호 안에 사용한다.
- 서브쿼리에는 세미콜론을 붙이지 않는다.
scalar : 한 방향의 ↔ vector
단일값[단일 열, 단일 행]을 반환
➡ 결괏값이 다중 행ㆍ다중 열인 경우, 에러가 발생
➡ 결과가 없다면 NULL
반복적인 SELECT로 인해 성능이 저하될 수 있다.
❔ 고객별 총 구매금액과 고객의 이름 조회
SELECT
(SELECT
FROM
WHERE )
FROM
서브쿼리 조회 결과를 뷰 형태(기존 테이블로부터 일시적으로 만들어진 가상의 테이블)로 반환하기 때문에, FROM절에서 사용하는
서브 쿼리의 결과를 하나의 테이블처럼 사용
한다고 생각하면 된다.
스칼라 서브쿼리와 달리다중 행 다중 열을 반환
할 수 있다.
❔ 회원 레벨 2인 회원들 중 판매하는 상품의 가격이 60만 원 이상인 판매자의 id, 이름, 상품명, 각 상품의 가격을 조회하고 내림차순으로 정렬하기 🔽
❔ city table에서 인구수가 2번째로 많은 도시의 id, name을 조회 / 순위 조회시 내장함수 rank() 사용하기 🔽
SELECT
별명.조회할 컬럼
FROM
(SELECT
FROM
WHERE) AS '별명'
- 주로 어떤 데이터의 존재 유무를 파악하기 위해 사용
- 작성 방법 🔽
SELECT
FROM
WHERE
연산자
서브쿼리
💡 단일행 서브쿼리 : 실행 결과가 1건 이하인 서브쿼리
➡ 일반 비교 연산자 ( =, <, > 등 ) 사용 가능
결괏값이 1개인 경우이기 때문에 연산자 '>' 사용이 가능한 모습
💡 다중행 서브쿼리 : 실행 결과로 다수의 ROW를 반환하는 서브쿼리
➡ 일반 비교 연산자 ( =, <, > 등 ) 사용 불가
: IN 연산자에 입력된 값 중에서 하나라도 일치하는 것이 있으면/없으면 리스트에 조회된다.
: 서브쿼리 결과 중에서 만족하는 값이 하나라도 존재하면/ 존재하지 않으면 참
: 서브쿼리의 결과가 모두 참이면 참 ( = AND 조건 )
최종적으로 4보다 커야 하기 때문에 만족하는 데이터가 없다.
: 서브쿼리의 결과 중에서 하나라도 참이면 참 ( = OR 조건 )
OR 조건이므로 최종적으로 2보다 큰 번호를 조회하는 것이기 때문에, 만족하는 데이터로는 3과 4가 나오게 된다
❔ city table에서 국가코드가 USA인 도시 중, ULSAN 의 인구수보다 하나라도 큰 도시의 이름과 인구수를 조회
ULSAN의 인구수 확인해 보기
ULSAN의 인구수보다 큰 결괏값들로 잘 나왔는지 확인해 본다
이미지 출처
https://dev.to/sharanjeet710/sql-sub-queries-3epc