본문 바로가기
Programming/SQL

[MySQL] 서브쿼리 설명 및 예제

by 코딩하는 금융인 2021. 7. 28.

안녕하세요.

오늘은 SQL 서브쿼리문을 어떻게 주로 사용하고 이에 대한 예제를 풀어보겠습니다.


서브쿼리(SubQuery)란?

하나의 SQL문 內 포함되어 있는 또 다른 SQL문을 지칭함. 서브쿼리는 메인쿼리에 종속적인 관계.

 

사용시 주의할 점

  1. 괄호를 감싸서 사용
  2. ORDER BY문 사용 불가
  3. 단일 행(=) 또는 복수 행(IN) 비교 연산자와 함께 사용 가능

*본 문제는 모 기업 코딩테스트에서 나온 문제를 제 방식대로 변형한 문제입니다.

 

▣ 문제. ORDERS 내에 결제 완료 이력이 있는 회원(member_no)들에 대하여 회원별 마지막 결제 완료 주문건의 쿠폰할인율 (last_dc_rate)을 구하는 쿼리를 작성하시오.

  • 쿠폰할인율 = 쿠폰할인액 주문금액
  • 단, 쿠폰을 쓰지 않은 주문건의 쿠폰할인율은 0으로 정의한다.

▣ 데이터 스키마 (orders 테이블)

▷ ORDERS : 주문 데이터 테이블

  1. order_code : 주문번호
  2. order_time : 주문일시
  3. order_pay : 주문금액
  4. pay_yn : 결제완료여부 : 'y'이면 결제 완료, 'n'이면 결제 미완료
  5. member_no : 회원번호
  6. 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문이나 서브쿼리문을 사용하면 간단히 해결할 수 있습니다.

 

서브쿼리 활용 순서

조회해야 하는 컬럼 설정 -> 조건문은 서브쿼리 테이블 -> 外 정렬이나 수식 부분은 메인쿼리에 작성

반응형

댓글