[SQL] 쿼리문 합치는 방법 (UNION/UNION ALL)

Soo·2023년 11월 3일

쿼리문을 짜다가 두 쿼리문을 합치는 방법인 UNION/UNION ALL에 대해 익히고 적용해보았는데 기록에 남겨보려고 한다.

근본적으로 UNION/UNION ALL은 앞에서 말했듯이 두 쿼리문을 합치는 방법 중 하나이다. 하지만 두 개의 차이점은 분명하게 존재한다. 차이점은 아래에 정리해보겠다.

UNION

  • 여러 쿼리문들을 합쳐서 하나의 쿼리문을 만들어주는 방법
  • 나온 결과값들의 중복 값을 제거해줌
  • 중복된 값을 제거하는 연산이 추가로 수행되기 때문에 UNION ALL보다 처리 속도가 느리다.

UNION ALL

  • UNION과 동일하게 여러 쿼리문들을 합쳐서 하나의 쿼리문으로 만들어주는 방법
  • 중복된 값들을 모두 보여줌

💡 UNION 사용 시 주의점

  • 컬럼명이 같아야 한다. (만약 같지 않을 경우, AS 사용해서 동일시 시켜주기)
  • 컬럼 별 데이터 타입이 같아야 한다.

그렇다면 어떤 식으로 사용하면 좋을까?

우선,
1. 서비스 관리자가 유저들에게 쿠폰을 지급하려고 하는데 정적쿠폰과 동적쿠폰이 존재한다.
2. 쿠폰함에 지급된 쿠폰의 사용 만료 기간이 3일 남았을 경우 푸시알림 제공을 하려고 한다.
3. 마케팅 수신 동의 "Y", 푸시 알림 동의 "Y"인 계정에 한하여 푸시 알림을 발송하고자 한다.

SELECT tuti.USER_TOKEN_ID
  FROM tb_user_info tui, tb_user_token_info tuti, tb_coupon_info tci, tb_coupon_user_info tcui 
  WHERE tui.USER_ID = tcui.USER_ID 
  AND tui.USER_ID = tuti.USER_ID 
  AND tci.COUPON_ID = tcui.COUPON_ID
  AND tci.DYNAMIC_USE_AT = 'N'
  AND DATE(DATE_ADD(tci.END_DATE, INTERVAL -4 DAY)) = DATE(NOW())
  AND tui.MARKETING = 'Y'
  AND tui.SNS_NOTI = 'Y'
  AND tuti.USE_YN = 'Y'
  AND tuti.TOKEN IS NOT NULL 
  AND tuti.DEVICE_OS IS NOT NULL 
  AND tui.WITHDRAWAL_AT = 'N'
 UNION ALL 
  SELECT tuti.USER_TOKEN_ID 
  FROM tb_user_info tui, tb_coupon_info tci, tb_coupon_dynamic_user_info tcdui, tb_user_token_info tuti
  WHERE tui.USER_ID = tuti.USER_ID 
  AND tci.COUPON_ID = tcdui.COUPON_ID
  AND tci.DYNAMIC_USE_AT = 'Y'
  AND DATE(DATE_ADD(tci.END_DATE, INTERVAL -4 DAY)) = DATE(NOW())
  AND tui.MARKETING = 'Y'
  AND tui.SNS_NOTI = 'Y'
  AND tuti.USE_YN = 'Y'
  AND tuti.TOKEN IS NOT NULL 
  AND tuti.DEVICE_OS IS NOT NULL 
  AND tui.WITHDRAWAL_AT = 'N'
  GROUP BY tuti.USER_TOKEN_ID;

위와 같이 UNION ALL을 사용해서 두 쿼리문을 합쳐서 결과 값을 출력해주었다.

profile
Soogineer's Devlog

0개의 댓글