안녕하세요. SQLER의 코난 김대우입니다.
이번 강좌에서는, 2-11. SELECT INTO - 쿼리 결과를 테이블로 복사를 진행 하겠습니다.
SQLER에서 진행되는, 챗GPT와 함께 배우는 SQL Server 강좌 목록
이번에 진행할 내용은 SELECT INTO를 사용한 쿼리 결과를 데이터 복사입니다.
TL;DR
SELECT INTO 구문은 데이터 정의 절차 없이 테이블을 생성하고 데이터 삽입 가능합니다. 이미 존재하는 테이블에 삽입할 경우에는 INSERT SELECT를 사용해야 합니다. 주로 테스트 목적으로 사용되며, 다른 데이터베이스나 원격 서버의 데이터도 복사 가능합니다.
SELECT INTO 구문을 설명하기 전에 예제를 먼저 살펴보겠습니다.
USE AdventureWorks; GO -- AdventureWorks DB의 Production.Product 테이블 조회 SELECT * FROM Production.Product; GO
예제에서 여러 번 사용했던 Production.Product 테이블의 결과가 잘 보입니다. 이 테이블을 그대로 복사해서 새로 만들어야 하는 상황이 생겼습니다. 어떻게 하면 될까요? 이럴 경우 SELECT INTO를 사용합니다.
SELECT INTO를 이용한 쿼리 결과셋 복사
먼저, SELECT INTO를 사용한 결과셋 복사를 실행해 보겠습니다.
-- SELECT INTO로 CopyProduct 테이블로 쿼리 결과를 복사해 생성 SELECT * INTO CopyProduct FROM Production.Product; GO -- 데이터 조회 SELECT * FROM CopyProduct; GO
테스트로 조회해 보면 Production.Product과 같은 데이터를 포함하는 CopyProduct 테이블이 보입니다. 스키마를 지정하지 않았기 때문에, dbo 스키마로 설정되며, 생략해 CopyProduct만 지정합니다.
원본 테이블의 모든 데이터만 복사 가능할까요? 아닙니다. “결과셋” 복사이기 때문에 다양한 쿼리 결과를 복사할 수 있습니다.
-- Black 컬러의 일부 컬럼과 로우만 조회 - 이 결과를 테이블로 생성해야 함. SELECT Name, ProductNumber, Color FROM CopyProduct WHERE Color like 'Black'; GO -- SELECT INTO로 CopyProduct 테이블의 일부 컬럼과 로우 결과를 복사해 임시 테이블로 생성 SELECT Name, ProductNumber, Color INTO #BlackSmallProduct FROM CopyProduct WHERE Color like 'Black'; GO SELECT * FROM #BlackSmallProduct; GO -- 임시 테이블은 세션이 종료되면 사라짐.
이렇게 SQL 쿼리 결과를 이용해 필터링된 결과셋을 INTO로 복사할 수 있습니다.
몇 번 나왔던 테이블 앞에 #이 붙는 테이블은 임시테이블로 세션이 종료(현재 쿼리창 접속을 종료)되면 사라집니다.
SELECT INTO의 구문 정보
일반적인 데이터 정의 절차 없이 테이블을 정의하고 데이터를 넣을 수 있다.
SELECT select_list INTO new_table_name FROM table_list WHERE search_conditions |
쿼리 결과셋으로 새로운 테이블을 생성할 수 있습니다. select_list에서 지정한 컬럼, FROM 절의 테이블, WHERE 절에서 선택한 로우를 조합해 생성합니다.
고려사항
- 이미 존재하는 테이블로 행을 보내려면 INSERT SELECT 구문을 사용해야 한다.
- select_list에 컬럼 이름이 없는 경우, 생성된 테이블에서도 이름이 지정되지 않는다.
SELECT INTO는 원본 데이터를 복사해 테스트하거나 검토할 때 생각보다 자주 사용됩니다. 특히, 잠시 검토하고 테스트하는 게 목적이면 임시테이블로 생성해 사용합니다. SELECT INTO로 간단하게 원하는 결과셋을 복사할 수 있고, 다른 데이터베이스나 원격 서버의 데이터베이스 테이블로부터 데이터를 복사해 사용할 수도 있습니다.
--다른 데이터베이스로부터 복사 SELECT * INTO NewTable FROM 다른데이터베이스명.스키마명.테이블명 --원격 연결된 서버 데이터베이스로부터 복사 (Linked Server 등으로 미리 연결) SELECT * INTO NewTable FROM 원격서버명.다른데이터베이스명.스키마명.테이블명 --PolyBase로 Hadoop이나 AWS의 S3, Azure Storage 등의 데이터를 SQL로 복사할 때도 사용 가능
연결된 서버(Linked Server)나 PolyBase 하나도 모르시겠다고요? 걱정 마세요. SQL 강좌를 진행하면서 차근차근 설명해 드리겠습니다.
☑️ 챗GPT 활용: SQL Server의 연결된 서버(Linked Server)에 대해서 설명해 줘
SELECT INTO와 비슷한 INSERT SELECT 구문
나중에 배울 INSERT SELECT 구문도 SELECT INTO와 비슷합니다. 예제 데이터를 만들면서 수행했던 INSERT는 데이터를 삽입하는 쿼리입니다. 이미 생성된 테이블에 SELECT 결과셋을 INSERT로 일괄 삽입 처리 가능합니다.
아래 INSERT SELECT 쿼리는 참조만 하세요.
-- 이전에 생성했던 과제 상품 테이블 조회 SELECT * FROM products; GO -- 새로운 임시 테이블 #TestProducts 테이블 생성 CREATE TABLE #TestProducts ( product_id INT PRIMARY KEY, product_name NVARCHAR(10), price DECIMAL(10, 0) ); GO -- 테이블에 데이터 삽입 INSERT INTO #TestProducts (product_id, product_name, price) VALUES (5, N'꽃게랑', 2000); GO -- 테스트 조회 SELECT * FROM #TestProducts; GO -- INSERT SELECT로 products 테이블 데이터를 조회해 삽입 INSERT INTO #TestProducts SELECT product_id, product_name, price FROM products; GO -- 테스트 조회 SELECT * FROM #TestProducts; GO
SELECT INTO와 INSERT SELECT의 차이
SELECT INTO와 INSERT SELECT의 차이는 이렇게 쿼리 패턴입니다. INSERT SELECT는 테이블을 생성해야 하기 때문에, 테이블 정의를 설정하고 여러 테이블 Constraint(제약)도 추가할 수 있습니다. 하지만, SELECT INTO는 오직 데이터만 복사하기 때문에 이런 테이블 제약 등은 생성되지 않습니다.
테이블 제약 등등 모르는 이야기 투성이라고요? 차근차근 이어지는 강좌에서 배우게 되니 지금은 이런 게 있구나 정도만 기억해 두세요.
SQL 강좌 책 구매
강좌가 도움이 되셨다면, 책으로 구매 가능합니다. 책 판매 수익금은 전액 코딩 교육 사회공헌 활동에 기부되며, 아래 링크에서 구매하시면 더 많은 금액이 기부됩니다.