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
'Dev > MySQL' 카테고리의 다른 글
4. XtraBackup 상황별 스크립트 (0) | 2022.07.03 |
---|---|
3. XtraBackup Master-Slave 원격 백업 (0) | 2022.07.02 |
2. XtraBackup 백업과 복구, 그리고 옵션 (0) | 2022.06.29 |
1. XtraBackup 개요와 설치 (0) | 2022.06.26 |
[Oracle / MySQL] NULL 개념, 처리 (0) | 2022.06.11 |
댓글