
DDL (Data Definition Language)
주요 명령어
- CREATE TABLE: 테이블 생성
- ALTER TABLE: 테이블 스키마(구조) 변경 (컬럼 추가/수정/삭제 등)
- DROP TABLE: 테이블 삭제 (스키마 + 데이터 완전 삭제)
- RENAME: 테이블 이름 변경
- TRUNCATE TABLE: 데이터만 삭제 (스키마 유지)
- COMMENT: 주석 달기 (테이블, 컬럼 설명)
테이블 생성
CREATE TABLE book (
id NUMBER,
title VARCHAR2(100),
author VARCHAR2(50)
);
Subquery로 생성
CREATE TABLE empsales AS
SELECT * FROM emp
WHERE job = 'SALES';
ALTER TABLE (테이블 구조 변경)
컬럼 추가
ALTER TABLE book ADD (pubs VARCHAR2(5));
컬럼 삭제 (DROP COLUMN만 사용 가능)
ALTER TABLE book DROP COLUMN author;
컬럼 제약사항 삭제 및 추가
ALTER TABLE book
DROP CONSTRAINT store_FK;
ALTER TABLE player2
ADD CONSTRAINT player_FK
FOREIGN KEY (teamp_id) REFERENCES team(team_id);
컬럼 이름 변경
ALTER TABLE book RENAME COLUMN book_id TO book_IDFIXED;
컬럼 데이터 타입 변경
ALTER TABLE book MODIFY (title VARCHAR2(100));
RENAME TABLE
RENAME table1 TO table2;
DROP TABLE vs TRUNCATE TABLE
구분 DROP TABLE TRUNCATE TABLE
| 스키마 | 삭제됨 | 유지됨 |
| 데이터 | 삭제됨 | 삭제됨 |
| 복구 | 불가 | 불가 |
| 속도 | 느림 (DML 로그) | 빠름 (DDL 방식) |
제약 조건 정의 (Constraints)
- NOT NULL
- UNIQUE
- PRIMARY KEY
- FOREIGN KEY
- CHECK
CREATE TABLE emp (
empno NUMBER PRIMARY KEY,
ename VARCHAR2(50) NOT NULL,
deptno NUMBER REFERENCES dept(deptno)
);
DML (Data Manipulation Language)
INSERT
묵시적 방식
INSERT INTO emp VALUES (1001, 'JAMES', 'SALES', 3000);
- 테이블 생성 시 컬럼 순서대로 값을 넣음
명시적 방식 (지정된 컬럼에만 삽입, 나머지는 NULL 또는 DEFAULT 처리)
INSERT INTO emp (ename, deptno) VALUES ('MARKETING', 777);
Subquery 이용
INSERT INTO emp (deptno, dname)
SELECT deptno, dname FROM dept
WHERE location = 'SEOUL';
-- 순서와 갯수 of 선택할 컬럼들 또한 정확히 맞춰야 한다.
INSERT INTO emp (ename, deptno)
SELECT ename FROM emp_temp;
-- 오류 발생: 컬럼 수 불일치
UPDATE
기본 사용법
UPDATE emp
SET sal = sal + 100
WHERE deptno = 10;
Subquery 이용
UPDATE emp
SET sal = (SELECT MAX(sal) FROM emp)
WHERE job = (SELECT job FROM emp WHERE ename = 'SCOTT');
DELETE
기본 사용법
DELETE FROM emp
WHERE deptno = 30;
Subquery 이용
DELETE FROM emp
WHERE deptno = (
SELECT deptno FROM dept WHERE dname = 'SALES'
);
- DELETE는 테이블 스키마는 유지하고 레코드(행, 투플)만 삭제
트랜잭션과 COMMIT
DDL은 COMMIT이 필요없다 (ROLLBACK도 불가능)
- CREATE, ALTER, DROP, TRUNCATE, RENAME 등은 실행 즉시 자동 COMMIT 발생
- ROLLBACK으로 되돌릴 수 없음
DML은 수동 COMMIT 필요 → ROLLBACK 가능
-- 사원 삭제
DELETE FROM emp
WHERE deptno = 10;
-- 아직 COMMIT 안 했음
ROLLBACK; -- 삭제된 데이터 복구됨!
DML - SELECT
SELECT 문법 요소
SELECT ALL vs SELECT DISTINCT
- SELECT * → 전체 행
- SELECT DISTINCT col → 중복 제거
SELECT 별칭 (alias)
SELECT state AS alias
SELECT name "이름"
- AS 생략 가능
- 한글/공백 포함 시 큰따옴표 " " 필요 (Oracle 기준)
산술 연산 포함
SELECT name 이름, ROUND(weight * 0.4536, 2) AS kg FROM player;
문자열 결합
SELECT fname || ' ' || lname AS fullname FROM emp;
WHERE 절
WHERE col IN (...)
- 다중 배열 비교 (OR의 묶음)
SELECT * FROM emp
WHERE deptno IN (10, 20, 30);
WHERE col IN (Subquery)
SELECT * FROM emp
WHERE dno IN (
SELECT deptno
FROM department
);
- 컬럼명이 동일할 필요는 없음
- 단일 컬럼만 반환해야 하며, 데이터 타입이 호환되어야 함
WHERE col LIKE 패턴검색
SELECT name
FROM player
WHERE name LIKE '장%';
- '장%' → 장으로 시작하는 모든 이름
- '_%' → _은 한 자리, %은 0개 이상의 문자
WHERE ROWNUM
- Oracle 전용 가상 컬럼
- SELECT 결과에 순서를 매겨 상위 N개 행 추출 가능
이거 근데 ROWNUM 할때 = 3하면 안돼고 ≤ 으로 그 부등호를 써야한다.
SELECT * FROM emp
WHERE ROWNUM <= 3;
- 정렬된 결과에서 상위 N개를 추출하려면 서브쿼리를 사용해야 함:
SELECT *
FROM (
SELECT * FROM emp
ORDER BY sal DESC
)
WHERE ROWNUM <= 3;
- Oracle 12c 이상에서는 FETCH FIRST 문법도 가능:
SELECT * FROM emp
ORDER BY sal DESC
FETCH FIRST 3 ROWS ONLY;
WHERE IS NULL / IS NOT NULL
- Oracle에서는 = NULL은 절대 사용하지 않음 ❌
- NULL 값을 비교하려면 반드시 다음처럼 써야 함:
SELECT * FROM emp
WHERE mgr IS NULL;
SELECT * FROM emp
WHERE deptno IS NOT NULL;
- NULL은 값이 아예 없음을 의미하므로, 비교 연산자 =나 !=로 비교할 수 없음
'Database' 카테고리의 다른 글
| DATABASE #11. Spring X SQL X JSP Onboarding (0) | 2025.06.02 |
|---|---|
| DATABASE #9. SQL X .CSV IMPORT + TIPS (0) | 2025.05.28 |
| DATABASE #8. Mac에서 Oracle DB 부활시키기 (1) | 2025.05.11 |
| DATABASE #7. Mac X SQL 일어날 수 있는 문제 (0) | 2025.04.29 |
| DATABASE #6. SETTING SQL DEVELOPER at MAC (0) | 2025.04.28 |