본문 바로가기
Dev/MySQL

[MySQL] OR -> UNION

by 흰바다제비 2022. 6. 21.
728x90
  1. 같은 컬럼이 OR 조건으로 걸려있을 때 UNION 변환
SELECT *
FROM TABLE
WHERE FIELD1 = 'VALUE' AND (FIELD2 <= 500 OR FIELD2 >= 3000)

 

SELECT * FROM TABLE WHERE FIELD1 = 'VALUE' AND FIELD2 <= 500
UNION ALL
SELECT * FROM TABLE WHERE FIELD1 = 'VALUE' AND FIELD2 >= 3000) T

같은 컬럼이 2개의 값을 가지고 있지 않으므로 중복되는 값이 발생하지 않아 UNION ALL을 사용하여 바꿔준다.

 

 

2. 서로 다른 컬럼이 OR 조건으로 걸려있을 때 UNION 변환

중복되는 값이 발생할 수 있으므로

(1) 중복되지 않는 집합을 조건에 걸리게 하거나,
(2) UNION ALL 이 아닌 UNION을 사용한다.

SELECT *
FROM TABLE
WHERE FIELD1 = 'VALUE' AND (FIELD2 >= 1000 OR FIELD3 >= 3000)

 

SELECT * FROM TABLE WHERE FIELD1 = 'VALUE' AND FIELD2 >= 1000
UNION
SELECT * FROM TABLE WHERE FIELD1 = 'VALUE' AND FIELD3 >= 3000) T

 

+) ORACLE과 달리 MySQL은 OR 조건이 걸려있는 경우 하나의 인덱스만 탄다.

이 경우, UNION으로 바꿔주어 두 개의 인덱스 모두 탈 수 있도록 변경한다.

 


 

OR → UNION 변경 예시

  • OR
SELECT *
FROM TEST.EXAMPLE1 T
WHERE T.STAT1 = 'C99'
AND T.STAT2 = 'A'
AND (T.NO IN (
			SELECT NO
			  FROM TEST.EXAMPLE2
			 WHERE CD = 'A' AND NAME LIKE CONCAT('안지', '%')
		   )
	    OR T.NO IN (SELECT NO
			   FROM TEST.EXAMPLE1 
			   WHERE USER_NO_2 IN (SELECT USER_NO
						FROM TEST.USER
						WHERE USE_YN = 'Y'
						 AND EMP_NM LIKE CONCAT('안지', '%')
			  )
		)
	)
;
  • UNION
SELECT *
FROM TEST.EXAMPLE1 T
WHERE T.STAT1 = 'C99'
AND T.STAT2 = 'A'
AND T.NO IN (
	SELECT NO
	  FROM TEST.EXAMPLE2
	 WHERE CD = 'A' AND NAME LIKE CONCAT('안지', '%')
	)
UNION
SELECT *
FROM TEST.EXAMPLE1 T
WHERE T.STAT1 = 'C99'
AND T.STAT2 = 'A'
AND T.NO IN (SELECT NO
	   FROM TEST.EXAMPLE1 
	   WHERE USER_NO_2 IN (SELECT USER_NO
				FROM TEST.USER
				WHERE USE_YN = 'Y'
				 AND EMP_NM LIKE CONCAT('안지', '%')
	  )
);
728x90

댓글