SQL/MySQL

MySQL 서브 쿼리Subquery 기초 정리

진리뷰 2023. 9. 22. 09:00
반응형

 

 

 

MySQL-서브-쿼리Subquery-기초-정리-썸네일
MySQL 서브쿼리 기초 정리

 

 

 

MySQL 서브 쿼리 개념, 사용 이유

 

'SELECT 어쩌고 FROM 어쩌고;' 같은 명령문을 우리는 쿼리라고 부르기로 했어요.

그리고 쿼리 안에 쿼리를 또 입력할 수 있는데, 쿼리 속 쿼리서브 쿼리라고 합니다.

서브쿼리 사용의 주이유는 하나의 쿼리 속에 여러 SELECT절을 때려 박으면 한 번에 처리할 수 있기 때문입니다.

보통 서브쿼리는 메인 쿼리보다 먼저 실행되지만 예외도 있습니다.

 

 

 

MySQL 서브 쿼리 사용법(문법)

 

서브쿼리는 마치 양파 껍질과 비슷합니다.

양파의 가장 겉껍질은 속에 수많은 껍질들을 감싸고 있습니다.

이때 가장 겉껍질과 같은 쿼리는 메인쿼리, Outer query이며

그리고 겉껍질 속에 있는 속껍질들은 서브쿼리, Subquery라고 합니다.

 

  • 서브 쿼리의 문법 순서는 메인 쿼리와 같습니다.

*문법 순서: SELECT-FROM-WHERE-GROUP BY-HAVING-ORDER BY

  • 서브 쿼리는 INSERT, UPDATE, DELETE문에도 사용 가능.
  • 서브 쿼리는 괄호 () 안에 사용.
  • 서브쿼리는 세미콜론 ; 생략 가능.
  • 서브쿼리는 메인 쿼리의 SELECT, FROM, WHERE, HAVING, ORDER BY절에 사용 가능.
# 메인 쿼리의 GROUP BY 절에는 서브 쿼리 사용 불가!
SELECT (서브쿼리)
FROM (서브쿼리)
WHERE (서브쿼리)
HAVING (서브쿼리)
ORDER BY (서브쿼리)

 

 

 

MySQL 서브 쿼리 예제

 

서브 쿼리 종류가 다양한데, 이와 관련된 글은 추후에 정리해 보겠습니다.

고객 정보가 담긴 customer_info, 구매 정보가 담긴 purchase_info라는 샘플 테이블들입니다.

customer_info
cust_id name tel_no
148291 Kim 01011113333
188976 Lily 01022224444
192115 Jin 01099999999
195222 Tom 01055555555

 

purchase_info
cust_id purchased product_id price
148291 2022-11-07 09:00:10+00:00 K09 52000
188976 2023-01-01 11:05:20+00:00 B10 100000
192115 2023-01-01 11:38:00+00:00 A01 40000
195222 2023-01-04 19:27:12+00:00 J12 10500

 

SELECT절 서브 쿼리(스칼라 서브쿼리) 예시입니다.

#고객 Kim의 고객 id, 연락처, 구매일
SELECT cust_id, tel_no
, (
SELECT purchased
FROM purchase_info
WHRE cust_id = '148%'
) purchased_date
FROM customer_info
WHERE name = 'Kim';
cust_id tel_no purchased
148291 01011113333 2022-11-07 09:00:10+00:00

 

FROM절 서브 쿼리(인라인 뷰) 예시입니다.

# 23년 1월 시간별 평균 수익(revenue)
SELECT
            date_purchased
           , hour_purchased
           , AVG(revenue)
FROM (
SELECT 
            DATE_FORMAT(purchased - INTERVAL 3 HOUR, '%Y-%m-%d') date_purchased
          , DATE_FORMET(purchased - INTERVAL 3 HOUR, '%H') hour_purchased
          , SUM(price) revenue
FROM purchase_info
WHERE purchased >= '2023-01-01' AND purchased < '2023-02-01'
GROUP BY 1, 2
) aaa
GROUP BY 1, 2;
date_purchased hour_purchased AVG(revenue)
2023-01-01 11 70000
2023-01-04 19 10500

 

반응형
top