SQL 개념 정리 (DDL, DML, DCL, TCL)
오늘은 SQL 문법의 개념과 종류에 대해서 알아보는 시간을 가져보고 다양한 예제를 보여주려한다.
참고로 Sample Data는 아래 사이트에서 가져왔다.
https://www.sqlservertutorial.net/getting-started/load-sample-database/
Load SQL Server Sample Database
This tutorial shows you step by step how to load a sample database BikeStores into the SQL Server for practicing.
www.sqlservertutorial.net
SQL 문법은 DDL, DML, DCL, TCL로 구분 지을 수 있다.
DDL (Data Definition Language) : 데이터 정의어
- 데이터베이스 구조 정의에 사용하는 언어로, 테이블이나 컬럼 등을 생성, 수정, 삭제한다.
종류 | 역할 |
CREATE | 새로운 테이블 생성 |
ALTER | 기존 테이블 구조 변경 |
DROP | 기존 테이블 삭제 |
TRUNCATE | 기존 테이블 초기화 |
RENAME | 기존 테이블 이름 변경 |
CREATE 구문 예시
CREATE TABLE production.categories (
category_id INT IDENTITY (1, 1) PRIMARY KEY, -- 1번부터 1씩 증가 == 오라클 시퀀스랑 동일
category_name VARCHAR (255) NOT NULL
);
[결과]

위와 같이 테이블이 생성된 걸 확인할 수 있다.
+ TRUNCATE 와 DROP 명령어 구문 예시
DROP TABLE BikeStores.production.categories;
-- 테이블 자체가 아예 사라짐
TRUNCATE TABLE BikeStores.production.categories;
-- 테이블의 뼈대는 남긴 채 모든 데이터 삭제
DML (Data Manipulation Language) : 데이터 조작어
- 데이터 조작에 사용하는 언어로, 테이블의 데이터를 조회, 저장, 수정, 삭제한다.
=> 저장된 데이터들을 다루는 역할을 한다.
종류 | 역할 |
SELECT | 저장된 데이터를 조회 |
INSERT | 새로운 데이터를 저장 |
UPDATE | 저장된 데이터를 수정 |
DELETE | 저장된 데이터를 삭제 |
INSERT 구문 예시
INSERT INTO 테이블명 컬럼명1,컬럼명2 VALUES(데이터1,데이터2)
SET IDENTITY_INSERT production.brands ON;
-- identity 를 부여했을 때 자동으로 입력되기 때문에 위의 명령어를 넣어줘야 수동으로 입력할 수 있다.
INSERT INTO production.brands(brand_id,brand_name) VALUES(1,'Electra')
INSERT INTO production.brands(brand_id,brand_name) VALUES(2,'Haro')
INSERT INTO production.brands(brand_id,brand_name) VALUES(3,'Heller')
INSERT INTO production.brands(brand_id,brand_name) VALUES(4,'Pure Cycles')
INSERT INTO production.brands(brand_id,brand_name) VALUES(5,'Ritchey')
INSERT INTO production.brands(brand_id,brand_name) VALUES(6,'Strider')
INSERT INTO production.brands(brand_id,brand_name) VALUES(7,'Sun Bicycles')
INSERT INTO production.brands(brand_id,brand_name) VALUES(8,'Surly')
INSERT INTO production.brands(brand_id,brand_name) VALUES(9,'Trek')
SET IDENTITY_INSERT production.brands OFF;
-- IDENTITY_INSERT OFF
SELECT 구문 예시
select * from 테이블명;
SELECT 컬럼명 FROM 테이블명
WHERE 조건;
select * from BikeStores.production.brands;
[결과]

INSERT 구문으로 입력된 데이터들이 출력되는 것을 확인할 수 있다.
INSERT 예시 2)
INSERT INTO production.categories(category_id,category_name) VALUES(1,'Children Bicycles')
INSERT INTO production.categories VALUES ('Comfort Bicycles')

이전에 CREATE 문에서 category_id에 identity 설정을 해줬기 때문에,
따로 value 값을 입력하지 않아도 자동으로 입력이 되는 것을 확인할 수 있다.
UPDATE 구문 예시
UPDATE BikeStores.production.categories
SET category_name = '편안한 자전거'
WHERE category_id = 2
select * from BikeStores.production.categories;

update 구문으로 인해 데이터가 바뀐것을 확인할 수 있다.
DB 를 활용하다보면, 주로 조회를 많이 하는 데, 그 때 JOIN 구문이 잘 활용됩니다.
위의 테이블을 기준으로 간단한 JOIN 구문에 대해서 설명해보겠습니다.
SELECT *
FROM [BikeStores].[production].[brands] a -- a 라고 alias 선언
JOIN [BikeStores].[production].[products] b -- b 라고 alias 선언
ON a.brand_id = b.brand_id
WHERE model_year = 2016
위와 같은 방식은 이퀄 조인이라고 한다. == INNER JOIN
(서로 다른 테이블에 같은 이름의 컬럼이 있기 때문이다.)

두개의 테이블을 합쳐서 보이게 할 수 있다.
select *
from [BikeStores].[production].[brands] a
JOIN [BikeStores].[production].[products] b ON a.brand_id = b.brand_id
WHERE model_year = 2016 AND category_id <> 6
=> WHERE 절에 category_id가 6인 것을 제외하는 조건을 추가했다.

DCL (Data Control Language) : 데이터 제어어
- 데이터베이스에 대한 접근 권한 제어에 사용하는 언어로, 각종 권한을 부여, 회수한다.
종류 | 역할 |
GRANT | 권한을 부여 |
REVOKE | 권한을 회수 |
TCL (Transaction Control Language) : 트랜잭션 제어어
- DCL에서 트랜잭션을 컨트롤하는 명령어를 TCL로 분류한다.
종류 | 역할 |
COMMIT | 작업한 데이터를 데이터베이스에 영구적으로 반영하는 명령어 |
ROLLBACK | 작업 시작 이전의 상태로 되돌림 |
SAVEPOINT | 저장점을 지정 후 Rollback을 사용하여 특정 지점까지 Rollback이 가능하게 하는 명령어 |
+ 추가 내용
AUTO COMMIT
- SQL Server ( MS-SQL )에서는 Auto Commit 이 default 값이다.
- DML, DDL 문을 수행할 때 마다 DBMS가 트랜잭션을 컨트롤 하는 방식이다.
- 명령어가 수행되면 자동 COMMIT을 수행하고, 오류가 발생할 시에는 자동 ROLLBACK을 수행한다.