ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 데이터 삽입하기
    Database/SQL 2023. 9. 29. 17:20
    728x90

    목표

    • INSERT 문을 이용해 테이블에 데이터를 삽입하는 방법을 알아본다.

    목차

    1. [데이터 삽입 이해하기](#데이터 삽입 이해하기)
    2. [다른 테이블로 복사하기](#다른 테이블로 복사하기)

    데이터 삽입 이해하기

    INSERT 문은 데이터베이스 테이블에 행을 삽입하기 위해 사용하고, 여러 가지 방법으로 사용할 수있다.

    • 완전한 행 삽입하기
    • 부분 행 삽입하기
    • 쿼리 결과 삽입하기

    완전한 행 삽입하기

    테이블에 데이터를 삽입하는 가장 간단한 방법은 기본 INSERT 문을 사용하는것으로 테이블 이름을 명시하고 새로운 행에 삽입하려는 값을 넣는 것이다.

    INSERT INTO Customers VALUES (1000000006,
    			      'Toy Land',
                                  '123 Any Street',
                                  'New York',
                                  'NY',
                                  '11111',
                                  'USA', 
                                   NULL,
                                   NULL);

    이 문법은 간단하지만, 안전한 방법은 아니기 때문에 이런 식의 사용은 피해야 한다.


    SQL 문은 테이블에 정의된 열의 순서에 전적으로 의존하고 있기 때문에, 이와 같은 SQL 문을 작성하려면 열의 순서를 정확히 알고 있어야 한다.

    즉, 이렇게 사용해도 문제될건 없지만 중요한 것은 이후에도 테이블이 똑같은 순서대로 구성될 것이라는 보장이 전혀 없다는 것이다.

    그래서 특정 열의 순서에 의존해 SQL 문을 작성하는 것은 매우 위험하고, 언젠가는 오류가 발생할 가능성이 크다.

     

    INSERT 문을 더 안전하게 사용할 수 있는 방법은 다음과 같다.

    INSERT INTO Customers (
    cust_id,cust_name,cust_address,cust_city,cust_state,cust_zip,
    cust_country,cust_contact,cust_email)
    
    VALUES (
    1000000007,'Toy Land','123 Any Street','New York','NY','11111','USA',NULL,NULL);

    실제 테이블에서 정의한 열 순서가 아니라 INSERT 문에서 정의한 열 순서대로 VALUES 값이 매치된다.

    이 방법의 장점은 추후에 테이블 구조가 변경되더라도 INSERT 문이 올바르게 작동한다는 점이다.

    [!NOTE] 항상 열 목록을 사용하자.
    INSERT 문을 사용할 때 열 목록을 적는 것을 규칙으로 삼기 바란다.
    그래야 테이블이 변경되는 상황에도 SQL이 계속 동작할 수 있다.

    [!NOTE] VALUES를 사용할 때 주의점
    어떤 INSERT 문을 사용하느냐에 관계없이 VALUES에 있는 값은 열의 개수와 항상 맞춰야 한다.
    열 이름을 생략할 때는 테이블에 있는 모든 열의 수에 맞게, 열 목록을 사용하면 목록에 있는 열의 수에 맞도록 값을 적는다.
    열과 값의 수가 다르면, 에러 메시지가 발생하고 행은 삽입 되지 않는다.

    부분 행 삽입하기

    INSERT 문을 사용할 때는 테이블의 열 이름을 적어주는 것을 권하고, 이 문법을 사용하면 모든 열의 값을 다 쓰지 않아도 된다.

    특정 열에만 값을 지정할 수 있다는 말이다.

    INSERT INTO Customers (
    cust_id,cust_name,cust_address,cust_city,cust_state,cust_zip,cust_country
    ) 		
    VALUES(
    1000000006,'Toy Land','123 Any Street','New York','NY','11111','USA'
    );

    테이블 정의에서 허용하는 열만 INSERT 문에서 생략할 수 있는데, 아래 조건 중 하나는 존재해야 한다.

    • 열을 정의할 때 NULL 값을 허용한다.
    • 테이블 정의에 기본값이 설정되어, 값이 명시되지 않으면 기본값으로 삽입된다.

    필수적인 값을 누락하면 안된다. NULL을 허용하지 않고, 기본값이 없는 열 값을 누락시킨 경우 DBMS에서 에러 메시지가 발생한다.

    검색 결과 삽입하기

    보통은 특정 값을 삽입할 때 INSERT문을 사용하지만, SELECT 문에서 가져온 결과를 테이블에 넣는 형태도 있다.

    INSERT SELECT 문인데, 이름에서 유추할 수 있는 것처럼 INSERT문과 SELECT문으로 구성된다.

    INSERT INTO Customers (
    cust_id,cust_contact,cust_email,cust_name,cust_address,cust_city,cust_state,
    cust_zip,cust_cust_country)
    
    SELECT cust_id,cust_contact,cust_email,cust_name,cust_address,cust_city,cust_state,
    cust_zip,cust_country 
    FROM CustNew;

    이 예제에서는 INSERT와 SELECT 문에서 모두 같은 열 이름을 사용했지만, 열 이름이 반드시 같아야 할 필요는 없다.

    사실 DBMS는 SELECT 문으로 반환되는 열 이름에 신경 쓰지 않는다.

    그보다는 열의 위치를 사용한다. 즉, SELECT문의 첫 번째 열(이름과는 무관하게)은 첫 번째 지정된 테이블의 열로 들어가고,

    이후도 마찬가지로 동작한다.

    INSERT SELECT 문에서 사용하는 SELECT 문에서는 WHERE 절을 사용해서 가져오는 데이터 필터링한 후 삽입할 수도 있다.

    [!NOTE] 여러 개의 행 삽입하기
    INSERT문은 보통 하나의 행을 삽입하기 때문에 여러 개의 행을 삽입하려면 INSERT 문을 여러 번 실행해야 한다.
    이 때 INSERT SELECT 문을 사용하면,
    결과로 가져오는 행을 모두 삽입하기 때문에 하나의 문장으로 여러 행을 삽입할 수 있다.

    다른 테이블로 복사하기

    INSERT 문을 전혀 사용하지 않고 데이터를 삽입할 수 있는 또 다른 방법이 있다. 테이블에 있는 내용을 완전히 새로운 테이블

    (테이블을 바로 생성하여)에 복사할 때 CREATE SELECT문(SQL Sever는 SELECT INTO 문)을 사용하는 것이다.

     

    이미 존재하는 테이블에 데이터를 추가하는 INSERT SELECT 문과 달리 CREATE SELECT 문은 새로운 테이블에 데이터를 복사한다.

    (사용하는 DBMS에 따라 테이블이 존재한다면 덮어쓸 수 있다.)

    CREATE TABLE CustCopy AS 
    SELECT * 
    FROM Customers;  
    
    SELECT * FROM CustCopy;
    # for SQL Server SELECT * INTO CustCopy FROM Customers;

    SELECT INTO는 다음과 같은 특징이 있다.

    • WHERE나 GROUPY BY 절과 같은 SELECT 문의 옵션을 모두 사용할 수 있다.
    • 여러 테이블에 있는 데이터를 삽입하기 위해 조인을 사용할 수 있다.
    • 데이터를 가져온 테이블 수와 관계없이, 가져온 데이터는 하나의 테이블에 삽입된다.

    여기서 설명된 테이블 복사 기술은 새로운 SQL 문을 사용하기 전에, SELECT INTO로 테이블을 복사하여 테스트할 수 있는 매우 좋은 방법이다.

     


    'Database > SQL' 카테고리의 다른 글

    고급 테이블 조인 생성  (0) 2023.09.29
    데이터 그룹핑  (0) 2023.09.29
    데이터 업데이트, 삭제  (0) 2023.09.29
    데이터 요약  (0) 2023.09.29
    데이터 조작 함수 사용하기  (0) 2023.09.29
Designed by Tistory.