공부한것들을 정리하는 블로그 입니다.
ORACLE과 MYSQL의 차이점 비교 본문
* 해당 글은 계속 수정 예정입니다.
최초 작성일 2019.11.29
마지막 수정일 2023.05
# ORACLE과 MYSQL의 차이
# 문법적 차이
요즘에는 윈도우서버보다 리눅스서버를 많이 쓰다보니 MSSQL사용빈도가 많이 줄어들었습니다.
그로 인해 ORACLE , MYSQL 사용량을 증가하였습니다.
오늘은 ORACLE과 MYSQL의 차이점에 대해서 알아보겠습니다.
[KGON이라는 테이블이 있으며 컬럼명에는 USER_ID, REG_DATE, UDP_DATE가 있습니다.]
첫번째로 NULL값확인함수가 다릅니다.
즉, 컬럼값에 NULL이면 다른값으로 표시해주는 함수사용법이 다릅니다.
ORACLE에서는 NVL함수를 사용하지만 MYSQL에서는 IFNULL을 사용합니다.
ex) (ORACLE) SELECT NVL(USER_ID,'') FROM KGON
ex) (MYSQL ) SELECT IFNULL(USER_ID,'') FROM KGON
두번째로 현재날짜시간 확인하는 방법이 다릅니다.
ORACLE에서는 SYSDATE를 사용하지만 MYSQL에서는 NOW()함수를 사용합니다.
ex) (ORACLE) SELECT SYSDATE FROM DUAL;
ex) (MYSQL ) SELECT NOW() FROM DUAL;
세번째로 날짜포멧 변환방법이 다릅니다.
ORACLE에서는 날짜를 STRING으로 변경시 TO_CHAR()함수를 사용하지만 MYSQL에서는 DATE_FORMAT()함수를 사용합니다.
ex) (ORACLE) SELECT TO_CHAR(REG_DATE, 'YYYYMMDD HH24MISS') FROM DUAL;
ex) (MYSQL ) SELECT DATE_FORMAT(REG_DATE, '%Y%m%d%H%i%s') FROM DUAL;
[형식에 쓰는 영문자는 대소문자에 따라 다른값이 나올 수 있습니다.]
[%Y는 4자리년도(2017) , %y는 2자리년도(17)]
네번째로 요일변환의 숫자범위가 다릅니다.
ORACLE은 일,월,화,수,목,금,토를 1,2,3,4,5,6,7로 인식합니다.
MYSQL은 일,월,화,수,목,금,토를 0,1,2,3,4,5,6으로 인식합니다.
그렇기 때문에 요일 계산하는 경우 조심해야합니다.
오늘이 수요일인경우 ORACLE에서는 4가 반환되고 MYSQL에서는 3이 반환되기 떄문에 요일변환 사용하는 부분을 잘 확인해야합니다.
[보통 JAVASCRIPT에서 일,월,화,수,목,금,토를 0,1,2,3,4,5,6으로 쓰기 때문에 ORACLE인경우 결과값을 -1해서 반환하는 경우가 많습니다.]
ex) (ORACLE) SELECT TO_CHAR(SYSDATE, 'D') FROM DUAL; [결과값: 오늘이 수요일인경우 4를 반환]
ex) (MYSQL ) SELECT DATE_FORMAT(NOW(), '%w') FROM DUAL; [결과값: 오늘이 수요일인경우 3을 반환]
다섯번째로 문자와 문자 합치는 방법이 다릅니다.
ORACLE에서는 문자와 문자를 합칠때 '||'을 사용합니다.
MYSQL에서는 문자와 문자를 합칠때 CONCAT()함수를 사용합니다.
ex) (ORACLE) SELECT USER_ID FROM KGON WHERE USER_ID LIKE '%' || 'kgon' || '%'
ex) (MYSQL ) SELECT USER_ID FROM KGON WHERE USER_ID LIKE CONCAT('%','kgon','%')
여섯번째로 형변환방법이 다릅니다.
ORACLE에서는 TO_CHAR, TO_NUMBER을 사용하여 형을 변환하지만 MYSQL에서는 CAST를 사용하여 형을 변환합니다.
ex) (ORACLE) SELECT TO_CHAR(632) FROM DUAL
ex) (MYSQL ) SELECT CAST(1234 AS CHAR) FROM DUAL
일곱번째로 페이징처리가 다릅니다.
ORACLE은 ROWNUM을 이용하여 WHERE에서 BETWEEN으로 1~10번째자료를 나타냅니다.
MYSQL은 LIMIT를 사용하여 1~10번째자료를 나타냅니다.
ex) (ORACLE) SELECT * FROM ( SELECT ROWNUM , A.* FROM (SELECT * FROM KGON) A )WHERE ROWNUM BETWEEN 0 AND 10
ex) (MYSQL ) SELECT * FROM KGON LIMIT 0, 10
여덟번째로 시퀀스사용시 다음번호 불러오는 방법이 다릅니다.
ORACLE은 시퀀스명.NEXTVAL을 사용하지만 MYSQL은 시퀀스명.CURRVAL를 사용합니다.
이상입니다.
디비에 따라 사용하는 방법이 다르니 DB에 맞는 사용법을 숙지하여 사용하시기 바랍니다.
MYSQL에서 ORACLE로 쿼리를 변경하거나 ORACLE에서 MYSQL로 쿼리를 변경하는 경우에도 위의 차이점을 숙지하여 적용하시면 변경에 많은 도움이 됩니다.
참고 : https://kgon.tistory.com/33
# 구조적 차이 (계층구조)
오라클 : DB 서버가 통합된 하나의 스토리지를 공유하는 방식
MYSQL : DB 서버마다 독립적인 스토리지를 할당하는 방식
1. ANSI에서 표준으로 정한 DBMS 계층구조는 4계층 구조입니다.
2. MySQL은 3계층 구조입니다.
(데이터베이스와 스키마를 동의어로 취급합니다.)
MySQL은
1. 스키마와 데이터베이스를 동일시 하므로,
create database 문은 create schema 와 같습니다.
2. MySQL 에서는 테이블 하나를 생성할 때 테이블스페이스가 하나 생성되는 것이 Default 이므로
별도의 테이블스페이스를 만들지 않아도 됩니다.
3. MySQL 설치 후, 계정 만들시고, 데이터베이스(스키마)를 만드시고, 테이블을 만드는 순서로 하시면 됩니다.
3. ORACLE은 3계층 같은 4계층 구조입니다.
오라클은
1. 4계층을 따르는 것 같으나,
인스턴스 하나에 데이터베이스 하나만 만드는 독자적 제약이 있으므로
3계층 같은 4계층으로 볼 수 있습니다.
2. 오라클에서는 스키마와 사용자가 동일하지는 않지만 밀접한 관련이 있습니다.
정확하게는 사용자마다 관리하는 스키마가 존재하기에
오라클에서는 사용자를 생성할 때, 자동으로 스키마를 생성해줍니다.
그리고 그 스키마를 관리하는 건 바로 사용자입니다.
그래서 이 2가지는 함께 생각할 필요가 있습니다.
3. 그래서 오라클에서는 데이터베이스를 수동적으로 만들어주지 않는 이상은
테이블 스페이스 생성 -> 사용자(스키마) 생성 -> 테이블 생성 순서를 따릅니다.
4. 오라클은 MySQL과 다르게, 테이블스페이스를 자동 생성해주지 않으므로, 관리자가 직접 만들어줘야 합니다.
5. 오라클에서 create database문이 있기는 하지만, MySQL의 crate database문과는 다릅니다.
오라클에서 create database문은 인스턴스와 데이터베이스를 수동적으로 생성하는 것이고
MySQL의 create database문은 스키마를 생성하는 것입니다.
이는, 각 DBMS마다 계층 구조가 다르고, 동일시하는 영역이 다르기 때문에 생기는 차이입니다.
참고 : Oracle과 MySQL의 계층구조 차이 (velog.io)
# 조인 방식의 차이
오라클 : 중첩 루프 조인, 해시 조인, 소트 머지 조인 방식을 제공함.
MYSQL : 중첩 루프 조인 방식을 제공함.
# 확장성의 차이
오라클 : 별도의 DBMS을 설치해 사용할 수 없음
MYSQL : 별도의 DBMS을 설치해 사용할 수 있음
# 메모리 사용율의 차이
오라클 : 메모리 사용율이 커서 최소 수백MB 이상이 되어야 설치 가능함.
MYSQL : 메모리 사용율이 낮아서 1MB 환경에서도 설치가 가능함.
# 파티셔닝
오라클 : Local Partion Index, Global Partion Index를 지원
MYSQL : Local Partion index만 지원
# 힌트 방식
오라클 : 힌트에 문법적 오류가 있으면 힌트를 무시하고 쿼리를 수행한다.
MYSQL : 힌트에 문법적 오류가 있으면 오류를 발생시킨다.
참고 :
'DB 공부' 카테고리의 다른 글
실제 사용하는 DB쿼리 응용 (0) | 2022.01.15 |
---|---|
oracle execution plan 실행계획 순서 (0) | 2020.06.11 |
오라클 힌트(oracle hint) : FIRST_ROWS vs. FIRST_ROWS_N 그리고 Cost의 개념 (0) | 2020.05.15 |
오라클 실행계획 보는법 (0) | 2019.12.17 |
(작성중) Oracle : 협업 필터링(collaborative filtering) SQL로 작성 (0) | 2019.07.10 |
Oracle : 다건 insert (0) | 2019.07.10 |
Oracle : 계층형 쿼리 (0) | 2019.06.28 |
오라클 컬럼명으로 테이블 찾기 (0) | 2019.06.25 |