[SQL] 서브 쿼리

2025. 5. 21. 16:26Coding Study/데이터베이스

서브쿼리

 

  SQL 문 안에 SQL 문이 들어가는 경우 서브쿼리라고 하며

  괄호를 꼭 써줘야 한다.

SELECT i.id, i.name, AVG(star) AS Avg_star
FROM item AS i LEFT OUTER JOIN review AS r
ON r.item_id = i.id
GROUP BY i.id, i.name
HAVING avg_star < ( SELECT AVG(star) FROM review )
ORDER BY avg_star DESC;

 

 

 

review 의 갯수가 3개인 아이템을 반환하는 쿼리

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

 

Any

Any.가 WHERE 절에 사용될 때는, 서브쿼리의 결과에 있는 각 로우의 값 중 하나라도 조건을 만족하면 TRUE 를 반환>

WHERE count > Any( 서브쿼리 ) --서브쿼리의 결과값 중하나라도 조검이 맞으면 true

 

 

 

FROM 뒤에있는 서브 쿼리(*derived table) 에는 무조건 alias 를 붙어야 한다.

SELECT AVG(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 table : 서브쿼리로 생성된 테이블

 

WITH 문 사용

  WITH 문으로 서브쿼리를 통해 만든 결과물을 테이블명으로 저장 가능하다.

  이렇게 만든 임시 테이블은 CTO ( Common Table Expression, 공통테이블 표현식) 이라고 한다.  

WITH review_count_summary AS ( -- WITH 문뒤에 테이블명을쓰고 AS 서브쿼리 작성
    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 != '안드'
)

SELECT
    AVG(review_count)
FROM review_count_summary;       -- WITH 문으로 작성한 테이블명 적용

'Coding Study > 데이터베이스' 카테고리의 다른 글

Prisma /데이터베이스/ 3Tier의 개념  (2) 2025.05.22
[SQL] 기타 팁  (1) 2025.05.21
[SQL] JOIN  (0) 2025.05.21
[SQL]GROUPING  (0) 2025.05.21
SQL 명령어 (CRUD 기준)  (0) 2025.05.19