관계형 데이터베이스는 데이터를 행과 열로 된 테이블에 담고, 테이블끼리는 키 값으로 잇습니다. 이 데이터를 다루는 SQL 문장은 하는 일에 따라 데이터 조작어(DML)·데이터 정의어(DDL)·데이터 제어어(DCL)·트랜잭션 제어어(TCL) 네 종류로 나뉩니다.
여러 사람이 함께 쓰려고 한곳에 모은 데이터가 데이터베이스(database)이고, Oracle·SQL Server 같은 DBMS가 이를 만들고 관리합니다. 데이터를 표 모양으로 담는 관계형 데이터베이스(RDB)에 데이터를 묻고 바꾸는 언어가 SQL(Structured Query Language)입니다.
1테이블·행·열
EMP는 사원 6명을 행 6개에 담고, 사번(EMPNO)·이름(ENAME)·월급(SAL)·부서 번호(DEPTNO)·관리자 사번(MGR)을 열로 둡니다. 그림에서는 MGR 열을 뺐습니다. 한 열에는 같은 종류의 값만 들어갑니다. 1과목의 엔터티·인스턴스·속성이 물리 모델에서 테이블·행·열이 된 것이고, 열은 칼럼(column)이라고도 부릅니다.
2기본키와 외래키
1과목의 주식별자는 테이블에서 기본키(PK)가 되고, 관계로 받아 온 속성은 외래키(FK)가 됩니다. 두 키는 들어오는 값을 막습니다.
| 넣는 값 | 기본키 EMPNO | 외래키 DEPTNO |
|---|---|---|
| 이미 있는 값 | 막힘(ORA-00001) | 됨(20번 사원 셋) |
| NULL | 막힘(ORA-01400) | 됨(정하늘) |
| DEPT에 없는 값 | — | 막힘(ORA-02291) |
MGR도 같은 EMP의 EMPNO를 가리키는 외래키라서, 관리자 칸에는 EMP에 지금 있는 사번이나 NULL만 들어갑니다.
3SQL 문장의 네 종류
| 종류 | 다루는 것 | 명령어 |
|---|---|---|
| DML | 행을 조회하고 넣고 바꾸고 지움 | SELECT, INSERT, UPDATE, DELETE, MERGE |
| DDL | 테이블 같은 구조를 만들고 바꾸고 없앰 | CREATE, ALTER, DROP, RENAME, TRUNCATE |
| DCL | 권한을 주고 거둠 | GRANT, REVOKE |
| TCL | DML로 바꾼 것을 확정하거나 되돌림 | COMMIT, ROLLBACK, SAVEPOINT |
행을 모두 지우는 TRUNCATE와 이름을 바꾸는 RENAME은 DDL입니다. 조회만 하는 SELECT와, 넣거나 바꾸는 MERGE는 DML입니다. SAVEPOINT는 트랜잭션 안에 되돌아갈 지점을 표시합니다. Oracle은 DDL을 실행하기 전과 후에 저절로 커밋해서, DDL 앞에서 하던 DML까지 확정됩니다. GRANT·REVOKE도 Oracle에서는 실행 앞뒤에 커밋하지만, 시험에서 종류를 물으면 DCL입니다. 종류마다 DML·TCL·DDL·DCL 레슨에서 자세히 봅니다.
4이 과목의 예제 데이터
이 과목의 SQL 예제는 모두 DEPT(부서)·EMP(사원)·SALGRADE(급여 등급) 세 테이블로 돌립니다. SQL 블록마다 아래 처음 데이터에서 시작하고, 결과 표는 Oracle(Oracle AI Database 26ai — 버전 23)에서 돌린 것입니다. 행 순서는 ORDER BY(결과 행을 정렬하는 절 — ORDER BY 절 레슨에서 자세히)로 정했습니다.
SELECT *
FROM DEPT
ORDER BY DEPTNO;
| DEPTNO | DNAME | LOC |
|---|---|---|
| 10 | 기획 | 서울 |
| 20 | 개발 | 판교 |
| 30 | 영업 | 부산 |
| 40 | 인사 | 서울 |
40번 인사 부서에는 사원이 없습니다.
SELECT *
FROM EMP
ORDER BY EMPNO;
| EMPNO | ENAME | SAL | DEPTNO | MGR |
|---|---|---|---|---|
| 1001 | 김민준 | 520 | 10 | NULL |
| 1002 | 이서연 | 380 | 20 | 1006 |
| 1003 | 박지호 | 410 | 20 | 1006 |
| 1004 | 최유나 | 450 | 30 | 1001 |
| 1005 | 정하늘 | 300 | NULL | 1004 |
| 1006 | 강도윤 | 470 | 20 | 1001 |
SAL은 월급(단위 만 원)입니다. NULL(값이 없다는 표시)은 정하늘의 부서와, 맨 위 김민준의 관리자 두 칸입니다. 관리 관계는 다음과 같습니다.
- 1001 김민준
- 1004 최유나
- 1005 정하늘
- 1006 강도윤
- 1002 이서연
- 1003 박지호
- 1004 최유나
SELECT *
FROM SALGRADE
ORDER BY GRADE;
| GRADE | LOSAL | HISAL |
|---|---|---|
| 1 | 0 | 349 |
| 2 | 350 | 399 |
| 3 | 400 | 449 |
| 4 | 450 | 499 |
| 5 | 500 | 9999 |
월급이 LOSAL 이상 HISAL 이하면 그 등급입니다. SALGRADE는 조인 더 보기 레슨에서 씁니다.
예제
성과급 열 COMM을 더하고(DDL), 김민준의 SAL을 530으로 바꾼 뒤(DML), ROLLBACK(TCL)합니다.
ALTER TABLE EMP
ADD (COMM NUMBER);
UPDATE EMP
SET SAL = 530
WHERE EMPNO = 1001;
ROLLBACK;
SELECT ENAME,
SAL,
COMM
FROM EMP
WHERE EMPNO = 1001;
| ENAME | SAL | COMM |
|---|---|---|
| 김민준 | 520 | NULL |
ROLLBACK은 DML로 바꾼 SAL만 되돌려서, DDL로 더한 COMM 열은 남았습니다.
시험 포인트
- 기본키는 같은 값도 NULL도 막습니다. 외래키는 같은 값과 NULL은 받고, 가리킬 행이 없는 값을 막습니다.
- 외래키는 같은 테이블의 기본키도 가리킵니다(MGR → EMPNO).
- TRUNCATE·RENAME은 DDL, SELECT·MERGE는 DML입니다. 행을 지운다고 TRUNCATE를 DML로 고르면 틀립니다.
- Oracle은 DDL 앞뒤에서 커밋하므로 DDL은 ROLLBACK으로 되돌릴 수 없고, DDL 앞의 DML도 확정됩니다.
- GRANT·REVOKE는 DCL로 고릅니다.
확인 문제
1. 다음 일에 쓰는 SQL 문장은 각각 어느 종류일까요?
- (가) EMP에 입사일 열을 더한다
- (나) 40번 부서의 행을 지운다
- (다) KIM의 EMP 조회 권한을 거둔다
- (라) 바꾼 월급을 확정한다
정답
(가) DDL(ALTER) · (나) DML(DELETE) · (다) DCL(REVOKE) · (라) TCL(COMMIT)입니다. (나)는 40번 행만 골라 지우는 DELETE라 DML입니다. 같은 지우기라도 TRUNCATE로 테이블을 통째로 비웠다면 DDL입니다.
2. 처음 데이터의 EMP에 다음 행을 각각 따로 넣는다고 합시다. 오류가 나는 것을 고르세요.
- ①
INSERT INTO EMP VALUES (1007, '한지우', 400, 40, 1001); - ②
INSERT INTO EMP VALUES (1008, '오민재', 350, NULL, 1001); - ③
INSERT INTO EMP VALUES (1009, '윤서아', 360, 10, 2000);
정답
③입니다. MGR이 가리킬 사번 2000이 EMP에 없습니다(ORA-02291). ①의 40번 부서는 사원이 없어도 DEPT에 행이 있고, ②처럼 외래키를 비우는 것은 됩니다.
3. Oracle에서 다음을 차례로 실행하면 마지막 SELECT의 결과는 무엇일까요?
UPDATE EMP
SET SAL = 600
WHERE EMPNO = 1001;
ALTER TABLE EMP
ADD (COMM NUMBER);
ROLLBACK;
SELECT SAL
FROM EMP
WHERE EMPNO = 1001;
정답
600입니다.
| SAL |
|---|
| 600 |
ALTER TABLE 앞에서 저절로 커밋되어 UPDATE가 이미 확정됐으므로, ROLLBACK은 되돌릴 것이 없습니다.