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
반응형
'Data > MySQL' 카테고리의 다른 글
[MySQL] 컬럼추가, 컬럼의 이름 변경, 컬럼삭제, 컬럼의 데이터타입 변경 (0) | 2021.01.06 |
---|---|
[MySQL] 가상테이블을 의미하는 뷰(View)를 쓰는 이유와 생성/대체/수정/삭제 (0) | 2021.01.06 |
[MySQL] 결합 연산과 집합 연산 - UNION, UNION ALL (0) | 2021.01.05 |
[MySQL] PRIMARY KEY, FOREIGN KEY 설정하는 다양한 방법 (0) | 2021.01.04 |
[MySQL] 여러 테이블을 합쳐 하나의 테이블처럼 보이게 하는 조인의 종류(join) (0) | 2020.12.31 |