WHERE SUBQUERY
상품 중에서 리뷰가 최소 3개 이상 존재하는 상품의 정보만 확인
SELECT *
FROM item
WHERE id IN (SELECT item_id
FROM review
GROUP BY item_id
HAVING COUNT(comment) >= 3 );
'2018년 12월 31일' 이전 사이트에 등록된 상품들에 관한 리뷰
review 테이블의 모든 컬럼들 표시
SELECT *
FROM review
WHERE item_id IN (SELECT id FROM item WHERE registration_date > '2018-12-31');
FROM SUBQUERY : Derived Table
FROM 절에서 작성되는 서브쿼리에서 만들어지는 테이블을
Derived Table
이라 한다.
= SQL문 안에서만
SELECT AVG(review_count), MAX(review_count), MIN(review_count)
FROM (SELECT
SUBSTRING(address, 1, 2) region, COUNT(*) review_count
FROM review AS R
LEFT OUTER JOIN member M
ON r.mem_id = m.id
GROUP BY SUBSTRING(address, 1, 2)
HAVING region IS NOT NULL AND region != 'xx')
AS DERIVED_TABLE;
scalar
) 서브쿼리단일값을 리턴하는 서브쿼리
WHERE 절에서 =, > 등의 조건 표현식과 비교하는 값
column
에 여러 row
들이 있는 형태의 결과를 리턴하는 서브쿼리해당 서브쿼리는 IN
, ANY(SOME)
, ALL
등의 키워드와 함께 사용할 수 있음
column
, 여러 row
)를 리턴하는 서브쿼리테이블 형태의 값을 리턴하는 서브쿼리로 일시적으로 탄생한 테이블을 derived table
이라고 한다
derived table
에는 alias
를 붙여줘야 한다는 규칙이 있음
Non-correlated Subquery
WHERE
절에 사용되는 서브쿼리는 그 자체만으로도 실행 가능한 서브쿼리, 별도 실행이 가능하다.
→ 서브쿼리가 둘러싼 outer query와 별개로, 독립적으로 실행되기 때문.
SELECT * FROM item
WHERE id IN (SELECT item_id
FROM review
GROUP BY item_id
HAVING COUNT(*) >= 3);
Correlated Subquery
outer query 와 상관 관계가 있는 서브쿼리
→ 단독으로 실행될 수 없음
SELECT * fROM item
WHERE EXISTS (SELECT * FROM review WHERE item_id = item.id);
→ 상품들 중에 리뷰가 달린 상품들만 조회
※ EXISTS
: 존재하면~
반대로 NOT EXISTS
: 존재하지 않는다면 ~
ex
member
테이블의 회원 중에서 리뷰를 하나도 남기지 않은 회원들만 조회하기
SELECT *
FROM member
WHERE NOT EXISTS
(SELECT *
FROM review
WHERE review.mem_id = member.id);