본문으로 건너뛰기

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
실행 결과
idFnameLname
1JohnDoe
2JaneSmith
3AliceBrown



데이터 수정

UPDATE

  • 구문 형식
정보

UPDATE, SET, WHERE 은 하나의 세트라고 생각하자
ex) SELECT, FROM, WHERE 과 비슷하다

UPDATE 테이블이름
SET1 =1,2 =2 ...
WHERE 조건

-- 예시
UPDATE testTbl7
SET Lname = '이름바꾸기'
WHERE Fname = 'Alice';
실행 결과
idFnameLname
1JohnDoe
2JaneSmith
3Alice이름바꾸기



데이터 삭제

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;
실행 결과
_따블클릭