Oracle vs MySQL 차이점 정리 — 문법, 함수, 시퀀스
| 항목 | Oracle | MySQL |
|---|---|---|
| 자동 증가 | SEQUENCE | AUTO_INCREMENT |
| 문자열 연결 | || | CONCAT() |
| NULL 처리 | NVL() | IFNULL() / COALESCE() |
| 페이징 | ROWNUM / FETCH FIRST | LIMIT / OFFSET |
| 날짜 함수 | SYSDATE | NOW() |
| 빈 문자열 | NULL과 동일 | NULL과 다름 |
자동 증가 키
-- Oracle
CREATE SEQUENCE user_seq START WITH 1 INCREMENT BY 1;
INSERT INTO users VALUES (user_seq.NEXTVAL, 'Hoon');
-- MySQL
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50)
);
INSERT INTO users (name) VALUES ('Hoon');
페이징 쿼리
-- Oracle 12c 이상
SELECT * FROM posts
ORDER BY created_at DESC
OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY;
-- Oracle 11g 이하
SELECT * FROM (
SELECT ROWNUM rn, t.* FROM (
SELECT * FROM posts ORDER BY created_at DESC
) t WHERE ROWNUM <= 10
) WHERE rn > 0;
-- MySQL
SELECT * FROM posts ORDER BY created_at DESC LIMIT 10 OFFSET 0;
NULL 처리
-- Oracle
SELECT NVL(phone, '미등록') FROM users;
SELECT NVL2(phone, '있음', '없음') FROM users;
-- MySQL
SELECT IFNULL(phone, '미등록') FROM users;
SELECT IF(phone IS NOT NULL, '있음', '없음') FROM users;
-- 공통 (ANSI SQL)
SELECT COALESCE(phone, mobile, '미등록') FROM users;
날짜 처리
-- Oracle
SELECT SYSDATE, TRUNC(SYSDATE), TO_CHAR(SYSDATE, 'YYYY-MM-DD') FROM DUAL;
SELECT ADD_MONTHS(SYSDATE, 1) FROM DUAL;
-- MySQL
SELECT NOW(), DATE(NOW()), DATE_FORMAT(NOW(), '%Y-%m-%d');
SELECT DATE_ADD(NOW(), INTERVAL 1 MONTH);
MERGE / UPSERT
-- Oracle MERGE
MERGE INTO users t USING (SELECT 1 id, 'Hoon' name FROM DUAL) s
ON (t.id = s.id)
WHEN MATCHED THEN UPDATE SET t.name = s.name
WHEN NOT MATCHED THEN INSERT VALUES (s.id, s.name);
-- MySQL
INSERT INTO users (id, name) VALUES (1, 'Hoon')
ON DUPLICATE KEY UPDATE name = VALUES(name);
운영 환경에서 어려워지는 지점
- Oracle과 MySQL의 차이는 기능 목록만이 아니라 운영 가정, 라이선스, 도구 문화, 엔터프라이즈 적합성까지 포함한다.
- 잘못된 비교는 어느 쪽이 “더 좋냐”를 묻고, 올바른 비교는 어떤 위험 프로필과 workload를 각각 더 잘 지지하느냐를 묻는다.
- 주변 전문성을 무시하면 기능 이점보다 마이그레이션 비용이 더 커질 수 있다.
중요한 아키텍처 결정
- workload 중요도, 운영 성숙도, 생태계 적합성, 예산 제약 기준으로 평가한다.
- SQL 기능표뿐 아니라 백업, HA, 관측성, DBA 역량을 함께 판단한다.
- 벤더 전략과 장기 지원 기대치도 아키텍처 입력값으로 본다.
실무 예시
실무적인 선택 매트릭스는 대개 이런 모양이다.
Oracle -> 강한 엔터프라이즈 통제, 성숙한 DBA 운영, 복잡한 레거시 연동
MySQL -> 넓은 범용 생태계, 낮은 비용 민감도, 상대적으로 단순한 운영 부담
피해야 할 안티패턴
- 벤치마크 헤드라인만 비교하는 것.
- 라이선스와 운영 인력 현실을 무시하는 것.
- 마이그레이션이 주로 SQL 문법 호환 문제라고 생각하는 것.
운영 체크리스트
- 기능 비교 전에 비기능 요구를 먼저 나열한다.
- 스키마 변환을 넘어선 마이그레이션 비용을 추정한다.
- 백업, 장애조치, 모니터링 도구 준비도를 평가한다.
- 팀의 실제 전문성을 냉정하게 본다.
최종 판단
Oracle 대 MySQL은 보편적 순위 문제가 아니라 맥락 결정이다. 조직이 실제로 지속 가능한 운영 모델과 비즈니스 모델을 가진 쪽이 더 나은 선택이다.
Continue Reading
다음으로 읽기 좋은 글
🗄️ Database
SQL 성능 최적화 실전 가이드
SQL 튜닝을 문장 다듬기가 아니라 workload 설계 문제로 봅니다. execution plan을 읽고, 데이터 접근량을 줄이고, 인덱스를 정직하게 설계하는 실무 기준을 정리합니다.
🗄️ Database데이터베이스 학습 경로: 입문부터 고급까지
인덱스와 쿼리 기초부터 복제, 파티셔닝, 스키마 변경 운영까지 체계적으로 배우는 데이터베이스 로드맵입니다.
📈 최신 동향PostgreSQL 18 최신 동향: 실무에서 진짜 중요한 변화
PostgreSQL 18은 단순 업그레이드 뉴스가 아닙니다. AIO, skip scan, 업그레이드 후 성능 회복, OAuth, generated columns까지 운영팀과 개발팀 모두에게 영향이 큰 변화가 들어왔습니다.
🚀 DevOpsKubernetes 심화 — HPA, Resource 관리, Pod Scheduling
Kubernetes 운영을 설정 모음이 아니라 자원 배치와 장애 복원력의 관점에서 정리합니다. requests/limits, HPA, affinity, taint, PDB, probe를 언제 어떻게 써야 하는지 실무적으로 설명합니다.
다음 탐색