DataBase

[MSSQL] insert into vs select into

코북 2023. 6. 30. 17:20

 

1. INSERT INTO 문

 

 INSERT INTO문은 데이터베이스 테이블에 새로운 레코드(행)을 삽입하는 역할을 합니다. INSERT 문을 사용하여 데이터를 테이블에 추가할 수 있습니다.

 

 기본적인 INSERT INTO 문은 다음과 같습니다.

INSERT INTO 테이블명 (컬럼1, 컬럼2, ...)
VALUES (값1, 값2, ...);

-- 컬럼 명시하지 않는 경우
INSERT INTO 테이블명
VALUES (값1, 값2, ...);

 

 INSERT INTO 문은 삽입하려는 테이블의 구조와 일치하는 컬럼과 값을 지정해야 합니다. 데이터의 유효성을 확인하고 제약 조건을 준수하는 등의 추가적인 작업을 수행할 수도 있습니다.

 

 INSERT INTO 문은 자주 사용하는 SQL문이고 사용하면서 특별하게 어려운 점은 없습니다. 다만 주의해야할 점은 테이블명 뒤에 컬럼을 명시하지 않는 경우에 테이블의 구조가 바뀌게 되면 삽입하는 값도 그에 맞춰 추가해줘야 합니다.

 

 컬럼을 명시하는 INSERT INTO 문을 사용하는 경우 명시된 컬럼 외에 다른 컬럼이 있다면 해당 컬럼은 테이블에 설정된 기본값이나 NULL로 처리된다는 점을 고려해야 하기 때문에 쿼리 작성 시 고려할 점이 조금 더 많습니다. 그러나 저는 개인적으로 테이블의 구조가 바뀌었을 때 사용하고 있는 모든 INSERT INTO 문을 수정하지 않게 하기 위해서 컬럼을 명시하는 것을 선호합니다. 

 

 

 

2. INSERT INTO SELECT 문

 

 INSERT INTO SELECT 문은 한 테이블의 데이터를 다른 테이블로 복사하거나, 특정 조건에 따라 데이터를 필터링하여 다른 테이블로 이동하는 데 사용되는 SQL 문입니다.

 

 기본적인 INSERT INTO SELECT 문은 다음과 같습니다.

INSERT INTO 목표_테이블명 (컬럼1, 컬럼2, ...) -- 삽입할 대상 테이블
SELECT 컬럼1, 컬럼2, ...
FROM 원본_테이블명 -- 데이터를 가져올 원본 테이블
WHERE 조건;

 

 INSERT INTO SELECT 문을 사용하면 원본 테이블의 데이터를 선택적으로 필터링하여 다른 테이블로 복사하거나 이동할 수 있습니다. 이를 통해 데이터의 일부를 추출하거나 변환하여 다른 테이블에 삽입할 수 있습니다. 데이터를 이관하거나 마이그레이션할 때 많이 사용합니다.

 

 INSERT INTO 문은 직접 값을 제공하여 새로운 레코드를 한 행씩 삽입하는 데 사용되고, INSERT INTO SELECT다른 테이블의 데이터를 선택하여 대상 테이블에 일괄적으로 삽입하는 데 사용될 수 있습니다.

 

 

 

3. SELECT INTO 문

 

 SELECT INTO 문은 기존 테이블에서 데이터를 선택하여 새로운 테이블을 생성하는 데 사용되는 T-SQL(Transact-SQL) 문입니다. SELECT INTO 문은 원본 테이블의 스키마와 데이터를 기반으로 새로운 테이블을 생성하고, 선택한 데이터를 새로운 테이블에 삽입합니다.

※ T-SQL은 Microsoft SQL Server에서 사용되는 SQL의 확장버전이다. T-SQL은 조건문(if, case), 반복문(while, for), 예외 처리(try-catch)와 같은 프로그래밍 요소를 지원하여 복잡한 로직을 구현할 수 있습니다.

 

 기본적인 SELECT INTO 문의 구문은 다음과 같습니다.

SELECT 컬럼1, 컬럼2, ...
INTO NEW_테이블명
FROM 기존_테이블명
WHERE 조건;

 

 컬럼1, 컬럼2,... 들은 새로운 테이블에 포함될 컬럼을 나타냅니다. 이 컬럼들은 기존_테이블에서 선택한 컬럼과 동일한 데이터 유형 및 속성을 가지게 됩니다.

 

 SELECT INTO 문을 사용하면 기존 테이블의 데이터를 기반으로 새로운 테이블을 만들 수 있습니다. 이를 활용하여 데이터 변환, 필터링, 조인 등 다양한 데이터 조작 작업을 수행할 수 있습니다. 새로운 테이블은 선택한 데이터와 동일한 스키마를 가지며, 기존 테이블의 인덱스, 제약 조건 등은 복사되지 않습니다.

 

 저는 주로 임시테이블을 활용하는 쿼리를 작성하는 경우에 SELECT INTO문을 사용하고 있습니다.

SELECT 컬럼1, 컬럼2, ...
INTO #tmp
FROM 기존_테이블명
WHERE 조건;

 

 다음과 같이 SELECT INTO 문을 사용하면 새로운 테이블을 쉽게 생성할 수 있기 때문에 데이터의 백업이나 복사등의 작업을 편리하게 수행할 수 있습니다.

 

 만약 데이터를 제외하고 테이블의 구조만 동일한 테이블을 만들고자 할 경우에는 WHERE 조건을 활용하여 조회되는 데이터가 없도록 하면 됩니다.

SELECT 컬럼1, 컬럼2, ...
INTO NEW_테이블명
FROM 기존_테이블명
WHERE 1=2;