SQL INSERT INTO SELECT 문. Transact-SQL - 데이터 삽입 행의 일부 추가

SQL을 사용하면 한 테이블에서 다른 테이블로 정보를 복사할 수 있습니다.

INSERT INTO SELECT 문은 한 테이블의 데이터를 복사하여 기존 테이블에 삽입합니다.

SQL INSERT INTO SELECT 문,

INSERT INTO SELECT 문은 한 테이블에서 데이터를 선택하여 기존 테이블에 삽입합니다. 대상 테이블의 기존 행은 변경되지 않습니다.

SQL INSERT INTO SELECT, 구문

한 테이블의 모든 열을 기존 테이블의 다른 테이블로 복사할 수 있습니다.

에 집어 넣다 테이블 2
선택 *에서 1 번 테이블;

또는 원하는 열만 다른 기존 테이블에 복사할 수 있습니다.

에 집어 넣다 테이블 2
(열_이름)
선택하다 컬럼_이름
에서 1 번 테이블;

데이터베이스의 데모 버전

이 튜토리얼에서는 잘 알려진 Northwind 데이터베이스를 사용합니다.

다음은 "고객" 테이블에서 선택한 항목입니다.

사용자 ID고객의 이름연락 담당자주소도시우편번호국가
1 알프레드 푸터키스테 마리아 앤더스 오베레 거리 57 베를린 12209 독일
2 Ana Trujillo Emparedados y helados 아나 트루히요 Avda. 드 라 헌법 2222 멕시코 D.F. 05021 멕시코
3 안토니오 모레노 타케리아 안토니오 모레노 마타데로스 2312 멕시코 D.F. 05023 멕시코

그리고 "공급업체" 테이블에서 선택한 항목은 다음과 같습니다.

SQL INSERT INTO SELECT, 예

"공급업체"에서 "고객"으로 몇 개의 열만 복사:

독일 공급업체만 "고객"으로 복사합니다.

마지막 업데이트: 2017년 7월 13일

데이터를 추가하려면 다음과 같은 공식 구문이 있는 INSERT 명령을 사용하십시오.

INSERT 테이블_이름 [(열_목록)] VALUES (값1, 값2, ... 값N)

먼저 INSERT INTO 표현식이 나온 다음 괄호 안에 데이터를 추가해야 하는 열의 쉼표로 구분된 목록을 지정할 수 있으며 마지막에는 VALUES라는 단어 뒤에 열에 추가할 값이 나열됩니다. 괄호.

예를 들어 다음 데이터베이스가 이전에 생성되었다고 가정합니다.

데이터베이스 제품db 생성; GO USE 제품DB; CREATE TABLE 제품(Id INT IDENTITY PRIMARY KEY, ProductName NVARCHAR(30) NOT NULL, Manufacturer NVARCHAR(20) NOT NULL, ProductCount INT DEFAULT 0, Price MONEY NOT NULL)

INSERT 명령을 사용하여 한 줄을 추가해 보겠습니다.

제품 값 삽입("iPhone 7", "Apple", 5, 52000)

SQL Server Management Studio에서 성공적으로 실행되면 메시지 필드에 "1개 행이 영향을 받았습니다."라는 메시지가 표시되어야 합니다.

VALUES 키워드 뒤에 괄호 안의 열에 대한 값이 선언된 순서대로 전달된다는 점을 고려해 볼 만합니다. 예를 들어 위의 CREATE TABLE 문에서 첫 번째 열이 Id임을 알 수 있습니다. 그러나 IDENTITY 속성이 지정되어 있으므로 이 열의 값은 자동으로 생성되며 생략할 수 있습니다. 두 번째 열은 ProductName을 나타내므로 첫 번째 값인 "iPhone 7" 문자열이 해당 열에 전달됩니다. 두 번째 값인 문자열 "Apple"은 세 번째 열 Manufacturer로 전달됩니다. 즉, 값은 다음과 같이 열에 전달됩니다.

    제품명: "iPhone 7"

    제조사 : "애플"

또한 값을 입력할 때 값이 추가될 바로 옆 열을 지정할 수 있습니다.

INSERT INTO Products(제품 이름, 가격, 제조업체) VALUES("iPhone 6S", 41000, "Apple")

여기서는 세 개의 열에 대해서만 값이 지정됩니다. 또한 이제 값은 열 순서대로 전송됩니다.

    제품명: "iPhone 6S"

    제조사 : "애플"

지정되지 않은 열(이 경우 ProductCount)의 경우 DEFAULT 속성이 지정되면 기본값이 추가되거나 NULL 값이 추가됩니다. 그러나 지정되지 않은 열은 null을 허용하거나 DEFAULT 속성이 있어야 합니다.

