데이터베이스 구축 4강. SQL DDL과 DML
SQL은 원래 이름이 SEQUEL이었습니다. 상표 분쟁으로 이름을 줄여야 했죠. 정작 이 언어가 살아남은 이유는 이름이 아니라, 어떻게가 아니라 무엇을 묻는 언어였기 때문입니다.
풀고 시작
세 갈래로 나뉘는 명령
SQL은 1970년대 IBM에서 태어났습니다. 처음 이름은 SEQUEL이었는데 이미 같은 이름의 상표가 있어 SQL로 줄였죠. 이 언어가 반세기를 살아남은 이유는 절차가 아니라 결과를 기술하기 때문입니다. 어떻게 찾아오라고 시키지 않고, 무엇을 원하는지만 적으면 최적화기가 방법을 고릅니다.
명령은 셋으로 나뉩니다. 이 분류가 매회 출제됩니다.
| 갈래 | 명령 | 하는 일 |
|---|---|---|
| DDL (정의어) | CREATE, ALTER, DROP, TRUNCATE | 테이블·뷰·인덱스 같은 구조를 만들고 바꾸고 지운다 |
| DML (조작어) | SELECT, INSERT, UPDATE, DELETE | 데이터를 조회하고 넣고 고치고 지운다 |
| DCL (제어어) | GRANT, REVOKE, COMMIT, ROLLBACK | 권한을 주고 뺏고, 트랜잭션을 확정하거나 되돌린다 |
DROP과 DELETE와 TRUNCATE의 차이가 함정으로 나옵니다. DROP은 테이블 구조 자체를 없애고, DELETE는 구조는 두고 행만 지우며(조건을 걸 수 있고 롤백이 가능합니다), TRUNCATE는 구조는 두고 모든 행을 한꺼번에 비웁니다. 셋 다 "지운다"고 옮겨지지만 지우는 대상과 되돌릴 수 있는지가 다릅니다.
DROP에 붙는 두 옵션도 자주 나옵니다. CASCADE는 참조하는 것까지 함께 지우고, RESTRICT는 참조하는 것이 있으면 삭제를 거부합니다.
SELECT의 뼈대와 실행 순서
조회문의 기본 뼈대는 이렇습니다. 무엇을 뽑을지 SELECT에, 어디서 뽑을지 FROM에, 어떤 조건으로 거를지 WHERE에, 무엇으로 묶을지 GROUP BY에, 묶은 결과를 다시 거를 조건을 HAVING에, 정렬 기준을 ORDER BY에 적습니다.
여기서 시험이 좋아하는 함정이 WHERE와 HAVING의 차이입니다. WHERE는 묶기 전 개별 행을 거르고, HAVING은 묶은 뒤 그룹을 거릅니다. 그래서 집계 함수를 조건에 쓰려면 반드시 HAVING을 써야 합니다. 부서별 평균 급여가 300만 원 넘는 부서를 찾는다면 조건은 HAVING에 들어갑니다.
집계 함수는 COUNT, SUM, AVG, MAX, MIN 다섯이 나옵니다. 여기에도 함정이 있습니다. COUNT(컬럼명)은 널 값을 세지 않지만 COUNT(별표)는 행 전체를 셉니다. SUM과 AVG도 널을 무시하고 계산합니다. 널이 0으로 취급되지 않는다는 점이 핵심이죠.
널을 다루는 조건도 정해져 있습니다. 등호로 널과 비교하면 참이 되지 않습니다. IS NULL과 IS NOT NULL을 써야 합니다.
WHERE에 쓰는 연산자도 정리해 두시죠. 범위는 BETWEEN, 목록은 IN, 패턴은 LIKE입니다. LIKE의 와일드카드는 임의의 여러 글자를 뜻하는 백분율 기호와 임의의 한 글자를 뜻하는 밑줄입니다.
데이터를 넣고 고치고 지우기
INSERT INTO 테이블명 VALUES ... 형태로 행을 넣습니다. 컬럼 목록을 명시하면 그 컬럼에만 값이 들어가고 나머지는 기본값이나 널이 됩니다.
UPDATE 테이블명 SET 컬럼 = 값 WHERE 조건 형태로 고칩니다. 여기서 가장 흔한 사고가 WHERE를 빠뜨리는 것입니다. 조건이 없으면 모든 행이 바뀝니다. 실무에서 사람을 식은땀 흘리게 하는 그 명령이죠.
DELETE FROM 테이블명 WHERE 조건으로 지웁니다. 역시 WHERE가 없으면 전부 지워집니다.
제약 조건은 테이블을 만들 때 함께 겁니다. PRIMARY KEY는 기본키, FOREIGN KEY는 외래키, NOT NULL은 널 금지, UNIQUE는 중복 금지, CHECK는 값의 범위 제한, DEFAULT는 기본값입니다. UNIQUE와 PRIMARY KEY는 둘 다 중복을 막지만, PRIMARY KEY는 널도 막고 테이블당 하나만 존재한다는 점에서 다릅니다.
다음 강에서는 여러 테이블을 엮는 조인과 뷰, 그리고 데이터 전환을 봅니다.
인출 문제
생각해볼 질문 (정답 없음)
WHERE 없는 UPDATE 한 줄이 회사의 모든 데이터를 바꿉니다. 사람의 실수를 전제로 시스템을 설계한다면, 이런 명령에는 어떤 안전장치를 붙여야 할까요.
이전: 3강 물리 설계와 인덱스·트랜잭션 · 다음: 5강 조인·뷰 그리고 데이터 전환