Do It SQL입문 03-6 테이블 생성하고 데이터 조작하기

stan·2023년 6월 22일
0

T - SQL (SQL Server)

목록 보기
10/12

Data Manipulation language, DML
SELECT 검색
INSERT 삽입
UPDATE 수정
DELETE 삭제

  • DML의 대상은 테이블이므로 DML을 사용하려면 테이블이 있어야함

그 테이블을 조작하는 언어를 데이터 정의 언어 data definition language, DDL 이라고 한다.

  • DDL은 데이터베이스, 테이블, 뷰, 인덱스 등의 개체를 생성 CREATE, 삭제 DROP, 변경 ALTER 한다
  • DDL의 경우 데이터베이스 관리자만 사용함

데이터베이스 생성하고 삭제하기

  • CREATE를 사용해 데이터베이스를 생성

데이터베이스를 생성하는 CREATE문의 기본 형식

CREATE DATABASE [데이터베이스 이름]

CREATE문으로 TestDB라는 데이터베이스 생성

CREATE DATABASE TestDB

DROP문으로 데이터베이스 삭제

DROP DATABASE TestDB

테이블 생성하고 삭제

테이블 생성하는 CREATE문의 기본형식

CREATE TABLE 테이블 이름 (
열1 자료형,
열2 자료형,
(...생략...)
)

e.g.

CREATE TABLE doit_create_table (
col_1 INT,
col_2 NVARCHAR(50,
col_3 DATETIME

)

DROP 문으로 테이블 삭제하기

DROP TABLE doit_create_table

현재 삭제하려는 테이블이 다른 테이블과 종속 관계이면서 부모 테이블인 경우 삭제에 실패

종속 관계에서 부모 테이블을 삭제하고 싶다면 자식 테이블과의 종속 관계를 제거한 뒤 자식 테이블을 모두 삭제해야 한다.

INSERT문으로 데이터 삽입

INSERT 문의 기본 형식

INSERT INTO 테이블 [열1, 열2, ...] VALUES [값1, 값2, ...]

e.g.

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)
VLUES (1, 'DoItSQL', '2021-01-01')

INSERT 특이사항

1) 테이블에 데이터를 삽립할 때 열 이름을 생략할 수 있다.
- 열 이름을 생략하려면 VALUES 문 뒤에 테이브르이 열 수선와 개수에 마주처 데이터를 채워야 한다

열 이름을 생략하고 테이블에 데이터 삽입

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_2, col_3)
VALUES (5, N'데이터 입력5', '2021-01-03'), (6, N'데이터 입력6','2021-01-03'), (7, N'데이터 입력7', '2021-01-03')


NULL을 허용하지 않도록 테이블 생성하면?

NULL을 허용하지 않도록 테이블 생성하고 NULL 삽입하기: 오류 발생

CREATE TABLE doit_notnull(
col_1 INT,
col_2 NVARCHAR(50) NOT NULL
)
GO

INSERT INTO doit_notnull (col_1) VALUES (1)


UPDATE문으로 데이터 수정

UPDATE문의 기본형식

UPDATE [테이블 이름] SET [열1 = 값1, 열2 = 값2, ...]
WHERE [열] = [조건]

  • WHERE문을 생략할 수 있다. 하지만 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 [테이블 이름] WHERE [열] = [조건]

DELETE문으로 특정 열 데이터 삭제하기: WHERE문 사용

DELETE doit_dml WHERE col_1 = 14


외래키로 연결된 데이터 입력, 삭제하기

관계형 데이터베이스는 데이터의 무결성을 유지해야 하므로 부모 테이블에 없는 데이터를 자식 테이브링 가지면 안 되는 것이 원칙이다

  • 데이터가 잘못 입력되거나 삭제되는 것을 방지

외래키는 테이블이 관계를 구성할 때 참조하는 열

부모, 자식 테이블 생성

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_parent VALUES (1)
INSERT INTO doit_child VALUES (1)

SELECT FROM doit_parent
SELECT
FROM doit_child

부모테이블의 데이터만 삭제 하려고 하면 외래키 제약 조건 때문에 삭제 실패

자식 테이블의 데이터를 먼저 삭제하고 부모 테이블의 데이터를 삭제해야 정상적으로 성공

DELETE doit_child WHERE col_1=1
DELETE doit_parent WHERE col_1=1

만약 외래키가 설정된 테이블을 삭제하려면 자식 테이블, 부모 테이블 순서로 삭제해야 함

--자식 테이블을 삭제한 뒤 부모 테이블 삭제
DROP TABLE doit_child
DROP TABLE doit_parent

자식테이블의 데이터는 유지하면서 부모테이블을 삭제하고 싶다면 제약조건을 제거해 테이블을 삭제

  • 제약 조건을 삭제하는 명령어는 DROP CONSTRAINT를 사용
    - 이때 제약조건을 명시

제약조건을 제거한 뒤 부모 테이블 삭제 : 성공

--제약 조건을 가진 테이블 다시 생성
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);

--제약 조건을 제거한 뒤, 부모 테이블 삭제
ALTER TABLE doit_child
DROP CONSTRAINT FKdoit_chilcol_1__44FF419A;

DROP TABLE doit_parent;


제약 조건과 제약 조건 이름을 확인하고 싶다면 sp_help [테이블 이름]을 입력 또는 테이블 이름을 드래그한 상태에서 Alt + F1


다른 테이블에 검색 결과 입력

INSERT ... SELECT문의 기본 형식

INSERT 대상테이블
SELECT 열 FROM 기존 테이블

stock 테이블에서 symbol이 'MSFT'이면서 2021년 1월 1일부터 2021년 1월 31일까지의 데이터를 doit_stock 테이블에 저장하는 쿼리

--데이터를 저장할 테이블 생성
CREATE TABLE doit_stock (
date DATETIME,
symbol NVARCHAR(255),
[open] FLOAT,
[high] FLOAT,
[low] FLOAT,
[close] FLOAT,
adj_close FLOAT,
volume bigint
);

--검색된 데이터 입력
INSERT doit_stock
SELECT * FROM stock
WHERE symbol = 'MSFT'
and date >= '2021-01-01' and date < '2021-02-01';

--데이터 확인
SELECT * FROM doit_stock;

--테이블 삭제
DROP TABLE doit_stock;


새 테이블을 생성하며 검색 결과 입력하기

검색 결과가 여러 테이블에서 조인한 것이고 열의 개수가 많으면, 매번 자료형을 확인하고 테이블을 생성한 다음 검색 결과를 입력하기란 쉽지 않다.

테이블의 데이터를 복사할 때 자주 사용하는 방법

SELECT문으로 검색한 데이터를 입력할 때 사용자가 정의한 테이블 이름으로 테이블을 자동으로 생성하고 데이터를 입력

SELECT ...INTO 기본 형식

SELECT 열 INTO 새로운 테이블 FROM 기존 테이블

stock테이블에서 sybol이 'MSFT'이면서 2021년 1월 1일부터 2021년 1월 31일까지의 데이터를 doit_stock2 테이블을 자동으로 생성한 뒤 저장; 이후 doit_stock2 테이블을 사용하지는 않을 것이므로 테이블 삭제

--테이블 생성하며 검색된 데이터 입력
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;

퀴즈 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 doit_quiz (col_1, col_1, 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

profile
이진 입니다

0개의 댓글