안녕하세요. 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 강좌 책 구매

강좌가 도움이 되셨다면, 책으로 구매 가능합니다. 책 판매 수익금은 전액 코딩 교육 사회공헌 활동에 기부되며, 아래 링크에서 구매하시면 더 많은 금액이 기부됩니다. 

 

책구매 링크: 챗GPT와 함께하는 마이크로소프트 SQL Server 2022 

책구매링크.png

No. Subject Author Date Views
Notice SQL강좌: 챗GPT와 함께 배우는 SQL Server 무료 강좌 목차와 소개 (2023년 9월 업데이트) 코난(김대우) 2023.08.18 28367
Notice Python 무료 강좌 - 기초, 중급, 머신러닝(2023년 6월 업데이트) 코난(김대우) 2021.01.01 15473
2234 SQL강좌: 2-12. SQL UNION 연산자 코난(김대우) 2023.08.18 55
» SQL강좌: 2-11. SELECT INTO - 쿼리 결과를 테이블로 복사 코난(김대우) 2023.08.18 102
2232 SQL강좌: 2-10. 하위 쿼리(Subquery-서브쿼리) 코난(김대우) 2023.08.18 74
2231 SQL강좌: 2-9. JOIN - 테이블 연결 file 코난(김대우) 2023.08.18 124
2230 SQL강좌: 2-8. GROUP BY, ROLLUP, CUBE 코난(김대우) 2023.08.18 124
2229 SQL강좌: 2-7. ORDER BY 결과 정렬 코난(김대우) 2023.08.18 84
2228 SQL강좌: 2-6. DISTINCT 문을 이용한 중복 제거 코난(김대우) 2023.08.18 86
2227 SQL강좌: 2-5. WHERE절의 조건에 의한 행의 검색 코난(김대우) 2023.08.18 85
2226 SQL강좌: 2-4. 데이터형(Data type)과 함수(Function) 코난(김대우) 2023.08.18 120
2225 SQL강좌: 2-3. SELECT - 컬럼선택 file 코난(김대우) 2023.08.18 156
2224 SQL강좌: 2-2. 데이터 검색 - SELECT 구문 file 코난(김대우) 2023.08.18 146
2223 SQL강좌: 2-1. T-SQL SQL Server 언어에 대한 간단한 소개 file 코난(김대우) 2023.08.18 141
2222 SQL강좌: 1-11. 예제 데이터베이스 설치 코난(김대우) 2023.08.18 188
2221 SQL강좌: 1-10. SQL Server 2022 관리 도구 소개 [2] file 코난(김대우) 2023.08.18 110
2220 SQL강좌: 1-9. 업그레이드와 설치 제거 file 코난(김대우) 2023.08.18 57
2219 SQL강좌: 1-8. SQL Server 2022 설치 - 컨테이너 file 코난(김대우) 2023.08.18 67
2218 SQL강좌: 1-7. SQL Server 2022 설치 - 리눅스 file 코난(김대우) 2023.08.18 84
2217 SQL강좌: 1-6. SQL Server 2022 설치 - 윈도 [2] file 코난(김대우) 2023.08.18 243
2216 SQL강좌: 1-5. SQL클라우드와 On-Premise file 코난(김대우) 2023.08.18 101
2215 SQL강좌: 1-4. SQL Server 설치 전 점검사항 file 코난(김대우) 2023.08.18 101





XE Login