한 번에 여러 줄을 추가할 수도 있습니다.

INSERT INTO Products VALUES ("iPhone 6", "Apple", 3, 36000), ("Galaxy S8", "Samsung", 2, 46000), ("Galaxy S8 Plus", "Samsung", 1, 56000)

이 경우 테이블에 세 개의 행이 추가됩니다.

또한 추가할 때 DEFAULT 키워드를 사용하여 열이 기본값을 갖거나 NULL 값을 갖도록 지정할 수 있습니다.

제품에 삽입(제품 이름, 제조업체, 제품 개수, 가격) VALUES("Mi6", "Xiaomi", DEFAULT, 28000)

이 경우 ProductCount 열의 기본값이 사용됩니다(설정된 경우에는 NULL, 설정되지 않은 경우에는 NULL).

모든 열에 기본값을 지정하는 DEFAULT 속성이 있거나 null을 허용하는 경우 모든 열에 기본값을 삽입할 수 있습니다.

제품에 기본 값 삽입

그러나 Products 테이블을 사용하면 여러 필드에 DEFAULT 속성이 없고 동시에 NULL 값을 허용하지 않기 때문에 이러한 명령은 오류와 함께 실패합니다.

앞에서 설명한 SELECT 문 외에도 DML(데이터 조작 언어)에는 INSERT, UPDATE 및 DELETE라는 세 가지 다른 문이 포함되어 있습니다. SELECT 문과 마찬가지로 이 세 문은 테이블이나 뷰에서 작동합니다. 이 문서에서는 INSERT 문에 대해 설명하고 다른 두 문에 대해서는 다음 문서에서 설명합니다.

INSERT 문테이블에 행(또는 행의 일부)을 삽입합니다. 이 명령에는 두 가지 형태가 있습니다.

INSERT tab_name [(col_list)] 기본 값 | VALUES (( DEFAULT | NULL | 표현식 ) [ ,...n]) INSERT INTO tab_name | view_name [(col_list)] (select_statement |execute_statement) 구문 규칙

명령의 첫 번째 형식을 사용하면 하나의 행(또는 그 일부)을 테이블에 삽입할 수 있습니다. 그리고 INSERT 문의 두 번째 형식을 사용하면 SELECT 문의 결과 집합이나 EXECUTE 문에 의해 실행된 저장 프로시저를 테이블에 삽입할 수 있습니다. 저장 프로시저는 테이블에 삽입할 데이터를 반환해야 합니다. INSERT 문과 함께 사용하는 경우 SELECT 문은 해당 열의 데이터 유형이 호환되는 한 데이터가 삽입되는 다른 테이블이나 동일한 테이블에서 값을 선택할 수 있습니다.

두 형식 모두 삽입된 각 값의 데이터 유형은 해당 테이블 열의 데이터 유형과 호환되어야 합니다. 모든 문자열과 임시 데이터는 따옴표로 묶어야 합니다. 숫자 값은 따옴표로 묶을 필요가 없습니다.

단일 행 삽입

두 가지 형태의 INSERT 문의 경우 열 목록을 명시적으로 지정하는 것은 선택 사항입니다. 열을 나열하지 않는 것은 테이블의 모든 열을 지정하는 것과 같습니다.

기본 값 매개변수모든 열에 기본값을 삽입합니다. TIMESTAMP 데이터 유형 또는 IDENTITY 속성이 있는 열은 기본적으로 시스템에서 자동으로 생성된 값으로 삽입됩니다. 다른 데이터 유형의 열의 경우 해당하는 Null이 아닌 기본값이 사용 가능한 경우 삽입되고, 그렇지 않으면 NULL이 삽입됩니다. 열이 Null 값을 허용하지 않고 기본값이 정의되어 있지 않으면 INSERT 문이 실패하고 메시지가 표시됩니다.

아래 예에서는 SampleDb 데이터베이스의 Employee 테이블에 행을 삽입하고 INSERT 문을 사용하여 데이터베이스에 소량의 데이터를 삽입하는 방법을 보여줍니다.

SampleDb를 사용하세요. 직원 값에 삽입(34990, "Andrey", "Batonov", "d1"); 직원 값에 삽입(38640, "Alexey", "Vasin", "d3");

새 행에 값을 삽입하는 방법에는 두 가지가 있습니다. 아래 예의 INSERT 문은 NULL 키워드를 명시적으로 사용하고 해당 열에 NULL 값을 삽입합니다.

