MSSQL LAB
MSSQL 1.3 · 1부. 기초

데이터베이스와 테이블

CREATE TABLE 로 담을 자리를 만들고, 만든 것을 확인하고 지웁니다.

예상 학습 시간 16분 난이도 입문
개념 설명

세 층으로 나뉩니다

1.2 에서 스크립트 하나를 실행했더니 MssqlLab 이 생기고 그 안에 테이블 여섯 개가 만들어졌습니다. 그때 만들어진 것이 세 층입니다.

보기무엇인가
데이터베이스MssqlLab테이블을 담는 단위입니다. 백업·복구·권한이 이 단위로 움직입니다
스키마Board테이블을 영역별로 묶는 이름입니다
테이블POSTS실제 자료가 들어가는 자리입니다

그래서 테이블의 온전한 이름은 MssqlLab.Board.POSTS 입니다. 같은 데이터베이스 안에서 작업할 때는 앞을 떼고 Board.POSTS 까지만 적습니다.

스키마를 생략하면 dbo 로 봅니다. 모든 데이터베이스에 처음부터 있는 기본 스키마입니다. 이 단원의 연습 테이블은 그 dbo 에 만듭니다.

최소 예제

테이블 만들기

메모를 담을 테이블을 하나 만들어 보겠습니다. 열 이름과 형식을 차례로 적고, 각 열이 값을 비워 둘 수 있는지(NULL) 없는지 (NOT NULL)를 밝힙니다.

SQL
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 을 넣어 봅니다.

SQL
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;
결과
numtitlebodyreg_date
1첫 메모내용입니다.2026-01-01 09:00:00
2둘째 메모NULL2026-01-02 09:00:00
(2개 행이 영향을 받음)

문자열 앞의 N 은 유니코드로 다루라는 표시입니다. 한글을 넣을 때는 반드시 붙이십시오. 빠뜨리면 글자가 깨져 들어갈 수 있습니다. 까닭은 1.4 에서 varcharnvarchar 를 비교하며 다룹니다.

상세 사용법

무엇이 만들어졌는지 확인하기

개체 탐색기를 펼쳐 봐도 되지만, 문장으로 물어보면 화면 없이도 확인할 수 있고 결과를 다시 가공할 수도 있습니다. 데이터베이스는 자기 구조를 표준 뷰로 내줍니다.

SQL
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_NAMEDATA_TYPEmax_lenIS_NULLABLE
numintNULLNO
titlenvarchar100NO
bodynvarchar-1YES
reg_datedatetime2NULLNO
(4개 행이 영향을 받음)

두 자리가 눈에 걸립니다.

  • body 의 길이가 -1 입니다. NVARCHAR(MAX) 는 길이를 정하지 않은 것이라 숫자로 적을 값이 없습니다. 그것을 -1 로 나타냅니다.
  • intdatetime2 의 길이가 NULL 입니다. 글자 수로 재는 형식이 아니므로 이 열에는 값이 없습니다.

테이블 목록도 같은 방식으로 봅니다.

SQL
SELECT TABLE_SCHEMA, TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
ORDER BY TABLE_SCHEMA, TABLE_NAME;
결과
TABLE_SCHEMATABLE_NAME
BoardBOARDS
BoardCATEGORIES
BoardCOMMENTS
BoardFILES
BoardPOSTS
dboMEMO
MemberUSERS
(7개 행이 영향을 받음)

실습 테이블 여섯 개에 방금 만든 dbo.MEMO 가 더해져 일곱 개입니다. TABLE_TYPE 을 걸러 낸 것은 뷰(3.7)도 이 목록에 함께 나오기 때문입니다.

상세 사용법

고치기와 지우기

만든 뒤에 열을 더해야 할 때가 있습니다. 이미 행이 들어 있는데 NOT NULL 열을 더하면 기존 행에 넣을 값이 없어 거부되므로, DEFAULT 로 채울 값을 함께 알려 줍니다.

SQL
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;
결과
numtitlepinned
1첫 메모0
2둘째 메모0
(2개 행이 영향을 받음)

이미 있던 두 행에 0 이 채워졌습니다. 운영 중인 테이블을 고치는 일은 잠금과 배포 순서가 걸려 있어 6.3 에서 따로 다룹니다.

연습이 끝났으니 지웁니다.

SQL
DROP TABLE dbo.MEMO;
메시지
명령이 완료되었습니다.

DROP TABLE 은 되돌릴 수 없습니다. 구조와 자료가 함께 사라지고 휴지통도 없습니다. 행만 비우려면 DELETE(1.8)를 사용하십시오 — 테이블은 남습니다.

문장사라지는 것남는 것
DROP TABLE구조와 자료 모두없습니다
DELETE조건에 맞는 행테이블 구조
실습 문제

직접 해보기

1. 방명록 테이블 만들기 난이도 하

번호(자동), 이름(필수, 30자), 남긴 말(필수), 남긴 때(필수)를 담는 dbo.GUESTBOOK 테이블을 만들어 보세요. 번호를 기본 키로 두십시오.

번호를 자동으로 매기려면 IDENTITY, 한글을 담으려면 NVARCHAR 입니다.
CREATE TABLE dbo.GUESTBOOK ( num INT IDENTITY(1, 1) NOT NULL, name NVARCHAR(30) NOT NULL, message NVARCHAR(500) NOT NULL, reg_date DATETIME2(0) NOT NULL, CONSTRAINT PK_GUESTBOOK PRIMARY KEY (num) );
2. 넣어 보고 확인한 뒤 지우기 난이도 중

만든 테이블에 두 행을 넣고, 열 구조를 문장으로 확인한 다음 테이블을 지우세요. num 에 값을 직접 넣으면 어떻게 되는지도 해보십시오.

INSERT INTO dbo.GUESTBOOK (name, message, reg_date) VALUES (N'홍길동', N'잘 보고 갑니다.', '2026-01-01 10:00:00'), (N'김철수', N'또 오겠습니다.', '2026-01-02 10:00:00'); SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'GUESTBOOK' ORDER BY ORDINAL_POSITION; DROP TABLE dbo.GUESTBOOK; -- num 에 값을 직접 넣으면 544 번 오류가 납니다. -- Cannot insert explicit value for identity column in table -- 'GUESTBOOK' when IDENTITY_INSERT is set to OFF. -- 자동으로 매기라고 맡겨 둔 열이라 밖에서 넣지 못하게 막습니다. -- 메시지 글귀는 설치한 언어를 따릅니다. 번호 544 는 어디서나 같습니다.
요약
  • 이름은 데이터베이스 · 스키마 · 테이블 세 층입니다. 스키마를 적지 않으면 dbo 로 봅니다.
  • CREATE TABLE 에 열 이름 · 형식 · NULL 허용 여부를 적습니다.
  • IDENTITY 는 번호를 자동으로 올리고, PRIMARY KEY 는 행 하나를 가려냅니다.
  • 한글 문자열 앞에는 N 을 붙입니다.
  • 구조는 INFORMATION_SCHEMA 로 확인하고, ALTER TABLE 로 고칩니다.
  • DROP TABLE되돌릴 수 없습니다. 행만 비울 때는 DELETE 입니다.