본문 바로가기
데이터베이스

Oracle(오라클) vs MySQL: 타입, 문법, SQL 쿼리 구문 차이

by 데이널 2024. 6. 22.

요즘에는 오픈소스 Database를 많이 사용하는 데요. 저도 오라클에서 MySQL로 데이터를 수집하는 프로젝트를 했는데요. 과거에는 거의 오라클 위주의 사용이었다면 PostgreSQL, MySQL도 많이 경험하게 됩니다. 
 
이번 글에서는 두 데이터베이스인 Oracle과 MySQL 간의 데이터 타입, 문법, SQL 구문 차이점에 대해 알아 보려고 합니다. 이렇게 정리해 두면 프로젝트에서도 잘 활용할 수 있을 거라 생각합니다. 
 

Oracle vs MySQL 문법 차이
Oracle vs MySQL 문법 차이

1. 데이터 타입

Oracle과 MySQL은 일부 데이터 유형은 이름과 동작이 다릅니다. 만약 오라클에 생성한 테이블들을 MySQL 데이터베이스로 인터페이스 해야 한다면 대응되는 타입으로 대체해야 할 건데요. 아래를 참고하셔서 MySQL 생성 스크립트를 작성하면 되겠습니다. 
 

구분OracleMySQL
고정 길이 문자열CHARCHAR
가변 길이 문자열VARCHAR2VARCHAR
숫자 타입NUMBERINT, FLOAT, DOUBLE, DECIMAL
날짜 타입DATE, TIMESTAMPDATE, DATETIME, TIMESTAMP
대용량 문자열 저장CLOBLONGTEXT

 

2. 시퀀스 오브젝트

1.Oracle

오라클은 숫자를 증가시키는 시퀀스 오브젝트를 만들 수 있습니다. 

CREATE SEQUENCE [시퀀스명]
START WITH [시작숫자]
INCREMENT BY [증가숫자]
[NOMAXVALUE || MAXVALUE 최대값] ← MAXVALUE는 최대값
[NOMINVALUE || MINVALUE 최소값] ← MINVALUE는 최소값
[CYCLE || NOCYCLE]  ←  기본값은 NOCYCLE , CYCLE  설정시 최대값 이후 다시 최소값부터 시작
[CACHE || NOCACHE] ←  NOCACHE 설정시 시퀀스의 캐시값을 0이 됨
;

예시) CREATE SEQUENCE ora_seq START WITH 1 INCREMENT BY 1;
SELECT 시퀀스명.NEXTVAL FROM DUAL;

 

2.MySQL

AUTO_INCREMENT를 사용하면 간단하게 생성할 수 있습니다. 하지만 시퀀스와 조합해 문자+시퀀스 조합을 만들려면 함수를 이용한 프로시져를 만들어야 하는 불편함이 있습니다. 

CREATE TABLE my_table (
  id INT AUTO_INCREMENT,
  name VARCHAR(50),
  PRIMARY KEY (id)
);

 

3. SQL 문법

Oracle을 사용하든 MySQL을 사용하든 SELECT, INSERT, UPDATE, DELETE와 같은 기본 명령은 매우 유사합니다. 문법 또한 비슷한 것이 많습니다. 그러나 이러한 명령을 사용하는 방법에는 몇 가지 중요한 차이점이 있습니다.

구분OracleMySQL
문자열 연결SELECT 'A' || 'B' FROM DUAL;

SELECT CONCAT("A", "B") FROM DUAL ; 
SELECT CONCAT("A", "B");
문자열 자르기SELECT SUBSTR(문자열, 시작위치, 자르기 길이) FROM DUAL;SELECT SUBSTRING(문자열, 시작위치, 자르기 길이);
NULL처리SELECT NVL(name, 'Unknown') FROM users;SELECT IFNULL(name, 'Unknown') FROM users;
현재 날짜 SELECT SYSDATE FROM DUAL;SELECT NOW();
개월 증가 SELECT ADD_MONTHS(SYSDATE, 1) FROM DUAL;SELECT DATE_ADD(NOW(), INTERVAL 1 MONTH);
날짜 형식 변환SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD') FROM DUAL;SELECT DATE_FORMAT(NOW(), '%Y-%m-%d');
요일변환 숫자 일,월,화,수,목,금,토를 1,2,3,4,5,6,7로 인식 일,월,화,수,목,금,토를 0, 1,2,3,4,5,6로 인식
조건식 SELECT DECODE(칼럼, TRUE값, FALSE값) FROM users;

SELECT CASE WHEN 조건식 THEN '출력값'
                          WHEN 조건식 THEN '출력값'
               ELSE '출력값'
END
SELECT IF(조건식, TRUE값, FALSE값) FROM users ;

 

4. 패이징 처리

1.Oracle

오라클은 rownum을 이용합니다. WHERE절에서 BETWEEN으로 1~15까지 가져오게 처리할 수 있습니다. 

SELECT * 
FROM (SELECT rownum, A.* 
             FROM users
            ) A
WHERE rownum BETWEEN 0 AND 15
;

 

2.MySQL

MySQL은 LIMIT를 사용합니다. LIMIT 시작위치, 가져올 데이터 건수

SELECT * FROM users LIMIT 0, 15

 

5. 형변환

Oracle에서는 형변환을 TO_NUMBER, TO_CHAR, TO_DATE를 사용하는데요. 반면, MySQL에서는 CAST를 사용하여 형을 변환합니다. 

구분OracleMySQL
형변환
(문자→ 숫자)
SELECT  TO_NUMBER('123') FROM DUAL;
SELECT CAST('123' AS UNSIGNED) FROM DUAL;

형변환
(숫자→ 문자)
SELECT TO_CHAR(123) FROM DUAL;SELECT CAST(123 AS CHAR(3));
형변환
(문자→ 날짜)
SELECT TO_DATE(' 20240418 ', 'YYYYMMDD') FROM DUAL;SELECT CAST('20240418'AS DATE);

 

마치며

오라클과 문법의 차이점을 잘 확인하셨나요? 위에서 이야기 한 사항 말고도 다른 문법이 있습니다. 그래서 ANSI SQL 문법을 사용하기를 추천합니다. 각각의 데이터베이스는 약간씩 다른 문법을 사용합니다. ANSI 문법은 모든 데이터베이스에서 사용 가능하기 때문입니다. 
 
만약 MySQL 아키텍처의 특징에 대해서 더 궁금하시다면 링크를 참고하시기 바랍니다. 
 

MySQL 아키텍처 및 특징 - Scale Out, Sharding(샤딩)

이번 포스팅에서는 데이터베이스 종류 시리즈 두번째 MySQL에 대해 알아보도록 하겠습니다. MySQL을 처음 사용하게 된것은 내 개인 홈페이지 데이터베이스였든데요. 그 시점에 오라클은 뭔가 무겁

bommbom.tistory.com