| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- 클린아키텍처
- 이펙티브자바
- 코딩테스트
- 배낭문제
- Transactional
- thymeleaf
- Java
- JPA
- 캐시
- Garbage Collection
- 파이썬
- cache
- 알고리즘
- 동시성처리
- 자바
- collapse
- Spring Security
- interceptor
- JVM
- spring
- EffectiveJava
- @Transactional
- 타임리프
- lombok
- BFS
- effective java
- EntityGraph
- AOP
- 멱등성
- TDD
- Today
- Total
Jinnie devlog
Oracle to Mysql 마이그레이션 문법 본문
Oracle to Mysql (MariaDB) 쿼리변환 작업
Oracle 쿼리를 Mysql 쿼리로 변환하는 프로젝트에 참여했었다. 작업했던 내용들을 기억하기 위해 작성하는 쿼리 전환 작업 문법 정리
1. NVL() -> IFNULL()
IFNULL( expression1, expression2 ) : expression1이 NULL이 아니면 expression1을, NULL이면 expression2를 반환
- ORACLE
SELECT NVL(USER_ID, ‘’) FROM TABLE
- MYSQL
SELECT IFNULL(USER_ID, ‘’) FROM TABLE
2. NVL2() -> CASE WHEN ~ THEN ~ END
- ORACLE
NVL2(문자열,’ ‘)
- MYSQL
CASE WHEN 문자열 IS NULL THEN ‘Y’ ELSE ‘N’ END
CASE WHEN 문자열 IS NOT NULL THEN ‘N’ ELSE ‘Y’ END
3. SYSDATE -> SYSDATE(), NOW()
현재 날짜, 시간 확인
- ORACLE
SELECT SYSDATE FROM DUAL
- MYSQL
SELECT NOW() FROM DUAL
4. TO_CHAR() -> DATE_FORMAT()
날짜 포멧 변환
- ORACLE
SELECT TO_CHAR(REG_DATE, ‘YYYYMMDD HH24MISS’) FROM DUAL
- MYSQL
SELECT DATE_FORMAT(REG_DATE,’%Y%m%d%H%i%s’) FROM DUAL
5. 요일 변경
요일변환의 숫자범위
- ORACLE
일~토 : 1~7 (결과값: 오늘이 수요일인 경우 4를 반환)
- MYSQL
일~토 : 0~6 (결과값: 오늘이 수요일인 경우 3을 반환)
6. || -> CONCAT()
문자와 문자 합치는 방법
- ORACLE
SELECT USER_ID FORM TABLE WHERE USER_ID LIKE ‘%’ || ‘JIEUN’ || ’%’
- MYSQL
SELECT USER_ID FROM TABLE WHERE USER_ID LIKE CONCAT(‘%’,’JIEUN’,’%’)
7. TO_CHAR, TO_NUMBER -> CAST
형변환 방법
숫자에서 문자
- ORACLE
SELECT TO_CHAR(123) FROM DUAL
- MYSQL
SELECT CAST(123 AS CHAR) FROM DUAL
문자에서 숫자
- ORACLE
SELECT TO_NUMBER(‘123’) FROM DUAL
- MYSQL
SELECT CAST(‘123’ AS INTEGER) FROM DUAL
8. ROWNUM -> LIMIT
rownum이 조건으로 사용될 경우 limit 사용
- ORACLE - ROWNUM>=5
- MYSQL - LIMIT 5
rownum이 컬럼으로 사용될 경우 (MariaDB)
- ORACLE - ROWNUM()
- MYSQL - ROW_NUMBER() OVER()
9. TRUN() -> DATE()
날짜 데이터 시,분,초 제외 한 년,월,일만 출력
- ORACLE
TRUN(SYSDATE)
- MYSQL
TRUNCATE(NOW(),1) ( MariaDB는 DATE(SYSDATE()) )
10. 시퀀스.NEXTVAL -> NEXTVAL(‘시퀀스’)
시퀀스의 다음 값 출력
- ORACLE
SELECT SEQ.NEXTVAL FROM DUAL
- MYSQL
SELECT NEXTVAL(‘SEQ’) FROM DUAL (MARIADB는 ‘’ 제거하고 사용)
11. TO_DATE() -> STR_TO_DATE()
- ORACLE
TO_DATE(‘18/05/2021 00:00:00’, ‘MM/DD/YYYY HH24:MI:SS’)
- MYSQL
STR_TO_DATE(‘18/05/2021 00:00:00’, ‘%m/%d/%Y %H:%i:%s’)
12. Subquery alias
서브쿼리에 alias가 없다면 붙여준다
- ORACLE
SELECT A, B FROM (SELECT A, B FROM TABLE)
- MYSQL
SELECT T.A, T.B FROM (SELECT A, B FROM TABLE) T
13. DELETE -> DELETE FROM
ORACLE에서는 FROM을 생략 가능하지만, MYSQL에서는 필수
- ORACLE
DELETE TABLE WHERE ~
- MYSQL
DELETE FROM TABLE WHERE ~
14. DECODE문 -> CASE문
문자열을 비교대상과 비교하여 참일 때와 거짓일 때의 값을 표시
- ORACLE - DECODE(문자열,비교대상,참일때 값, 거짓일때 값)
- MYSQL - CASE WHEN 문자열=비교대상 THEN 참일때 값 ELSE 거짓일때 값 END
15. SUBSTR() 0 -> 1
시작이 0일 경우 1로 변환
- ORACLE - SUBSTR(문자열,0,3)
- MYSQL - SUBSTR(문자열,1,3)
16. 암호화, 복호화
암호화
- ORACLE - DAMO.ENCRYPT_VAR(‘AES128_FULL’,’평문 값’,’’)
- MYSQL - DAMO.ENC_B64(‘AES256_FULL’,’평문 값)
복호화
- ORACLE - DAMO.DECRYPT_VAR(‘AES128_FULL’,’암호화 값’,’’)
- MYSQL - DAMO.DEC_B64(‘AES256_FULL’,’암호화 값’)
17. LISTAGG() -> GRUP_CONCAT()
컬럼의 ROW 데이터를 한줄로 나열한 뒤 구분자로 구분하여 표시
- ORACLE
LISTAGG(나열할 컬럼,’구분자’) WITHIN GROUP(ORDER BY 컬럼)
- MYSQL
GROUPB_CONCAT(나열할 컬럼 ORDER BY 컬럼 SEPARATOR ‘구분자’)
18. OUTER JOIN 변경
LEFT OUTER JOIN
- ORACLE
SELECT * FROM T1,T2 WHERE T1.I1=T2.I2(+)
- MYSQL
SELECT * FROM T1 LEFT OUTER JOIN T2 ON T1.I1=T2.I2
RIGHT OUTER JOIN
- ORACLE
SELECT * FROM T1,T2 WHERE T1.I1(+)=T2.I2
- MYSQL
SELECT * FROM T1 RIGHT OUTER JOIN T2 ON T1.I1=T2.I2
19. START WITH CONNECT BY -> RECURSIVE
계층형 함수로 만들기 위해 WITH RECURSIVE를 사용하여 테이블 생성
20. MERGE INTO -> INSERT, UPDATE
조건이 맞는지 (MATCHED)에 대한 SELECT 문을 실행시켜서 결과값이 있으면 UPDATE문 실행, 결과값이 없으면 INSERT문 실행
- ORACLE
MERGE INTO TABLE USING DUAL ON (MATCHED 조건)
THEN 조건이 참일때 수행할 쿼리(INSERT OR UPDATE)
WHEN NOT MATCHED THEN 조건이 거짓일때 수행할 쿼리 (INSERT OR UPDATE)

- MYSQL
INSERT문 ON DUPLICATE KEY UPDATE (UPDATE 할 항목들)

MYSQL에서는 INSERT INTO 구문을 수행한 뒤 KEY 값이 중복된 경우 UPDATE문이 실행된다.
PK 값이 중복되어야만 UPDATE문이 실행되므로 INSERT가 2번 되면 PK가 정상적으로 등록이 되었는지 확인하여야 한다.
'DB' 카테고리의 다른 글
| 캐시(Cache)와 Redis (0) | 2023.05.08 |
|---|