1. INSERT 문 기본
INSERT문은 테이블에 데이터를 삽입하는 명령어이다.
INSERT INTO <테이블> (컬럼1,컬럼2,컬럼3....) VALUES (값1,값2,값3......)
INSERT문에서 테이블명 다음에 나오는 컬럼들은 생략 가능하다. 하지만 생략할 경우 VALUES 다음에 나오는 값들의 순서 및 개수가 테이블에 정의된 컬럼 순서 및 개수와 같아야 한다.
use tempDB CREATE TABLE testTbl1 ( id int, userName nchar(3), age int ) INSERT INTO testTbl1 VALUES(1,'홍길동',25) SELECT * FROM testTbl1
만약 ID와 이름만 입력하고 나이를 입력하고 싶지 않다면, 테이블명 뒤에 입력할 컬럼을 명시해주어야 한다.
INSERT INTO testTbl1 (id,userName) VALUES (2,'임꺽정') SELECT * FROM testTbl1
이런 경우 입력하지 않은 age 는 NULL 값이 들어간다.
만약 컬럼의 순서를 바꿔서 입력하고 싶을 때도 컬럼을 명시해주어야 한다.
INSERT INTO testTbl1 (userName,age,id) VALUES ('조인성',29,3)
2. 자동으로 증가하는 IDENTITY
테이블의 컬럼 속성이 IDENTITY 로 지정되어 있으면, INSERT 에서는 해당 컬럼이 없다고 생각하고 입력하면 된다. IDENTITY는 자동으로 1부터 증가하는 값을 입력해준다. 또 CREATE TABLE 에서 DEFAULT 문장으로 기본값을 설정해 놓았을 때, INSERT 를 사용할 때 별도의 값을 입력하지 않고 지정해 놓은 디폴트 값을 그대로 사용하려면 값을 그대로 사용하려면 값이 입력될 자리에 ‘DEFAULT’ 라고 써주면 된다.
USE tempDB CREATE TABLE testTbl2 ( id int IDENTITY, userName nchar(3), age int, nation nchar(4) DEFAULT '대한민국' ) INSERT INTO testTbl2 VALUES ('강동원',27,DEFAULT) SELECT * FROM testTbl2
만약 강제로 IDENTITY 값을 입력하고 싶다면 다음과 같이 수행하면 된다.
SET IDENTITY_INSERT testTbl2 ON; GO INSERT INTO testTbl2 (id,userName,age,nation) VALUES (11,'키아누',31,'미국')
주의사항은 IDENTITY_INSERT 를 ON으로 변경한 테이블은 꼭 입력할 열을 명시적으로 지정해주어야 한다. 만약 이 문장을 생략하면 오류가 발생한다.
INSERT INTO testTbl2 VALUES (12,'장만옥',35,'중국')
IDENTITY_INSERT 를 OFF 로 변경하고 입력하면, id값은 최대값 + 1 부터 자동 입력된다.
SET IDENTITY_INSERT testTbl2 OFF; GO INSERT INTO testTbl2 VALUES ('다꾸앙',23,'일본')
3. SEQUENCE
SEQUENCE 는 오라클에서 사용하던 개체인데 SQL Server에서 오라클과 같은 방식으로 제공을 위해 사용된다. IDENTITY 와 같은 효과를 가진다.
USE tempDB CREATE TABLE testTbl3 ( id int, userName nchar(3), age int, nation nchar(4) DEFAULT '대한민국' )
테이블 testTbl3 를 생성한다.
CREATE SEQUENCE idSEQ START WITH 1 -- 시작값 INCREMENT BY 1 -- 증가값
그리고 시퀀스를 생성한다. 시작값은 1, 증가값도 1로 설정한다.
데이터 입력 시 시퀀스를 입력하려면 ‘NEXT VALUE FOR 시퀀스이름’을 사용한다.
INSERT INTO testTbl3 VALUES (NEXT VALUE FOR idSEQ,'강동원',27,DEFAULT)
강제로 id 값을 입력하고 싶다면 그냥 원하는 값을 입력하면 된다. 그리고 시퀀스의 시작값을 다시 설정해준 후에 다시 시퀀스를 입력하면 된다.
INSERT INTO testTbl3 VALUES (11,'키아누',31,'미국') INSERT INTO testTbl3 VALUES (NEXT VALUE FOR idSEQ,'다꾸앙',23,'일본') ALTER SEQUENCE idSEQ RESTART WITH 12 INSERT INTO testTbl3 VALUES(NEXT VALUE FOR idSEQ,'임꺽정',20,'대한민국')
IDENTITY 와 다르게 SEQUENCE 는 id 값을 명시해서 입력 후 다시 ‘NEXT VALUE FOR idSEQ’ 로 입력하면 이전 idSEQ 값부터 시작한다. 따라서 명시한 값 이후부터 시작하려면 ALTER 로 시작값을 수정해주어야 한다.
SEQUNCE를 설정할 때 최대값, 최소값을 설정할 수 있다. 이를 활용해 입력되야 할 값의 범위를 정할 수 있다.
CREATE TABLE testTbl4 (id INT) CREATE SEQUENCE cycleSEQ START WITH 100 -- 시작값 INCREMENT BY 1 -- 증가값 MINVALUE 100 -- 최소값 MAXVALUE 300 -- 최소값
시퀀스를 정의할 때 최대값, 최소값을 정의한다.
INSERT INTO testTbl4 VALUES(NEXT VALUE FOR cycleSEQ) INSERT INTO testTbl4 VALUES(NEXT VALUE FOR cycleSEQ) INSERT INTO testTbl4 VALUES(NEXT VALUE FOR cycleSEQ) INSERT INTO testTbl4 VALUES(NEXT VALUE FOR cycleSEQ) INSERT INTO testTbl4 VALUES(NEXT VALUE FOR cycleSEQ) SELECT * FROM testTbl4
원하는 범위 내에서 값이 자동으로 증가한다.
SEQUENCE 를 DEFAULT와 함꼐 사용하면 IDENTITY와 마찬가지로 값을 생략해도 자동으로 입력할 수 있다.
use tempDB CREATE SEQUENCE autoSEQ START WITH 1 INCREMENT BY 1 CREATE TABLE testTbl5 ( id INT DEFAULT (NEXT VALUE FOR autoSEQ), userName nchar(3) ) INSERT INTO testTbl5 (userName) VALUES ('강동원') INSERT INTO testTbl5 (userName) VALUES ('키아누') INSERT INTO testTbl5 (userName) VALUES ('다꾸앙')
4. 대량의 샘플데이터 생성 INSERT INTO ~ SELECT ~
이번에는 샘플 데이터를 입력하는 경우를 생각해보자. 지금까지 해온 방식으로 직접 입력하려면 많은 시간이 걸렸을 것이다. 이럴 때 INSERT INTO ~ SELECT 구문을 사용할 수 있다.
INSERT INTO 테이블명 (컬럼명1, 컬럼명2 .....) SELECT 컬럼1, 컬럼2... FROM ...
SELECT 문의 결과 컬럼과 INSERT 할 테이블의 컬럼 개수는 같아야 한다.
USE tempDB CREATE TABLE testTbl6 ( id int, Fname nvarchar(50), Lname nvarchar(50) ) INSERT INTO testTbl6 SELECT BusinessEntityID,FirstName,LastName FROM AdventureWorks2022.Person.Person SELECT * FROM testTbl6
데이터베이스 AdventureWorks2022 의 Person 테이블을 testTbl6 로 입력할 수 있다.
Share article