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 |