T-SQL 분류 및 데이터 변경을 위한 SQL 문
T-SQL의 분류
DML
Data Manipulation Language 데이터 조작 언어
- 데이터의 선택, 삽입, 수정, 삭제에 사용
- 대상은 테이블의 행
SELECT
,INSERT
,UPDATE
,DELETE
가 해당- 트랜잭션(Transaction)을 발생시킴(
SELECT
제외)
DDL
Data Definition Language 데이터 정의 언어
- 데이터베이스 개체를 생성, 삭제, 변경하는 데 사용
CREATE
,DROP
,ALTER
등이 해당- 트랜잭션을 발생시키지 않음
DCL
Data Control Language 데이터 제어 언어
- 사용자에게 권한 부여 시에 주로 사용
GRANT
,REVOKE
,DENY
등이 해당
데이터 삽입
INSERT
문 기본
INSERT [INTO] <테이블> [(열1, 열2, ...)] VALUES (값1, 값2, ...)
-- ex
INSERT INTO testTbl1 VALUES (1, 'hyoloui', 28)
INSERT INTO testTbl1(id, userName) VALUES(2, 'juloui')
INSERT INTO testTbl1(userName, age, id) VALUES('beeloui', 7, 3) -- 순서는 상관 없음
자동으로 증가하는 IDENTITY
IDENTITY
지정 시에는 입력값을 생략 / DEFAULT 값
CREATE TABLE testTbl2
(id int IDENTITY,
userName nchar(3),
age int,
nation nchar(4) DEFAULT '대한민국');
GO
INSERT INTO testTbl2 VALUES('일번', 20, DEFAULT)
SET IDENTITY_INSERT testTbl2 ON; -- identity 로 지정된 행을 강제로 지정
INSERT INTO testTbl2(id, userName, age, nation)
VALUES(11, '십일번', 25, '일본')
SET IDENTITY_INSERT testTbl2 OFF; -- identity 로 지정된 행을 자동으로 지정
EXECUTE sp_help testTbl2 -- testTbl2 테이블의 columns 정보 확인
SELECT IDENT_CURRENT('testTbl2') -- 현재 row 가 몇개인지 확인
SEQUENCE
IDENTITY
와 같은 효과를 냄- 오라클과 같은 방식을 제공하기 위한 개체임
정보
IDENTITY
처럼 CREATE TABLE
문에서 작성하는 것이 아닌,
따로 CREATE SEQUENCE
문을 작성 해야함
CREATE SEQUENCE idSEQ
START WITH 1 -- 시작값
INCREMENT BY 1; -- 증가값
GO
INSERT INTO testTbl3
VALUES (NEXT VALUE FOR idSEQ, '솔라', 25, DEFAULT)
- 변경은
ALTER SEQUENCE
문을 사용함 - 특정 범위의 값이 반복되게 입력할 수도 있음
대량의 샘플데이터 생성
USE tempDB
CREATE TABLE testTbl4 (id int, Fname NVARCHAR(50), Lname NVARCHAR(50))
GO
INSERT INTO testTbl4
SELECT BusinessEntityID, FirstName, LastName
FROM AdventureWorks.Person.Person
SELECT BusinessEntityID AS id, FirstName as Fname, LastName as Lname
INTO testTbl5
FROM AdventureWorks.Person.Person
실행 결과
id | Fname | Lname |
---|---|---|
1 | John | Doe |
2 | Jane | Smith |
3 | Alice | Brown |
데이터 수정
UPDATE
- 구문 형식
정보
UPDATE
, SET
, WHERE
은 하나의 세트라고 생각하자
ex) SELECT
, FROM
, WHERE
과 비슷하다
UPDATE 테이블이름
SET 열1 = 값1, 열2 = 값2 ...
WHERE 조건
-- 예시
UPDATE testTbl7
SET Lname = '이름바꾸기'
WHERE Fname = 'Alice';
실행 결과
id | Fname | Lname |
---|---|---|
1 | John | Doe |
2 | Jane | Smith |
3 | Alice | 이름바꾸기 |
데이터 삭제
DELETE
DELETE 테이블이름 WHERE 조건
-- 예시
DELETE testTbl6 WHERE Fname = 'JANE'
실행 결과
| id | Fname | Lname |
| --- | ----- | ---------- |
| 1 | John | Doe |
| 3 | Alice | 이름바꾸기 |
경고
기본적으로 DELETE
문은 WHERE
에 해당하는 모든 열을 제거한다.
따라서 조건을 명확히 하거나 TOP
을 사용하자!
DELETE TOP(5) testTbl6 WHERE Fname = 'JANE'
구문 | 성능 | 용도 |
---|---|---|
DELETE | 가장 느리다 | 특정 행을 삭제할 때 사용 |
DROP | 빠르다 | 테이블 전체(구조 포함)를 삭제할 때 사용 |
TRUNCATE TABLE | 가장 빠르다 | 테이블의 모든 행을 삭제할 때 사용 |
MERGE
하나의 문장에서 경우에 따라
INSERT
,UPDATE
,DELETE
를 수행할 수 있는 구문
시나리오
USE sqlDB;
SELECT userID, name, addr INTO memberTBL FROM userTBL;
SELECT * FROM memberTBL;
CREATE TABLE changeTBL
(
changeType NCHAR(4),
userID CHAR(8),
name NVARCHAR(10),
addr NCHAR(2),
)
INSERT INTO changeTBL VALUES
('신규가입', 'CHO', '초아', '미국'),
('주소변경', 'LSH', NULL, '전주'),
('주소변경', 'KMS', NULL, '부산'),
('회원탈퇴', 'LJB', NULL, NULL),
('회원탈퇴', 'HRK', NULL, NULL),
-- 약 일주일 후
SELECT * FROM memberTBL
MERGE memberTBL AS M
USING changeTBL AS CHAR
ON M.userID = C.userID
-- 신규가입
WHEN NOT MATCHED AND changeType = '신규가입' THEN
INSERT (userID, name, addr) VALUES(C.userID, C.name, C.addr)
-- 주소변경
WHEN NOT MATCHED AND changeType = '주소변경' THEN
UPDATE SET M.addr = C.addr
-- 회원탈퇴
WHEN NOT MATCHED AND changeType = '회원탈퇴' THEN
DELETE;
실행 결과
_따블클릭