요즘에는 오픈소스 Database를 많이 사용하는 데요. 저도 오라클에서 MySQL로 데이터를 수집하는 프로젝트를 했는데요. 과거에는 거의 오라클 위주의 사용이었다면 PostgreSQL, MySQL도 많이 경험하게 됩니다.
이번 글에서는 두 데이터베이스인 Oracle과 MySQL 간의 데이터 타입, 문법, SQL 구문 차이점에 대해 알아 보려고 합니다. 이렇게 정리해 두면 프로젝트에서도 잘 활용할 수 있을 거라 생각합니다.
1. 데이터 타입
Oracle과 MySQL은 일부 데이터 유형은 이름과 동작이 다릅니다. 만약 오라클에 생성한 테이블들을 MySQL 데이터베이스로 인터페이스 해야 한다면 대응되는 타입으로 대체해야 할 건데요. 아래를 참고하셔서 MySQL 생성 스크립트를 작성하면 되겠습니다.
구분 | Oracle | MySQL |
고정 길이 문자열 | CHAR | CHAR |
가변 길이 문자열 | VARCHAR2 | VARCHAR |
숫자 타입 | NUMBER | INT, FLOAT, DOUBLE, DECIMAL |
날짜 타입 | DATE, TIMESTAMP | DATE, DATETIME, TIMESTAMP |
대용량 문자열 저장 | CLOB | LONGTEXT |
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와 같은 기본 명령은 매우 유사합니다. 문법 또한 비슷한 것이 많습니다. 그러나 이러한 명령을 사용하는 방법에는 몇 가지 중요한 차이점이 있습니다.
구분 | Oracle | MySQL |
문자열 연결 | 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를 사용하여 형을 변환합니다.
구분 | Oracle | MySQL |
형변환 (문자→ 숫자) | 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 아키텍처의 특징에 대해서 더 궁금하시다면 링크를 참고하시기 바랍니다.
'데이터베이스' 카테고리의 다른 글
PostgreSQL vs MySQL, 오픈소스 db 뭐가 더 좋을까? (0) | 2024.07.02 |
---|---|
MySQL 명령어 완벽정리, 누구나 쉽게 따라하기 (0) | 2024.06.27 |
정규화 과정과 원칙: 쉬운 예시로 1, 2, 3정규형 이해하기 (0) | 2024.06.20 |
NULL의 개념, 공백 문자(" "), NA, NaN과 차이점은 뭘까? (0) | 2024.06.19 |
데이터베이스 정규화 목적, 왜 해야할까? (0) | 2024.06.15 |