Database

Database #10. DDL ,DML in SQL

Frisbeen 2025. 6. 1. 19:06

 

 

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은 값이 아예 없음을 의미하므로, 비교 연산자 =나 !=로 비교할 수 없음