SUBQUERY

SOOYEON·2022년 12월 16일
0

SQL

목록 보기
50/54

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);

0개의 댓글