상세 컨텐츠

본문 제목

[TIL] 0702 - UNION, IF

TIL

by ollive 2024. 7. 2. 19:43

본문

<UNION 함수 사용>

  • UNION은  select col1, col2, col3 from table1 union(all) select col1, col2, col3 from table2에 맞춰 사용한다. 
  • 이때 두 column의 갯수와 순서가 같아야 하고 데이터 형식이 일치해야한다.
    • 형식은 동일하지만 전체 자릿수, 소수 자릿수 또는 길이가 다르면 결과는 식 결합에 대한 동일한 규칙을 기반한다.
    • column명이 같지 않을 경우 alias를 사용하여 동일하게 맞춰준다.
  • UNION은 중복된 행을 하나로 표기하고 UNION ALL 중복을 제거하지 않고 모두 표기한다.
  • UNION의 SELECT에 ORDER BY 절이 포함되어 있으면, 해당 절을 모든 SELECT 문 뒤에 배치해야 한다.
  • 3개 이상의 테이블을 결합할때는 위에서 부터 차례대로 UNION이 실행된다.
    • 하지만 table1 UNION ALL (table2 UNION table3)일 경우 ( ) 안의 UNION이 먼저 실행되고 UNION ALL이 실행된다. 
  • JOIN의 경우 key를 기준으로 행을 맞춰서 데이터를 결합한다면, UNION은 column을 기준으로 열을 맞추서 결합한다.

 

온라인/오프라인 판매 데이터 통합하기

select date_format(SALES_DATE,'%Y-%m-%d'),PRODUCT_ID, USER_ID, SALES_AMOUNT
from
	# 형식을 맞춰 통합하고 조건을 걸어서 원하는 데이터를 얻음
	(SELECT ONLINE_SALE_ID, SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
	FROM ONLINE_SALE 
	UNION
	SELECT OffLINE_SALE_ID, SALES_DATE, PRODUCT_ID, NULL, SALES_AMOUNT
	FROM OFFLINE_SALE
	) a
where date_format(SALES_DATE,'%Y%m') = 202203
order by SALES_DATE, PRODUCT_ID, USER_ID
#원하는 데이터 반환한 두 자료를 UNION하여 합침
SELECT 
    SUBSTR(sales_date,1,10) sales_date
    , product_id
    , user_id
    , sales_amount
FROM ONLINE_SALE
WHERE SUBSTR(sales_date,1,7) = '2022-03'

UNION ALL

SELECT 
    SUBSTR(sales_date,1,10) sales_date
    , product_id
    -- USER_ID 값은 NULL 로 표시
    , NULL user_id
    , sales_amount
FROM OFFLINE_SALE
WHERE SUBSTR(sales_date,1,7) = '2022-03'

# ORDER BY는 UNION의 모든 SELECT문이 끝난뒤에 배치, 각각의 SELECT문에 적지 않은다
ORDER BY sales_date, product_id, user_id

 

<IF 함수 사용>

  • IF함수는 IF(조건문, 참일때 결과값, 거짓일때 결과값)으로 사용한다.
  • SELECT에 들어가야 조건값을 도출시킬 수 있다. 

https://school.programmers.co.kr/learn/courses/30/lessons/132201

SELECT PT_NAME, PT_NO, GEND_CD, AGE, if(TLNO is null, 'NONE', TLNO)
FROM PATIENT
WHERE AGE <= 12 
      AND GEND_CD = 'W'
ORDER BY AGE desc, pt_name

 

IF 가 WHERE에 들어가니 오류가 나왔다. WHERE 절에 들어가면 IF 조건을 고치는 것이 아니라 NULL인 값을 삭제하는 결과가 나온다.

SELECT PT_NAME, PT_NO, GEND_CD, AGE, TLNO
FROM PATIENT
WHERE AGE <= 12 
      AND GEND_CD = 'W'
      AND if(TLNO is null, 'NONE', TLNO)
ORDER BY AGE desc, pt_name

'TIL' 카테고리의 다른 글

[TIL] WEEK 2 FRI - DATEDIFF  (1) 2024.07.05
[TIL] WEEK 2 THUR (find_in_set)  (0) 2024.07.04
[SQL] 카테고리 별 최대값 정보 가져오기 2  (0) 2024.07.03
[TIL] SQL 세션 풀이  (0) 2024.07.03
[WIL] 1주차  (0) 2024.06.28

관련글 더보기