본문 바로가기

DB

Oracle과 MySQL 비교 DB 정리 (테이블 생성 ~ 조인, MyBatis)

1. 테이블 생성 기본 문법

MySQL

CREATE TABLE user (
    user_idx INT AUTO_INCREMENT PRIMARY KEY,
    id VARCHAR(20) NOT NULL,
    name VARCHAR(20) NOT NULL,
    password VARCHAR(20) NOT NULL,
    email VARCHAR(50),
    address VARCHAR(200)
);
  • AUTO_INCREMENT로 PK 자동 증가
  • 정수형 타입은 INT, BIGINT 등으로 구분

Oracle

CREATE TABLE userinfo (
    user_idx NUMBER PRIMARY KEY,
    id VARCHAR2(20) NOT NULL,
    name VARCHAR2(20) NOT NULL,
    password VARCHAR2(20) NOT NULL,
    email VARCHAR2(50),
    address VARCHAR2(200)
);
  • 숫자형은 NUMBER 하나로 통일
  • 문자열은 VARCHAR2 사용
  • AUTO_INCREMENT 없음 → 시퀀스 + 트리거 필요 (12c 이상부터는 IDENTITY 지원)

2. 스키마 지정 및 테이블 확인

  • 특정 스키마에 테이블 생성 가능
CREATE TABLE hr.employees ( ... );
  • 현재 계정의 테이블 확인
SELECT table_name FROM user_tables;

3. PK 자동 증가 구현

MySQL

AUTO_INCREMENT

Oracle (전통 방식, 11g 이하)

CREATE SEQUENCE user_seq START WITH 1 INCREMENT BY 1;

CREATE OR REPLACE TRIGGER trg_users_id
BEFORE INSERT ON users
FOR EACH ROW
BEGIN
    SELECT user_seq.NEXTVAL INTO :NEW.id FROM dual;
END;

Oracle (12c 이상)

CREATE TABLE users (
    id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    name VARCHAR2(50)
);

4. 시퀀스 사용법

CREATE SEQUENCE user_id_seq
START WITH 1
INCREMENT BY 1
NOCACHE
NOCYCLE;
  • 다음 값 사용
SELECT user_id_seq.NEXTVAL FROM dual;
  • INSERT 시 활용
INSERT INTO users (id, name)
VALUES (user_id_seq.NEXTVAL, 'Alice');
  • 목록 확인
SELECT sequence_name FROM user_sequences;
  • 상세 정보
SELECT * FROM user_sequences WHERE sequence_name = 'USER_ID_SEQ';

주의할 점

  • 시퀀스 이름은 대문자로 조회
  • INSERT 시 스키마 mismatch/오타 조심

5. 제약조건 (Constraint)

종류 설명 예시

PRIMARY KEY 유일 + NOT NULL PRIMARY KEY (deptno)
UNIQUE 중복 금지 CONSTRAINT department_dname_uk UNIQUE (dname)
NOT NULL NULL 금지 dname VARCHAR2(20) NOT NULL
FOREIGN KEY 외래키 참조 FOREIGN KEY (dept_id) REFERENCES department(dept_id)
CHECK 조건 만족 필수 CHECK (salary > 0)
DEFAULT 기본값 created_at DATE DEFAULT SYSDATE
  • 제약조건 조회
SELECT * FROM user_constraints WHERE table_name = 'DEPARTMENT';
  • 약어 의미:
    • P: Primary Key
    • U: Unique
    • C: Check
    • R: Foreign Key
  • 복합 PK
CONSTRAINT dept_pk PRIMARY KEY (deptno, loc);

6. 인덱스 (INDEX)

  • PK, UNIQUE는 자동 인덱스 생성
CREATE INDEX emp_name_idx ON employee (emp_name);
  • 확인
SELECT index_name, table_name FROM user_indexes;
  • 인덱스 사용 여부 확인
EXPLAIN PLAN FOR
SELECT * FROM employee WHERE emp_name = 'cece';

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

7. 조인 (JOIN)

  • FK는 단방향 참조만 보장 → 반대 방향 조회는 반드시 JOIN 필요
SELECT u.username, d.dept_name
FROM users u
JOIN departments d ON u.dept_id = d.id;
  • VIEW로 조인 결과 저장
CREATE VIEW employee_with_dept AS
SELECT e.emp_id, e.emp_name, d.dept_name
FROM employee e
JOIN department d ON e.dept_id = d.dept_id;
  • MV(Materialized View) 예시
CREATE MATERIALIZED VIEW emp_dept_mv
REFRESH COMPLETE
START WITH SYSDATE
NEXT SYSDATE + 1/24
AS
SELECT e.emp_name, d.dept_name
FROM employee e
JOIN department d ON e.dept_id = d.dept_id;

8. MyBatis 사용 흐름

  • 직접 SQL 작성 필요 (자동 아님)

XML 매퍼 예시:

<insert id="insertUser" parameterType="UserDto">
    INSERT INTO users (username, email, password)
    VALUES (#{username}, #{email}, #{password})
</insert>

서비스 계층:

userMapper.insertUser(new UserDto("cece", "test@naver.com", "1234"));

9. MySQL vs Oracle 비교

항목 MySQL Oracle

숫자 타입 INT 등 NUMBER
문자열 타입 VARCHAR VARCHAR2
AUTO_INCREMENT 지원 시퀀스+트리거 or IDENTITY
기본키 선언 PRIMARY KEY PRIMARY KEY
UNIQUE UNIQUE UNIQUE
CHECK 8.0부터 지원 기본 지원
DEFAULT DEFAULT DEFAULT
VIEW 지원 지원
MV 미지원 지원
트리거 지원 지원
인덱스 지원 지원 (PK/UK 자동 포함)

 

  • Oracle은 테이블/컬럼명이 기본적으로 대문자 저장 → 조회 시 대문자 사용
  • 시퀀스 값은 반드시 NEXTVAL로 사용 (CURRVAL은 최초 호출 불가)
  • PK는 UNIQUE + NOT NULL 조합 → 하나만 가능
  • UNIQUE는 NULL 허용, PK는 불가
  • VIEW/MV 적극 활용 시 조인 성능 최적화 가능
  • MyBatis는 반드시 직접 SQL 작성 → 쿼리 작성 능력이 실무 경쟁력

처음 MyBatis를 접했을 때 단순 save() 같은 ORM 느낌일 줄 알았는데, 직접 SQL을 써야 한다는 게 차이점

시퀀스 생성 시 NOCYCLE, NOCACHE 옵션은 실제 운영 환경에서 자주 쓰이는 부분이다
 Oracle은 CHECK 제약조건을 기본 지원하므로 데이터 무결성 확보에 적극 활용할 수 있다