안녕하세요.
오늘은 SQL 서브쿼리문을 어떻게 주로 사용하고 이에 대한 예제를 풀어보겠습니다.
서브쿼리(SubQuery)란?
하나의 SQL문 內 포함되어 있는 또 다른 SQL문을 지칭함. 서브쿼리는 메인쿼리에 종속적인 관계.
사용시 주의할 점
- 괄호를 감싸서 사용
- ORDER BY문 사용 불가
- 단일 행(=) 또는 복수 행(IN) 비교 연산자와 함께 사용 가능
*본 문제는 모 기업 코딩테스트에서 나온 문제를 제 방식대로 변형한 문제입니다.
▣ 문제. ORDERS 내에 결제 완료 이력이 있는 회원(member_no)들에 대하여 회원별 마지막 결제 완료 주문건의 쿠폰할인율 (last_dc_rate)을 구하는 쿼리를 작성하시오.
- 쿠폰할인율 = 쿠폰할인액 주문금액
- 단, 쿠폰을 쓰지 않은 주문건의 쿠폰할인율은 0으로 정의한다.
▣ 데이터 스키마 (orders 테이블)
▷ ORDERS : 주문 데이터 테이블
- order_code : 주문번호
- order_time : 주문일시
- order_pay : 주문금액
- pay_yn : 결제완료여부 : 'y'이면 결제 완료, 'n'이면 결제 미완료
- member_no : 회원번호
- coupon_dc : 쿠폰할인액 : NA는 쿠폰을 쓰지 않았음을 의미
order_code | order_time | order_pay | pay_yn | member_no | coupon_dc |
288468 | 2017-07-10T00:00:00Z | 31000 | y | 49865 | 14200 |
132658 | 2016-05-03T00:00:00Z | 41900 | n | 310152 | 14600 |
14380 | 2015-06-10T00:00:00Z | 81850 | y | 165715 | 38700 |
664529 | 2020-05-22T00:00:00Z | 116950 | y | 20731 | (null) |
41733 | 2015-08-25T00:00:00Z | 28830 | y | 6140 | (null) |
283468 | 2017-07-14T00:00:00Z | 35000 | y | 49865 | 14000 |
▣ MySQL 풀이
SELECT member_no, round(coupon_dc/order_pay,3) AS last_dc_rate
# 서브쿼리 테이블 활용
FROM (SELECT member_no, max(order_time), order_pay, ifnull(coupon_dc,0) coupon_dc
from orders where pay_yn = 'y' group by member_no) A
- 구해야 하는 컬럼을 select문으로 조회 (member_no, last_dc_rate)
- 회원별 마지막 결제 완료 주문건을 구해야 하므로 where 조건문 : pay_yn이 결제완료(y) AND group by문 : max(order_time) 설정한 테이블을 서브쿼리문으로 만들기
- 쿠폰을 쓰지 않았을 때는 null로 들어가므로 결측치를 0으로 만들어주는 ifnull(컬럼, 결측치 변환 값 -> 0)
하나의 테이블 내에서 다양한 조건을 만족하는 값을 구하는 쿼리를 짤 때는 내부 join문이나 서브쿼리문을 사용하면 간단히 해결할 수 있습니다.
서브쿼리 활용 순서
조회해야 하는 컬럼 설정 -> 조건문은 서브쿼리 테이블 -> 外 정렬이나 수식 부분은 메인쿼리에 작성
반응형
'Programming > SQL' 카테고리의 다른 글
[SQL] 상위 n개 데이터 조회하기 (0) | 2021.08.02 |
---|---|
[SQL] null 처리하기 (조회, 대체) (0) | 2021.07.29 |
[MySQL] rank 순위 구하기 (0) | 2021.07.10 |
[MySQL] 엑셀 import & export (0) | 2021.07.08 |
[MySQL] 여러 행으로 분리하기 (구분자) (3) | 2021.07.06 |
댓글