데이터 삽입

완료됨

Transact-SQL은 테이블에 행을 삽입하는 여러 가지 방법을 제공합니다.

INSERT 문

INSERT 문은 테이블에 하나 이상의 행을 추가하는 데 사용됩니다. INSERT 문에는 여러 가지 형식이 있습니다.

간단한 INSERT 문의 기본 구문은 아래와 같습니다.

INSERT [INTO] <Table> [(column_list)]
VALUES ([ColumnName or an expression or DEFAULT or NULL],…n)

INSERT VALUES라는 형식의 INSERT 문을 사용하면 값이 배치될 열과 테이블에 삽입된 각 행에서 데이터가 표시될 순서를 지정할 수 있습니다. column_list의 사용은 선택 사항이지만 사용하는 것이 좋습니다. column_list가 없으면 INSERT 문은 열이 정의된 순서대로 테이블의 모든 열의 값을 예상합니다. 열의 값을 쉼표로 구분된 목록으로 제공할 수도 있습니다.

값을 나열할 때 키워드 DEFAULT(기본값)는 테이블이 생성될 때 지정된 미리 정의된 값이 사용됨을 의미합니다. 기본값을 결정하는 방법에는 다음 세 가지가 있습니다.

  • 열이 자동으로 생성된 값을 갖도록 정의된 경우 해당 값이 사용됩니다. 자동 생성된 값은 이 모듈의 뒷부분에서 설명됩니다.
  • 테이블을 만들 때 열에 대한 기본값을 제공할 수 있으며 DEFAULT가 지정된 경우 해당 값이 사용됩니다.
  • 열이 NULL 값을 허용하도록 정의되고 열이 자동 생성된 열이 아니며 기본값이 정의되어 있지 않은 경우 NULL이 DEFAULT로 삽입됩니다.

테이블 생성에 대한 자세한 정보는 이 모듈에서 다루지 않습니다. 그러나 테이블에 어떤 열이 있는지 확인하는 것이 유용한 경우가 많습니다. 가장 쉬운 방법은 행을 반환하지 않고 테이블에서 SELECT 문을 실행하는 것입니다. TRUE가 될 수 없는 WHERE 조건을 사용하면 행이 반환되지 않습니다.

SELECT * FROM Sales.Promotion
WHERE 1 = 0;

이 문은 모든 열과 열의 이름을 표시하지만 NULL 허용 여부 또는 지정된 기본값의 여부와 같은 데이터 형식 또는 속성을 표시하지 않습니다. 쿼리의 출력 예는 다음과 같습니다.

PromotionName

StartDate

ProductModelID

할인

참고

이 테이블에 데이터를 삽입하려면 예시에 나와 있는 것처럼 INSERT 문을 사용할 수 있습니다.

INSERT INTO Sales.Promotion (PromotionName,StartDate,ProductModelID,Discount,Notes)
VALUES
('Clearance Sale', '01/01/2021', 23, 0.1, '10% discount');

위의 예에서는 모든 열에 대한 값을 올바른 순서로 제공하기 때문에 열 목록을 생략할 수 있습니다.

INSERT INTO Sales.Promotion
VALUES
('Clearance Sale', '01/01/2021', 23, 0.1, '10% discount');

현재 날짜의 기본값이 StartDate 열에 적용되고 Notes 열이 NULL 값을 허용하도록 테이블이 정의되어 있다고 가정합니다. 다음과 같이 값을 명시적으로 사용하도록 지정할 수 있습니다.

INSERT INTO Sales.Promotion
VALUES
('Pull your socks up', DEFAULT, 24, 0.25, NULL);

또는 INSERT 문에서 값을 생략할 수 있습니다. 기본값이 정의된 경우 기본값이 사용되고 기본값이 없지만 열이 NULL을 허용하는 경우 NULL이 삽입됩니다. 모든 열에 값을 제공하지는 않는 경우 제공하는 열 값을 표시하는 열 목록이 있어야 합니다.

INSERT INTO Sales.Promotion (PromotionName, ProductModelID, Discount)
VALUES
('Caps Locked', 2, 0.2);

INSERT VALUES 문은 한 번에 하나의 행을 삽입하는 것 외에도 쉼표로 구분된 여러 값 집합을 제공하여 여러 행을 삽입하는 데 사용할 수 있습니다. 값 집합도 다음과 같이 쉼표로 구분됩니다.

