데이터베이스와 테이블
CREATE TABLE 로 담을 자리를 만들고, 만든 것을 확인하고 지웁니다.
세 층으로 나뉩니다
1.2 에서 스크립트 하나를 실행했더니 MssqlLab 이 생기고 그 안에 테이블 여섯 개가 만들어졌습니다. 그때 만들어진 것이 세 층입니다.
| 층 | 보기 | 무엇인가 |
|---|---|---|
| 데이터베이스 | MssqlLab | 테이블을 담는 단위입니다. 백업·복구·권한이 이 단위로 움직입니다 |
| 스키마 | Board | 테이블을 영역별로 묶는 이름입니다 |
| 테이블 | POSTS | 실제 자료가 들어가는 자리입니다 |
그래서 테이블의 온전한 이름은 MssqlLab.Board.POSTS 입니다.
같은 데이터베이스 안에서 작업할 때는 앞을 떼고 Board.POSTS
까지만 적습니다.
스키마를 생략하면 dbo 로 봅니다. 모든 데이터베이스에 처음부터 있는 기본 스키마입니다. 이 단원의 연습 테이블은 그 dbo 에 만듭니다.
테이블 만들기
메모를 담을 테이블을 하나 만들어 보겠습니다. 열 이름과 형식을 차례로 적고, 각 열이
값을 비워 둘 수 있는지(NULL) 없는지
(NOT NULL)를 밝힙니다.
USE MssqlLab; CREATE TABLE dbo.MEMO ( num INT IDENTITY(1, 1) NOT NULL, title NVARCHAR(100) NOT NULL, body NVARCHAR(MAX) NULL, reg_date DATETIME2(0) NOT NULL, CONSTRAINT PK_MEMO PRIMARY KEY (num) );
네 줄이 각각 무엇을 정하는지 봅니다.
| 적은 것 | 뜻 |
|---|---|
| IDENTITY(1, 1) | 값을 적지 않아도 데이터베이스가 1 부터 하나씩 올려 넣습니다 |
| NOT NULL | 반드시 값이 있어야 합니다. 비우고 넣으면 거부됩니다 |
| NULL | 비워 둘 수 있습니다. 적지 않으면 이쪽이 기본입니다 |
| PRIMARY KEY | 이 열의 값으로 행 하나를 가려냅니다. 중복도 NULL 도 허용하지 않습니다 |
기본 키는 되도록 두십시오. 없어도 테이블은 만들어지지만, 특정 행 하나를 가리킬 방법이 사라져 고치거나 지울 때 다른 행까지 함께 건드리기 쉽습니다. 기본 키를 무엇으로 잡을지는 3.2 에서 따로 다룹니다.
행을 넣고 확인하기
num 은 적지 않습니다. IDENTITY 로
두었으니 데이터베이스가 채웁니다. body 는 비워 둘 수 있으므로
NULL 을 넣어 봅니다.
INSERT INTO dbo.MEMO (title, body, reg_date) VALUES (N'첫 메모', N'내용입니다.', '2026-01-01 09:00:00'), (N'둘째 메모', NULL, '2026-01-02 09:00:00'); SELECT num, title, body, reg_date FROM dbo.MEMO ORDER BY num;
| num | title | body | reg_date |
|---|---|---|---|
| 1 | 첫 메모 | 내용입니다. | 2026-01-01 09:00:00 |
| 2 | 둘째 메모 | NULL | 2026-01-02 09:00:00 |
문자열 앞의 N 은 유니코드로 다루라는 표시입니다.
한글을 넣을 때는 반드시 붙이십시오. 빠뜨리면 글자가 깨져 들어갈 수
있습니다. 까닭은 1.4 에서 varchar 와
nvarchar 를 비교하며 다룹니다.
무엇이 만들어졌는지 확인하기
개체 탐색기를 펼쳐 봐도 되지만, 문장으로 물어보면 화면 없이도 확인할 수 있고 결과를 다시 가공할 수도 있습니다. 데이터베이스는 자기 구조를 표준 뷰로 내줍니다.
SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH AS max_len, IS_NULLABLE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'MEMO' ORDER BY ORDINAL_POSITION;
| COLUMN_NAME | DATA_TYPE | max_len | IS_NULLABLE |
|---|---|---|---|
| num | int | NULL | NO |
| title | nvarchar | 100 | NO |
| body | nvarchar | -1 | YES |
| reg_date | datetime2 | NULL | NO |
두 자리가 눈에 걸립니다.
-
body 의 길이가 -1 입니다.
NVARCHAR(MAX)는 길이를 정하지 않은 것이라 숫자로 적을 값이 없습니다. 그것을 -1 로 나타냅니다. - int 와 datetime2 의 길이가 NULL 입니다. 글자 수로 재는 형식이 아니므로 이 열에는 값이 없습니다.
테이블 목록도 같은 방식으로 봅니다.
SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' ORDER BY TABLE_SCHEMA, TABLE_NAME;
| TABLE_SCHEMA | TABLE_NAME |
|---|---|
| Board | BOARDS |
| Board | CATEGORIES |
| Board | COMMENTS |
| Board | FILES |
| Board | POSTS |
| dbo | MEMO |
| Member | USERS |
실습 테이블 여섯 개에 방금 만든 dbo.MEMO 가 더해져 일곱 개입니다.
TABLE_TYPE 을 걸러 낸 것은 뷰(3.7)도 이 목록에 함께 나오기
때문입니다.
고치기와 지우기
만든 뒤에 열을 더해야 할 때가 있습니다. 이미 행이 들어 있는데
NOT NULL 열을 더하면 기존 행에 넣을 값이 없어 거부되므로,
DEFAULT 로 채울 값을 함께 알려 줍니다.
ALTER TABLE dbo.MEMO ADD pinned BIT NOT NULL CONSTRAINT DF_MEMO_pinned DEFAULT 0; SELECT num, title, pinned FROM dbo.MEMO ORDER BY num;
| num | title | pinned |
|---|---|---|
| 1 | 첫 메모 | 0 |
| 2 | 둘째 메모 | 0 |
이미 있던 두 행에 0 이 채워졌습니다. 운영 중인 테이블을 고치는 일은 잠금과 배포 순서가 걸려 있어 6.3 에서 따로 다룹니다.
연습이 끝났으니 지웁니다.
DROP TABLE dbo.MEMO;
DROP TABLE 은 되돌릴 수 없습니다.
구조와 자료가 함께 사라지고 휴지통도 없습니다. 행만 비우려면
DELETE(1.8)를 사용하십시오 — 테이블은 남습니다.
| 문장 | 사라지는 것 | 남는 것 |
|---|---|---|
| DROP TABLE | 구조와 자료 모두 | 없습니다 |
| DELETE | 조건에 맞는 행 | 테이블 구조 |
직접 해보기
번호(자동), 이름(필수, 30자), 남긴 말(필수), 남긴 때(필수)를 담는 dbo.GUESTBOOK 테이블을 만들어 보세요. 번호를 기본 키로 두십시오.
만든 테이블에 두 행을 넣고, 열 구조를 문장으로 확인한 다음 테이블을 지우세요. num 에 값을 직접 넣으면 어떻게 되는지도 해보십시오.
- 이름은 데이터베이스 · 스키마 · 테이블 세 층입니다. 스키마를 적지 않으면 dbo 로 봅니다.
CREATE TABLE에 열 이름 · 형식 · NULL 허용 여부를 적습니다.IDENTITY는 번호를 자동으로 올리고,PRIMARY KEY는 행 하나를 가려냅니다.- 한글 문자열 앞에는
N을 붙입니다. - 구조는
INFORMATION_SCHEMA로 확인하고,ALTER TABLE로 고칩니다. DROP TABLE은 되돌릴 수 없습니다. 행만 비울 때는DELETE입니다.