본문 바로가기
Data/MySQL

[MySQL] 서브쿼리(SubQuery) - 외부쿼리, 내부쿼리

by prinha 2021. 1. 5.
728x90
반응형

서브쿼리(SUB QUERY)

다른 쿼리 내부에 포함되어있는 SELECT문을 의미하며

서브쿼리를 포함하고 있는 쿼리를 외부쿼리, 서브쿼리는 내부쿼리라고 부른다.

 

서브쿼리는 SELECT절, WHERE절, FROM절, HAVING절 등에서 사용할 수 있다.

 

서브쿼리의 특징

1. 서브쿼리는 쿼리를 구조화시켜 쿼리의 각 부분을 명확하게 구분할 수 있게 해준다.

2. 서브쿼리는 복잡한 JOIN이나 UNION과 같은 동작을 수행할 수 있는 또 다른 방법을 제공한다.

3. 서브쿼리는 복잡한 JOIN이나 UNION보다 좀 더 읽기 편하다.

4. 서브쿼리는 성능 저하를 일으킬 수 있다. (최적화가 많이 이루어졌으나, MySQL 5.5이하는 무조건 JOIN 이용)


1) HAVING절에 있는 서브쿼리

SELECT I.ID, I.NAME, AVG(R.STAR) AS AVG_STAR
FROM ITEM I LEFT JOIN REVIEW R
ON I.ID = R.ITEM_ID
GROUP BY I.ID, I.NAME
HAVING AVG_STAR < (SELECT AVG(STAR) FROM REVIEW)
ORDER BY AVG_STAR DESC;

 

2) SELECT절에 있는 서브쿼리 (스칼라 서브쿼리)

'스칼라 서브쿼리'라고도 하며, 반환 값은 한 개인 서브쿼리이다.

SELECT ID, NAME, PRICE,
	(SELECT AVG(PRICE) FROM ITEM) AS AVG_PRICE
FROM ITEM;

 

3) WHERE절에 있는 서브쿼리

WHERE 조건절에서 비교형태로 사용되는 서브쿼리이다.

SELECT ID, NAME, PRICE,
	(SELECT AVG(PRICE) FROM ITEM) AS AVG_PRICE
FROM ITEM
WHERE PRICE > (SELECT AVG(PRICE) FROM ITEM);
SELECT ID, NAME, PRICE
FROM item
WHERE PRICE = (SELECT MAX(PRICE) FROM ITEM);

 

SELECT * FROM item
WHERE ID IN
(
SELECT ITEM_ID
FROM REVIEW
GROUP BY ITEM_ID
HAVING COUNT(*) >=3
);

IN, NOT IN IN뒤에 오는 집합 내부에 값이 존재하는지?
ANY, SOME OR의 개념, 하나의 조건만 성립해도 TRUE
ALL AND의 개념, 모든 조건이 성립해야 TRUE

 

4) FROM절에 있는 서브쿼리 (인라인뷰)

derived table(임시 공간)에 테이블을 생성하여 사용하는 뷰와 비슷한 저장 형태의 서브쿼리이다.

오라클에서는 Inline View라고 부른다.

SELECT *
FROM
(
    SELECT SUBSTRING(ADDRESS,1,2) AS region, COUNT(*) AS review_count
    FROM REVIEW AS R LEFT 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;

 

select max(copang_report.price) as max_price, 
	avg(copang_report.star) as avg_star, 
	count(distinct(copang_report.email)) as distinct_email_count
from
(
	select i.price, r.star, m.email
	from item i inner join review r 
		on i.id = r.item_id
	inner join member m
		on m.id = r.mem_id
) as copang_report;

 

728x90
반응형