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 제약조건을 기본 지원하므로 데이터 무결성 확보에 적극 활용할 수 있다
'DB' 카테고리의 다른 글
| 오라클 책 정리 (0) | 2025.06.10 |
|---|---|
| 오라클 PL/SQL (0) | 2025.06.10 |
| Oracle SQL – 테이블 생성, 시퀀스, 제약조건 정리 (0) | 2025.06.05 |
| Oracle SQL 테이블 설계부터 집계함수까지 (0) | 2025.06.05 |
| Oracle 인덱스 적용 전·후 성능 비교 (0) | 2025.06.05 |