
오라클 쿼리와 MySQL의 쿼리의 차이를 정리해보았다
다는 아니지만, 비교적 이 정도만 알아도 큰 혼선은 없어보인다
오라클이랑 다른 것 정리
데이터 타입
구분
Oracle
MySQL
비고
문자열
VARCHAR2,CHAR,CLOBVARCHAR,CHAR,TEXTVARCHAR2=VARCHAR숫자
NUMBER(p,s)DECIMAL(p,s),INT,BIGINTNUMBER는 범용적이지만 MySQL은 타입 구분 명확날짜
DATE,TIMESTAMPDATE,DATETIME,TIMESTAMPMySQL
DATE는 시간 미포함Boolean
없음(
CHAR(1)등으로 처리)BOOLEAN(실제는TINYINT(1))Oracle에선 조건문으로 대체
상세 정리
문자형
구분
Oracle
MySQL
주요 차이 및 주의점
가변 문자
VARCHAR2(n)VARCHAR(n)거의 동일. 단, MySQL은 문자셋에 따라 실제 byte 크기 달라짐 (예: UTF8MB4는 한 글자당 최대 4바이트).
고정 문자
CHAR(n)CHAR(n)동일. Oracle은 공백 패딩 포함 비교, MySQL도 기본적으로 같으나
PAD_CHAR_TO_FULL_LENGTH설정에 따라 다름.긴 문자열
CLOBTEXT/MEDIUMTEXT/LONGTEXTTEXT계열은 인덱싱 제한이 있음 (TEXT(255)형태로 prefix index 필요).바이트 기준
VARCHAR2(20 BYTE)VARCHAR(20)MySQL은 문자 기준이며 byte 지정 불가. (문자셋 따라 달라짐).
멀티바이트
NVARCHAR2VARCHAR(UTF8MB4 설정)MySQL은 별도 NVARCHAR 없음. UTF8MB4로 통일하는 것이 일반적.
숫자형
구분
Oracle
MySQL
주요 차이
일반 숫자
NUMBER(p,s)DECIMAL(p,s)기능 동일. 정밀도 유지 필요 시
DECIMAL사용.정수
NUMBER(10,0)INT,BIGINTMySQL은 정수형 크기가 고정되어 있음.
소수
NUMBER(10,2)DECIMAL(10,2)동일하게 매핑.
부호 없는 정수
없음
UNSIGNED옵션오라클엔 없음. 예:
INT UNSIGNED→ 0~42억부동소수
BINARY_FLOAT,BINARY_DOUBLEFLOAT,DOUBLE단, MySQL
FLOAT은 4바이트,DOUBLE은 8바이트로 고정.시퀀스용 ID
NUMBER+SEQUENCEINT AUTO_INCREMENTMySQL은 자동 증가 옵션으로 대체.
날짜형
구분
Oracle
MySQL
주요 차이
날짜
DATEDATEOracle
DATE는 시분초 포함, MySQLDATE는 YYYY-MM-DD만 포함.날짜시간
TIMESTAMPDATETIME/TIMESTAMPMySQL
TIMESTAMP는 timezone UTC 기준 저장.현재일시
SYSDATENOW()유사하나 타임존 설정 따라 다를 수 있음.
날짜차이
date1 - date2(일수)DATEDIFF(date1, date2)MySQL은 일 단위만 반환.
시간차
(date1 - date2)*24*60*60TIMEDIFF(t1, t2)MySQL은 시/분/초 단위 반환.
문자열→날짜
TO_DATE('2025-11-06','YYYY-MM-DD')STR_TO_DATE('2025-11-06','%Y-%m-%d')변환 포맷 다름.
함수
기능
Oracle
MySQL
비고
현재일시
SYSDATE,SYSTIMESTAMPNOW(),CURRENT_TIMESTAMP()NVL
NVL(a,b)IFNULL(a,b)COALESCE(a,b,...DECODE
DECODE(a,b,c,d)CASE WHEN a=b THEN c ELSE d ENDSUBSTR
SUBSTR()SUBSTRING()ROWNUM
ROWNUMLIMITTRUNC 날짜
TRUNC(date)DATE_FORMAT()orCAST()시퀀스
항목
Oracle
MySQL
자동 증가
CREATE SEQUENCE seq_x+seq_x.NEXTVALAUTO_INCREMENTNEXTVAL 사용
SELECT로 직접 호출 가능
불가 (
AUTO_INCREMENT는 insert시 자동 증가)페이징
항목
Oracle
MySQL
자동 증가
CREATE SEQUENCE seq_x+seq_x.NEXTVALAUTO_INCREMENTNEXTVAL 사용
SELECT로 직접 호출 가능
불가 (
AUTO_INCREMENT는 insert시 자동 증가)트랜잭션과 DML 차이
MySQL은 엔진에 따라 트랜잭션 관리가 다름
set autocommit = 0 으로 오토커밋 관리 필요
MERGE가 없으므로 INSERT … ON DUPLICATE KEY UPDATE 구문 활용
-- Oracle MERGE INTO target t USING src s ON (t.id=s.id) WHEN MATCHED THEN UPDATE SET ... WHEN NOT MATCHED THEN INSERT (...); -- MySQL INSERT INTO target (...) VALUES (...) ON DUPLICATE KEY UPDATE ...;서브쿼리, DUAL, FROM
항목
Oracle
MySQL
DUAL
필수
생략 가능 (
SELECT 1;)Alias
AS 생략 가능
AS권장 (함수명과 충돌 가능)서브쿼리
거의 동일
일부 DML 서브쿼리 제한 있음 (버전별 차이)
ALTER TABLE의 단일 문장 제한
PL/SQL
BEGIN…END 프로시저로 간단화 해야함
예외처리가 제한적
%TYPE, %ROWTYPE, CURSOR LOOP, EXCEPTION 이 없음