[SQL] 15장. 데이터 삽입하기

김상현·2022년 10월 5일
0

SQL

목록 보기
15/22
post-thumbnail

[손에 잡히는 10분 SQL - 벤 포터 지음, 박남혜 옮김] 책의 학습 후 정리자료입니다.


📍 데이터 삽입 이해하기

  • INSERT 문은 데이터베이스 테이블에 행을 삽입하기 위해 사용한다.
  • INSERT 문은 완전한 행 삽입하기, 부분 행 삽입하기, 쿼리 결과 삽입하기와 같은 여러가지 방법으로 사용할 수 있다.

💡 INSERT와 시스템 보안

  • INSERT 문을 사용하려면 특별한 보안 권한이 필요할 수 있다.
  • INSERT 문을 사용하기 전에 적절한 권한을 갖고 있는지 확인해야 한다.

📌 완전한 행 삽입하기

  • 테이블에 데이터를 삽입하는 가장 간단한 방법은 기본 INSERT 문을 사용하는 것이다.
  • 테이블 열에 저장되는 데이터는 VALUES 절에 쓰면 된다.
  • 모든 열에 값을 반드시 적어야 한다.
  • 아무 값도 가지지 않는 열이 있다면 NULL을 써야 한다(테이블에서 NULL 값을 허용한다고 가정하였다).
INSERT INTO Customers
VALUES (1000000006,
        'Toy Land',
        '123 Any Street',
        'New York',
        'NY',
        '11111',
        'USA',
        NULL,
        NULL);

💡 INTO 키워드

  • 일부 SQL 실행 환경에서는 INSERT 문 뒤에 나오는 INTO를 써도 되고 안 써도 된다. 하지만, 무조건 이 키워드를 쓰는 것이 좋다. 그래야 이 SQL 코드를 다른 DBMS 에서도 문제 없이 실행할 수 있다.

  • 위에서 사용한 INSERT 문은 문법은 간단하지만 안전한 방법이 아니기 때문에 기피해야 하는 방식이다.

  • 이 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 (1000000006,
        'Toy Land',
        '123 Any Street',
        'New York',
        'NY',
        '11111',
        'USA',
        NULL,
        NULL);

💡 항상 열 목록을 사용하자

  • INSERT 문을 사용할 때 열 목록을 반드시 작성하자.
  • 열 목록을 작성하면 테이블이 변경되는 상황에도 SQL이 계속 동작할 수 있다.

❗️ VALUES를 사용할 때 주의점

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

📌 부분 행 삽입하기

  • 부분 행 삽입하기는 모든 열의 값을 다 쓰지 않아도 된다.
  • 몇 개의 열에만 값을 지정할 수 있다.
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에서 에러 메시지를 출력하고 그 행은 삽입되지 않는다.

📌 검색 결과 삽입하기

  • SELECT 문에서 가져온 결과를 INSERT 문을 통해 테이블에 삽입하는 경우도 있다.

🧷 Customers 테이블에 고객 목록 추가하기 예제

  • CustNew 테이블에 있는 고객 정보를 Customers 테이블로 가져온다.
INSERT INTO Customers (cust_id,
                       cust_contact,
                       cust_email,
                       cust_name,
                       cust_address,
                       cust_city,
                       cust_state,
                       cust_zip,
                       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 안의 열 이름

  • 위 예제에서는 INSERT SELECT 문에서 모두 같은 열 이름을 사용한다.
  • 하지만 열 이름이 반드시 같아야 할 필요는 없다. DBMS는 SELECT 문으로 반환되는 열 이름에는 신경쓰지 않는다.
  • 그보다는 열 위치를 사용한다.
  • SELECT 문의 첫 번째 열(이름과는 관계없이)은 첫 번째 지정된 테이블의 열로 들어가고, 그 이후도 마찬가지로 동작한다.

💡 여러 개의 행 삽입하기

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

📍 다른 테이블로 복사하기

  • INSERT 문을 전혀 사용하지 않고 데이터를 삽입할 수 있는 방법은 테이블에 있는 내용을 완전히 새로운 테이블에 복사할 때 CREATE SELECT 문을 사용하는 것이다.
  • 이미 존재하는 테이블에 데이터를 추가하는 INSERT SELECT 문과는 달리 CREATE SELECT 문은 새로운 테이블에 데이터를 복사한다.
CREATE TABLE CustCopy AS SELECT * FROM Customers;

SELECT *
FROM CustCopy;

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

📍 도전 과제

  1. INSERT 문과 지정된 열을 사용해 여러분의 정보를 Customers 테이블에 만들어 보자.
INSERT INTO Customers (cust_id,
                       cust_name,
                       cust_address,
                       cust_city,
                       cust_state,
                       cust_zip,
                       cust_country,
                       cust_contact,
                       cust_email)
VALUES (1000000007,
        'KIM S H',
        '165-4',
        'SUWON',
        'SW',
        '11111',
        'KR',
        NULL,
        'isayaksh@gmail.com');
  1. OrdersOrderItems 테이블의 백업용 사본을 만들어라.
CREATE TABLE OrderCopy AS SELECT * FROM Orders;

SELECT *
FROM OrderCopy;

CREATE TABLE OrderItemCopy AS SELECT * FROM OrderItems;

SELECT *
FROM OrderItemCopy;
profile
목적 있는 글쓰기

0개의 댓글