SampleDb를 사용하세요. 직원 값에 삽입(34991, "Andrey", "Batonov", NULL);

테이블의 일부(전부는 아님) 열에 값을 삽입하려면 일반적으로 해당 열을 명시적으로 지정해야 합니다. 지정되지 않은 열은 NULL 값을 허용하거나 기본값이 정의되어 있어야 합니다.

SampleDb를 사용하세요. INSERT INTO Employee(Id, FirstName, LastName) VALUES (34992, "Andrey", "Batonov");

앞의 두 예제는 동일합니다. Employee 테이블에서 NULL 값을 허용하는 유일한 열은 DepartmentNumber 열이며, 다른 모든 열은 CREATE TABLE 문의 NOT NULL 절에 의해 비활성화되었습니다.

값의 순서 가치 제안 INSERT 문은 CREATE TABLE 문에 지정된 순서와 다를 수 있습니다. 이 경우 순서는 해당 열이 열 목록에 나열되는 순서와 일치해야 합니다. 아래는 원본과 다른 순서로 데이터를 삽입하는 예입니다.

SampleDb를 사용하세요. INSERT INTO Employee(부서 번호, 성, ID, 이름) VALUES ("d1", "Batonov", 34993, "Andrey");

여러 행 삽입

INSERT 문의 두 번째 형식은 하위 쿼리에서 선택한 하나 이상의 행을 테이블에 삽입합니다. 아래 예에서는 INSERT 문의 두 번째 형식을 사용하여 테이블에 행을 삽입하는 방법을 보여줍니다. 이 경우 모스크바에 위치한 부서의 번호와 이름을 선택하는 쿼리가 실행되고 결과 결과 집합이 이전에 생성된 새 테이블에 로드됩니다.

위 예에서 생성된 새 MoscowDepartment 테이블에는 누락된 Location 열을 제외하고 기존 Department 테이블과 동일한 열이 있습니다. INSERT 문의 하위 쿼리는 Department 테이블에서 Location 열 값이 "Moscow"인 모든 행을 선택한 다음 쿼리 시작 시 생성된 새 테이블에 삽입됩니다.

아래 예에서는 INSERT 문의 두 번째 형식을 사용하여 테이블에 행을 삽입하는 또 다른 방법을 보여줍니다. 이 경우 프로젝트 p2에서 근무하는 "관리자" 직위의 모든 직원에 대한 인원 번호, 프로젝트 번호 및 프로젝트 시작 날짜를 선택하고 결과 결과 집합을 프로젝트 시작 시 생성된 새 테이블에 로드하는 쿼리가 실행됩니다. 쿼리:

SampleDb를 사용하세요. CREATE TABLE ManagerTeam(EmpId INT NOT NULL, ProjectNumber CHAR (4) NOT NULL, EnterDate DATE); ManagerTeam에 삽입(EmpId, ProjectNumber, EnterDate) SELECT EmpId, ProjectNumber, EnterDate FROM Works_on WHERE Job = "Manager";

INSERT 문을 사용하여 행을 삽입하기 전에는 MoscowDepartment 및 ManagerTeam 테이블(위 예에서)이 비어 있었습니다. 테이블이 이미 존재하고 데이터가 있는 행을 포함하고 있는 경우 새 행이 테이블에 추가됩니다.

이전 섹션에서는 미리 생성된 테이블에서 데이터를 검색하는 작업을 살펴보았습니다. 이제 테이블을 생성/삭제하고, 새 레코드를 추가하고, 이전 레코드를 삭제하는 방법을 알아볼 차례입니다. 이러한 목적을 위해 SQL다음과 같은 연산자가 있습니다. 만들다- 테이블을 생성하고, 바꾸다- 테이블 구조를 변경합니다. 떨어지다- 테이블이나 필드를 삭제합니다. 끼워 넣다- 테이블에 데이터를 추가합니다. 운영자로부터이 운영자 그룹에 대해 알아 봅시다. 끼워 넣다.

1. 전체 라인 추가

이름에서 알 수 있듯이 운영자는 끼워 넣다데이터베이스 테이블에 행을 삽입(추가)하는 데 사용됩니다. 추가는 여러 가지 방법으로 수행할 수 있습니다.

  • - 한 줄 전체 추가
  • - 라인의 일부를 추가
  • - 쿼리 결과를 추가합니다.

따라서 테이블에 새 행을 추가하려면 테이블 이름을 지정하고 열 이름을 나열한 다음 구문을 사용하여 각 열의 값을 지정해야 합니다. 에 집어 넣다 table_name(필드1, 필드2 ...) 가치 (값1, 값2...). 예를 살펴보겠습니다.

