코드잇/데이터베이스
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 테이블 생성 후 집계함수 사용하기