Dev/MySQL
[MySQL] OR -> UNION
흰바다제비
2022. 6. 21. 11:25
728x90
- 같은 컬럼이 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