판매자(ID, 주소, 도시, 판매자_이름, 국가) VALUES에 삽입하세요.("6", "1번가", "로스앤젤레스", "해리 먼로", "USA")

열 이름의 순서도 변경할 수 있지만 동시에 매개변수 값의 순서도 변경해야 합니다. 가치.

2. 선의 일부 추가

이전 예에서 연산자를 사용할 때 끼워 넣다테이블 열 이름을 명시적으로 표시했습니다. 이 구문을 사용하면 일부 열을 건너뛸 수 있습니다. 이는 일부 열에는 값을 입력하고 다른 열에는 제공하지 않음을 의미합니다. 예를 들어:

판매자(ID, 도시, Seller_name) VALUES에 삽입하세요.("6", "로스앤젤레스", "해리 먼로")

이 예에서는 두 열의 값을 지정하지 않았습니다. 주소그리고 국가. 명령문에서 일부 열을 제외할 수 있습니다. 에 집어 넣다, 테이블 정의가 허용되는 경우. 이 경우 조건 중 하나가 충족되어야 합니다. 이 열은 유효한 것으로 정의됩니다. 없는(값 없음) 또는 테이블 정의에 지정된 기본값입니다. 즉, 값을 지정하지 않으면 기본값이 사용됩니다. 행에 값이 표시되는 것을 허용하지 않는 테이블의 열이 누락된 경우 없는정의된 기본값이 없으면 DBMS는 오류 메시지를 생성하고 행이 추가되지 않습니다.

3. 선택한 데이터 추가

이전 예에서는 쿼리에 데이터를 수동으로 입력하여 테이블에 데이터를 삽입했습니다. 그러나 운영자는 에 집어 넣다다른 테이블의 데이터를 삽입하려는 경우 이 프로세스를 자동화할 수 있습니다. 이 목적을 위해 SQL에는 다음과 같은 구성이 있습니다. 삽입 ... 선택 .... 이 디자인을 사용하면 한 테이블에서 데이터를 동시에 선택하고 다른 테이블에 삽입할 수 있습니다. 다른 테이블이 있다고 가정하자 판매자_EU유럽에 있는 우리 상품 판매자 목록이 있고 이를 일반 테이블에 추가해야 합니다. 판매자. 이러한 테이블의 구조는 동일하지만(열 수 및 이름 동일) 데이터가 다릅니다. 이를 위해 다음 쿼리를 작성할 수 있습니다.

INSERT INTO 판매자(ID, 주소, 도시, 판매자_이름, 국가) SELECTID, 주소, 도시, Seller_name, 국가 FROM Sellers_EU

내부 키의 값이 반복되지 않도록 주의가 필요합니다(필드 ID) 그렇지 않으면 오류가 발생합니다. 운영자 선택하다제안 사항도 포함될 수 있습니다. 어디데이터를 필터링합니다. 또한 DBMS는 명령문에 포함된 열 이름에 주의를 기울이지 않는다는 점에 유의해야 합니다. 선택하다, 배열된 순서만이 그녀에게 중요합니다. 따라서 선택한 첫 번째 지정된 열의 데이터는 다음과 같습니다. 선택하다, 어쨌든 테이블의 첫 번째 열에 채워집니다. 판매자, 연산자 뒤에 지정됨 에 집어 넣다, 필드 이름에 관계없이.

4. 한 테이블에서 다른 테이블로 데이터 복사

데이터베이스 작업을 할 때 백업이나 수정을 위해 테이블의 복사본을 만들어야 하는 경우가 종종 있습니다. 테이블의 전체 복사본을 만들기 위해 SQL은 별도의 명령문을 제공합니다. 선택. 예를 들어, 테이블의 복사본을 만들어야 합니다. 판매자, 다음과 같이 요청을 작성해야 합니다.

SELECT * INTO Sellers_new FROM 판매자

이전 디자인과 다르게 삽입 ... 선택 ...기존 테이블에 데이터가 추가되면 해당 데이터가 새 테이블에 복사됩니다. 첫 번째 구성이 데이터를 가져오고 두 번째 구성이 데이터를 내보낸다고 말할 수도 있습니다. 디자인을 사용할 때 선택 ... INTO ... FROM ...다음 사항을 고려해야 합니다.

  • - 연산자에 어떤 문장이라도 사용할 수 있습니다 선택하다, 와 같은 그룹 기준그리고 가지고 있는
  • - 조인을 사용하여 여러 테이블의 데이터를 추가할 수 있습니다.
  • - 데이터를 가져온 테이블 수에 관계없이 하나의 테이블에만 데이터를 추가할 수 있습니다.

