코드잇/데이터베이스

SQL 서브쿼리 실습

양상추상츄 2023. 3. 4. 23:33
select * from review
where item_id in
    (
    select id from item
    where registration_date < '2018-12-31'
    );

- where절 서브쿼리

  * review 테이블의 모든 컬럼

  * 2018-12-31 이전의 review 확인

  * in 으로 review 테이블의 item_id와 item 테이블의 id가 같은게 있으면 값을 가져오게함

 

 

SELECT
	AVG(review_count),
    MAX(review_count),
    MIN(review_count)
FROM
(SELECT
	SUBSTRING(address, 1, 2) AS region,
    COUNT(*) AS review_count
    FROM review AS r LEFT OUTER JOIN member AS m
    ON r.mem_id = m.id
    GROUP BY SUBSTRING(address, 1, 2)
    HAVING region IS NOT NULL
    AND region != '안드') AS review_count_summary;

-- derived 테이블에는 반드시 alias를 붙여야함

)

인라인뷰 서브쿼리로 일시적으로 생겨난 테이블을 derived table이라고 하고

derived table에는 alias를 붙여줘야 한다.

 

 

SELECT * FROM item
WHERE id IN (SELECT item_id FROM review GROUP BY item_id HAVING COUNT(*) >= 3);

서브쿼리를 따로 빼서 실행해봐도 실행이 되면 비상관 쿼리라고 한다. (outer query와 별개로, 독립적으로 실행)

 

 

SELECT * FROM item
WHERE EXISTS (SELECT * FROM review WHERE review.item_id = item_id);

 

outer query 쿼리가 서브쿼리에 영향을 준다. 서브쿼리는 별개로 실행을 하지 못함, 이런 쿼리를 상관 서브쿼리라고함

 

이렇게 

SELECT * 
FROM member 
WHERE NOT EXISTS 
    (
        SELECT * 
        FROM review 
        WHERE review.mem_id = member.id 
     );

NOT EXISTS : 리뷰를 남기지 않은 회원 정보 확인하기

EXISTS : 리뷰를 남긴 회원정보 확인

 

 

select MAX(copang_report.price) max_price,
        AVG(copang_report.star) avg_star,
        COUNT(DISTINCT(copang_report.email)) distinct_email_count
from
(select i.price as price, 
        r.star as star,
        m.email as email
from item i inner join review r
on i.id = r.item_id inner join member m
on m.id = r.mem_id) copang_report
;

3개의 테이블 조인하여 인라인뷰, derived 테이블 생성 후 집계함수 사용하기

 

'코드잇 > 데이터베이스' 카테고리의 다른 글

CASE WHEN THEN, VIEW, 데이터베이스 현황파악  (0) 2023.03.11
SQL VIEW  (0) 2023.03.05
SQL 서브쿼리 종류  (1) 2023.02.26
SQL 여러 테이블 조인  (0) 2023.02.20
SQL COALESCE, JOIN, USING, UNION  (0) 2023.02.18