2021-12-14 13:07 작성

My SQL basic 메모

Table of contents

MySQL INSERT INTO SELECT 개요

이전 튜토리얼에서는 VALUES 절에 명시된 column values의 list와 함께 INSERT 구문을 사용해 하나의 table에 하나 혹은 그 이상의 rows을 어떻게 삽입하는지 배웠다.

INSERT INTO table_name(c1,c2,...)
VALUES(v1,v2,...);

VALUES 절 안에서 row values를 사용하는 것을 제외하고도 INSERT 구문에서 SELECT 구문의 결과를 데이터 소스로 사용할 수 있다.

다음은 INSERT INTO SELECT 구문의 기본 문법이다:

INSERT INTO table_name(column_list)
SELECT
    select_list
FROM
    another_table
WHERE
    condition;

이 문법에서 VALUES 절을 사용하는 것 대신 SELECT 구문을 사용할 수 있다. SELECT 구문은 하나 혹은 그 이상의 tables에서 데이터를 검색할 수 있다.

INSERT INTO SELECT 구문은 다른 tables의 데이터를 임의의 table로 복사하거나 복수의 tables에서 임의의 table로 데이터를 요약할 때 유용하다.



MySQL INSERT INTO SELECT 예시

첫째, suppliers라는 이름의 새로운 table을 생성한다:

CREATE TABLE suppliers (
    supplierNumber INT AUTO_INCREMENT,
    supplierName VARCHAR(50) NOT NULL,
    phone VARCHAR(50),
    addressLine1 VARCHAR(50),
    addressLine2 VARCHAR(50),
    city VARCHAR(50),
    state VARCHAR(50),
    postalCode VARCHAR(50),
    country VARCHAR(50),
    customerNumber INT,
    PRIMARY KEY (supplierNumber)
);

California, USA의 모든 customers가 company의 suppliers가 된다고 가정하자. 다음의 쿼리는 California와 USA에 위치한 모든 customers를 찾는다:

SELECT
    customerNumber,
    customerName,
    phone,
    addressLine1,
    addressLine2,
    city,
    state,
    postalCode,
    country
FROM
    customers
WHERE
    country = 'USA' AND
    state = 'CA';

output:

customerNumber customerName phone addressLine1 addressLine2 city state postalCode country
124 Mini Gifts Distributors Ltd. 4155551450 5677 Strong St. NULL San Rafael CA 97562 USA
129 Mini Wheels Co. 6505555787 5557 North Pendale Street NULL San Francisco CA 94217 USA
161 Technics Stores Inc. 6505556809 9408 Furth Circle NULL Burlingame CA 94217 USA
205 Toys4GrownUps.com 6265557265 78934 Hillside Dr. NULL Pasadena CA 90003 USA
219 Boards & Toys Co. 3105552373 4097 Douglas Av. NULL Glendale CA 92561 USA
239 Collectable Mini Designs Co. 7605558146 361 Furth Circle NULL San Diego CA 91217 USA
321 Corporate Gift Ideas Co. 6505551386 7734 Strong St. NULL San Francisco CA 94217 USA
347 Men ‘R’ US Retailers, Ltd. 2155554369 6047 Douglas Av. NULL Los Angeles CA 91003 USA
450 The Sharp Gifts Warehouse 4085553659 3086 Ingle Ln. NULL San Jose CA 94217 USA
475 West Coast Collectables Co. 3105553722 3675 Furth Circle NULL Burbank CA 94019 USA
487 Signal Collectibles Ltd. 4155554312 2793 Furth Circle NULL Brisbane CA 94217 USA

둘째, INSERT INTO ... SELECT 구문을 사용해 customers table에서 California USA에 위치한 customers를 suppliers table에 삽입한다.

INSERT INTO suppliers (
    supplierName,
    phone,
    addressLine1,
    addressLine2,
    city,
    state,
    postalCode,
    country,
    customerNumber
)
SELECT
    customerName,
    phone,
    addressLine1,
    addressLine2,
    city,
    state,
    postalCode,
    country,
    customerNumber
FROM
    customers
WHERE
    country = 'USA' AND
    state = 'CA';

성공적으로 데이터가 입력될 시 다음과 같은 안내문이 출력된다.

Query OK, 11 rows affected (0.02 sec)
Records: 11  Duplicates: 0  Warnings: 0

셋째, suppliers table에서 데이터를 쿼리하여 확인한다.

SELECT * FROM suppliers;

output:

supplierNumber supplierName phone addressLine1 addressLine2 city state postalCode country customerNumber
1 Mini Gifts Distributors Ltd. 4155551450 5677 Strong St. NULL San Rafael CA 97562 USA 124
2 Mini Wheels Co. 6505555787 5557 North Pendale Street NULL San Francisco CA 94217 USA 129
3 Technics Stores Inc. 6505556809 9408 Furth Circle NULL Burlingame CA 94217 USA 161
4 Toys4GrownUps.com 6265557265 78934 Hillside Dr. NULL Pasadena CA 90003 USA 205
5 Boards & Toys Co. 3105552373 4097 Douglas Av. NULL Glendale CA 92561 USA 219
6 Collectable Mini Designs Co. 7605558146 361 Furth Circle NULL San Diego CA 91217 USA 239
7 Corporate Gift Ideas Co. 6505551386 7734 Strong St. NULL San Francisco CA 94217 USA 321
8 Men ‘R’ US Retailers, Ltd. 2155554369 6047 Douglas Av. NULL Los Angeles CA 91003 USA 347
9 The Sharp Gifts Warehouse 4085553659 3086 Ingle Ln. NULL San Jose CA 94217 USA 450
10 West Coast Collectables Co. 3105553722 3675 Furth Circle NULL Burbank CA 94019 USA 475
11 Signal Collectibles Ltd. 4155554312 2793 Furth Circle NULL Brisbane CA 94217 USA 487



VALUES 리스트에서 SELECT 구문 사용하기

첫째, stats라는 이름의 새로운 table을 생성한다:

CREATE TABLE stats (
    totalProduct INT,
    totalCustomer INT,
    totalOrder INT
);

둘째, SELECT 구문들에서 오는 values를 삽입하는 INSERT 구문을 작성한다:

INSERT INTO stats(totalProduct, totalCustomer, totalOrder)
VALUES(
    (SELECT COUNT(*) FROM products),
    (SELECT COUNT(*) FROM customers),
    (SELECT COUNT(*) FROM orders)
);

이 예시는:

  • 첫째, SELECT 구문들에 COUNT() functions를 사용하여 total products, customers 그리고 orders를 구했다.
  • 둘째, VALUES 안에 values 대신 SELECT 구문에서 반환되는 values를 사용한다.

셋째, stats table에서 데이터를 쿼리한다:

SELECT * FROM stats;

output:

totalProduct totalCustomer totalOrder
110 98 326