이 문은 테이블에 하나 이상의 레코드를 추가합니다(추가 쿼리 수행).

통사론

여러 레코드 추가 요청:

에 집어 넣다 final_object [(필드1[, 필드2[, ...]])]
선택하다 [ 원천.]필드1[, 필드2[, ...]
에서 테이블 표현식

하나의 레코드 추가 요청:

에 집어 넣다 final_object [(필드1[, 필드2[, ...]])]
값( 필드1[, 필드2[, ...])

INSERT INTO 문은 다음 요소로 구성됩니다.

부분

설명

final_object

레코드가 추가되는 테이블 또는 쿼리의 이름입니다.

필드1, 필드2

논쟁 후 final_object- 데이터가 추가되는 필드 이름 논쟁 후 원천- 데이터가 추출되는 필드의 이름입니다.

외부_데이터베이스

외부 데이터베이스의 경로입니다. 경로에 대한 설명은 IN 절에 대한 문서를 참조하세요.

원천

레코드가 복사되는 테이블 또는 쿼리의 이름입니다.

테이블 표현식

레코드를 검색하려는 하나 이상의 테이블 이름입니다. 이 인수는 개별 테이블의 이름, INNER JOIN, LEFT JOIN 또는 RIGHT JOIN을 사용하여 생성된 결과 표현식 또는 저장된 쿼리일 수 있습니다.

값1, 값2

새 레코드의 특정 필드에 추가될 값입니다. 각 값은 목록의 해당 위치에 해당하는 필드에 삽입됩니다. 값1에 추가됨 필드1새로운 항목, 값2- V 필드2등. 값을 쉼표로 구분하고 텍스트 필드를 따옴표(" ")로 묶어야 합니다.

노트

INSERT INTO 문은 위 구문을 사용하여 테이블에 단일 레코드를 추가할 수 있습니다. 이 경우 레코드의 각 필드에 이름과 값을 지정합니다. 값이 할당된 레코드의 모든 필드와 해당 값을 지정해야 합니다. 필드 값을 지정하지 않으면 기본값 또는 NULL이 할당됩니다. 레코드는 테이블 끝에 추가됩니다.

INSERT INTO 문은 위에 표시된 대로 SELECT... FROM 절을 사용하여 다른 테이블이나 쿼리에서 레코드 집합을 추가하는 데에도 사용할 수 있습니다(여러 레코드 추가를 위한 쿼리 구문 참조). 이 경우 SELECT 절은 지정된 항목에 추가할 필드를 지정합니다. final_object.

원천또는 final_object테이블 또는 쿼리일 수 있습니다. 쿼리가 제공되면 Microsoft Access 데이터베이스 엔진은 반환되는 모든 테이블에 레코드를 추가합니다.

INSERT INTO 문을 사용하는 것은 선택 사항입니다. 지정된 경우 SELECT 문 앞에 와야 합니다.

대상 테이블에 기본 키가 포함되어 있는 경우 하나 이상의 기본 키 필드에 추가하는 값이 고유하고 다른 값인지 확인하세요. 없는; 그렇지 않으면 항목이 추가되지 않습니다.

카운터 필드가 있는 테이블에 레코드가 추가되고 번호를 다시 매기려는 경우 쿼리에 카운터 필드를 포함하지 마십시오. 필드의 원래 값을 유지하려면 쿼리에 카운터 필드를 포함하세요.

IN 절을 사용하여 다른 데이터베이스의 테이블에 레코드를 추가할 수 있습니다.

테이블을 생성하려면 SELECT... INTO 문을 사용하여 쿼리하여 테이블을 생성합니다.

추가 쿼리를 실행하기 전에 동일한 선택 기준으로 선택 쿼리를 사용하여 결과를 사용하여 추가할 레코드를 결정합니다.

추가 쿼리는 하나 이상의 테이블에서 다른 테이블로 레코드를 복사합니다. 이 경우 추가된 레코드가 포함된 테이블은 변경되지 않은 상태로 유지됩니다.

다른 테이블의 레코드를 추가하는 대신 VALUES 절을 사용하여 별도의 새 레코드에 각 필드의 값을 설정할 수 있습니다. 필드 목록이 생략된 경우 VALUES 절에는 각 테이블 필드에 해당하는 값이 포함되어야 합니다. 그렇지 않으면 INSERT 작업이 실패합니다. 생성하려는 각 추가 레코드에 대해 VALUES 절과 함께 INSERT INTO 문을 사용합니다.