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 |