03 - 6 테이블 생성하고 데이터 조작하기
데이터 조작 언어(data manipulation language, DML)는 테이블에 데이터를 검색(SELECT), 삽입(INSERT), 수정(UPDATE), 삭제(DELETE)하는 데 사용합니다. 즉, DML의 대상은 테이블이므로 DML을 사용하려면 반드시 테이블이 있어야 합니다. 바로 그 테이블을 조작하는 언어를 데이터 정의 언어(data defition language, DDL)라 합니다. DDL은 데이터베이스, 테이블, 뷰, 인덱스 등의 개체를 생성(CREATE), 삭제(DROP), 변경(ALTER)합니다.
데이터베이스 생성하고 삭제하기
데이터베이스를 생성하려면 CREATE 문을 사용합니다. CREATE 문은 ANSI SQL로 대부분의 데이터베이스에서 작동합니다.
-- 데이터베이스를 생성하는 CREATE 문의 기본 형식
CREATE DATABASE [데이터베이스 이름]
CREATE 문으로 데이터베이스 생성하기
-- CREATE 문으로 데이터베이스 생성 : TestDB
CREATE DATABASE TestDB
DROP 문으로 데이터베이스 삭제하기
-- DROP 문으로 데이터베이스 삭제 : TestDB
DROP DATABASE TestDB
테이블 생성하고 삭제하기
테이블을 생성하려면 CREATE 문을 사용하지만, 테이블은 데이터베이스 내부에 생성해야 하므로 반드시 테이블이 위치할 데이터베이스를 먼저 선택해야 합니다.
-- DoItSQL 데이터베이스 선택
USE DoItSQL
CREATE 문으로 테이블 생성하기
열 이름은 테이블 안에서 고유해야 합니다.
-- 테이블을 생성하는 CREATE 문의 기본 형식
CREATE TABLE 테이블 이름 (
열1 자료형,
열2 자료형,
(...생략...)
)
-- CREATE 문으로 테이블 생성
CREATE TABLE doit_create_table (
col_1 INT,
col_2 NVARCHAR(50),
col_3 DATETIME
)
DROP 문으로 테이블 삭제하기
테이블 삭제는 DROP 문을 사용합니다. 테이블 삭제의 경우 데이터베이스 삭제와 다르게 즉시 실행되므로 주의해야 합니다.
-- DROP 문으로 테이블 삭제
DROP TABLE doit_create_table
현재 삭제하려는 테이블이 다른 테이블과 종속 관계이면서 부모 테이블인 경우 삭제에 실패합니다. 종속 관계에서 부모 테이블을 삭제하고 싶다면 자식 테이블과의 종속 관계를 제거한 뒤 자식 테이블을 모두 삭제해야 합니다.
테이블에 데이터 삽입, 수정, 삭제하기
INSERT 문으로 데이터 삽입하기
데이터를 삽입하려면 INSERT 문을 사용합니다.
-- INSERT 문의 기본 형식
INSERT INTO 테이블 [열1, 열2, ···] VALUES [값1, 값2, ···]
-- 테이블을 생성하고 각 열에 데이터 입력
USE DoItSQL;
CREATE TABLE doit_dml (
col_1 INT,
col_2 NVARCHAR(50),
col_3 DATETIME
)
GO
INSERT INTO doit_dml (col_1, col_2, col_3)
VALUES (1, 'DoItSQL', '2021-01-01')
-- 열 이름을 생략하고 테이블에 데이터 삽입
INSERT INTO doit_dml
VALUES (2, N'열 이름 생략', '2021-01-02')
-- 테이블의 특정 열에만 데이터 삽입
INSERT INTO doit_dml(col_1, col_2)
VALUES (3, N'col_3 값 생략')
-- 삽입하려는 데이터의 순서 변경
INSERT INTO doit_dml(col_1, col_3, col_2)
VALUES (4, '2021-01-03', N'열 순서 변경')
-- 여러 데이터를 한 번에 삽입
INSERT INTO doit_dml(col_1, col_2, col_3)
VALUES (5, N'데이터 입력5', '2021-01-03'), (6, N'데이터 입력6', '2021-01-03'), (7, N'데이터 입력7', '2021-01-03')
UPDATE 문으로 데이터 수정하기
테이블에 삽입된 데이터를 수정하려면 UPDATE 문을 사용합니다.
-- UPDATE 문의 기본 형식
UPDATE [테이블 이름] SET [열1 = 값1, 열2 = 값2, ···]
WHERE [열] = [조건]
-- UPDATE 문으로 특정 열 데이터 수정하기 : WHERE 문 사용
UPDATE doit_dml SET col_2 = N'데이터 수정'
WHERE col_1 = 4
-- UPDATE 문으로 전체 열 데이터 수정하기 : WHERE 문 생략
UPDATE doit_dml SET col_1 = col_1 + 10
DELETE 문으로 데이터 삭제하기
입력된 데이터를 삭제하려면 DELETE 문을 사용합니다.
-- DELETE 문의 기본 형식
DELETE [테이블 이름] WHERE [열] = [조건]
-- DELETE 문으로 특정 열 데이터 삭제하기 : WHERE 문 사용
DELETE doit_dml WHERE col_1 = 14
-- DELETE 문으로 전체 열 데이터 삭제하기 : WHERE 문 생략
DELETE doit_dml
-- 테이블 삭제
DROP TABLE doit_dml
외래키로 연결된 데이터 입력, 삭제하기
관계형 데이터베이스는 데이터의 무결성을 유지해야 하므로 부모 테이블에 없는 데이터를 자식 테이블이 가지면 안 되는 것이 원칙입니다. 이 원칙을 유지하면 데이터가 잘못 입력되거나 삭제되는 것을 방지할 수 있습니다.
-- 부모, 자식 테이블 생성
CREATE TABLE doit_parent (col_1 INT PRIMARY KEY);
CREATE TABLE doit_child (col_1 INT);
ALTER TABLE doit_child
ADD FOREIGN KEY (col_1) REFERENCES doit_parent(col_1);
-- 자식 테이블에 데이터 입력 : 실패
INSERT INTO doit_child VALUES (1)
-- 부모 테이블에 데이터 입력한 뒤, 자식 테이블에 같은 데이터 입력 : 성공
INSERT INTO doit_parent VALUES (1)
INSERT INTO doin_child VALUES (1)
-- 부모 테이블의 데이터 삭제 : 실패
DELETE doit_parent WHERE col_1 = 1
-- 자식 테이블에서 데이터 삭제한 뒤, 부모 테이블의 데이터 삭제 : 성공
DELETE doit_child WHERE col_1 = 1
DELETE doit_parent WHERE col_1 = 1
-- 외래키가 설정된 부모 테이블 삭제 : 실패
DROP TABLE doit_parent
-- 자식 테이블을 삭제한 뒤 부모 테이블 삭제 : 성공
DROP TABLE doit_child
DROP TABLE doit_parent
-- 제약 조건을 제거한 뒤 부모 테이블 삭제 : 성공
-- 제약 조건을 가진 테이블 다시 생성
CRETE TABLE doit_parent (col_1 INT PRIMARY KEY);
CREATE TABLE doit_child (col_1 INT);
ALTER TABLE doit_child
ADD FOREIGN KEY (col_1) REFERENCES doit_parent(col_1);
-- 제약 조건을 제거한 뒤, 부모 테이블 삭제
ALTER TABLE doit_child
DROP CONSTRAINT FK__doit_chil__col_1__44FF419A;
DROP TABLE doit_parent;
-- 테이블의 제약 조건 확인
SP_HELP doit_parent
다른 테이블에 검색 결과 입력하기
INSERT ··· SELECT 문을 조합하면 검색 결과를 다른 테이블에 입력할 수 있습니다.
-- INSERT ··· SELECT 문의 기본 형식
INSERT 대상 테이블
SELECT 열 FROM 기존 테이블
-- 다른 테이블에 검색 결과를 입력
-- 데이터를 저장할 테이블 생성
CREATE TABLE doit_stock (
date DATETIME,
symbol NVARCHAR(255),
[open] FLOAT,
[high] FOLAT,
[low] FLOAT,
[close] FLOAT,
adj_close FLOAT,
volume bigint
);
-- 검색된 데이터 입력
INSERT doit_stock
SELECT * FROM stock
WHERE sy,bol = 'MSFT'
AND date >= '2021-01-01' AND date < '2021-02-01'
-- 데이터 확인
SELECT * FROM doit_stock;
-- 테이블 삭제
DROP TABLE doit_stock;
새 테이블을 생성하며 검색 결과 입력하기
-- SELECT ··· INTO 기본 형식
SELECT 열 INTO 새로운 테이블 FROM 기존 테이블
-- 새 테이블을 생성하며 검색 결과를 입력
-- 테이블 생성하며 검색된 데이터 입력
SELECT * INTO doit_stock2 FROM stock
WHERE symbol = 'MSFT'
AND date >= '2021-01-01' AND date < '2021-02-01';
-- 데이터 확인
SELECT * FROM doit_stock2;
-- 테이블 삭제
DROP TABLE doit_stock2;
실전 SQL
퀴즈 10. 숫자 형식의 열 3개(col_1, col_2, col_3)를 가진 doit_quiz 테이블을 생성하세요.
CREATE TABLE doit_quiz (
col_1 INT,
col_2 INT,
col_3 INT
)
퀴즈 11. doit_quiz 테이블에 col_1, col_2, col_3 열 순서대로 (5, 3, 7) 데이터와 (1, 4, 9) 데이터를 삽입하세요.
INSERT INTO (col_1, col_2, col_3) VALUES (5, 3, 7), (1, 4, 9)
퀴즈 12. doit_quiz 테이블에서 col_2의 값이 3인 데이터를 5로 수정하세요.
UPDATE doit_quiz SET col_2 = 5
WHERE col_2 = 3
퀴즈 13. doit_quiz 테이블에서 col_1의 값이 5인 데이터를 삭제하세요.
DELETE doit_quiz WHERE col_1 = 5
퀴즈 14. doit_quiz 테이블을 삭제하세요.
DROP TABLE doit_quiz