(col1_val,col2_val,col3_val),
(col1_val,col2_val,col3_val)

이 값 목록을 테이블 값 생성자라고 합니다. 다음 예시에서는 테이블 값 생성자를 통해 테이블에 두 개의 행을 더 삽입합니다.

INSERT INTO Sales.Promotion
VALUES
('The gloves are off!', DEFAULT, 3, 0.25, NULL),
('The gloves are off!', DEFAULT, 4, 0.25, NULL);

INSERT ... SELECT

T-SQL은 INSERT 문에서 리터럴 값 집합을 지정하는 것 외에도 다른 작업의 결과를 사용하도록 지원하여 INSERT에 값을 제공합니다. SELECT 문 또는 저장 프로시저의 출력 결과를 사용하여 INSERT 문에 값을 제공할 수 있습니다.

INSERT를 중첩된 SELECT와 함께 사용하려면 SELECT 문을 빌드하여 VALUES 절을 대체합니다. INSERT SELECT라는 형식을 사용하면 SELECT 쿼리에서 반환된 행 집합을 대상 테이블에 삽입할 수 있습니다. INSERT SELECT를 사용할 때 INSERT VALUES와 동일한 사항을 고려해야 합니다.

  • 필요에 따라 테이블 이름 다음에 열 목록을 지정할 수 있습니다.
  • 각 열에 열 값, DEFAULT 또는 NULL을 제공해야 합니다.

다음 구문에서는 INSERT SELECT를 사용하는 방법을 보여 줍니다.

INSERT [INTO] <table or view> [(column_list)]
SELECT <column_list> FROM <table_list>...;

참고

저장 프로시저(또는 동적 일괄 처리)의 결과 집합을 INSERT 문의 입력으로 사용할 수도 있습니다. INSERT EXEC라고 하는 형식의 INSERT는 개념적으로 INSERT SELECT와 유사하며 고려할 사항 또한 동일합니다. 그러나 저장 프로시저는 여러 결과 집합을 반환할 수 있으므로 각별한 주의가 필요합니다.

다음 예에서는 이름에 “frame”이 포함된 모든 모델에 대해 Production.ProductModel 테이블에서 모델 ID와 모델 이름을 검색하여 Get Framed라는 새 승격을 위해 여러 행을 삽입합니다.

INSERT INTO Sales.Promotion (PromotionName, ProductModelID, Discount, Notes)
SELECT DISTINCT 'Get Framed', m.ProductModelID, 0.1, '10% off ' + m.Name
FROM Production.ProductModel AS m
WHERE m.Name LIKE '%frame%';

하위 쿼리와 달리 INSERT와 함께 사용되는 중첩된 SELECT는 괄호로 묶지 않습니다.

SELECT ... INTO

INSERT SELECT와 유사하게 행을 삽입하는 또 다른 옵션은 SELECT INTO 문입니다. INSERT SELECT와 SELECT INTO의 가장 큰 차이점은 SELECT INTO는 항상 SELECT 결과를 기반으로 새 테이블을 만들므로 기존 테이블에 행을 삽입하는 데 사용할 수 없다는 것입니다. 새 테이블의 각 열은 SELECT 목록의 해당 열(또는 식)과 동일한 이름, 데이터 형식, Null 허용 여부를 가집니다.

SELECT INTO를 사용하려면 FROM 절 바로 앞에 있는 쿼리의 SELECT 절에 INTO <new_table_name>을 추가합니다. Sales.SalesOrderHeader 테이블에서 Sales.Invoice라는 새 테이블로 데이터를 추출하는 예제는 다음과 같습니다.

SELECT SalesOrderID, CustomerID, OrderDate, PurchaseOrderNumber, TotalDue
INTO Sales.Invoice
FROM Sales.SalesOrderHeader;

INTO 다음에 이름이 지정된 테이블이 이미 존재하는 경우 SELECT INTO는 실패합니다. 테이블을 만든 후에는 다른 테이블과 동일하게 처리할 수 있습니다. 테이블에서 선택하거나 다른 테이블에 조인하거나 추가 행을 삽입할 수 있습니다.