Команда INSERT INTO SELECT використовується для копіювання записів з однієї таблиці до іншої існуючої таблиці. Наприклад:
|
1 2 3 |
INSERT INTO OldCustomers SELECT * FROM Customers; |
Тут ми копіюємо всі записи з таблиці Customers до таблиці OldCustomers.

Примітка: Щоб запустити вищезазначений SQL-запит, у базі даних вже повинна бути таблиця з ім’ям OldCustomers, а імена стовпців таблиці OldCustomers і таблиці Customers повинні збігатися. Якщо потрібно скопіювати дані до нової таблиці (не до існуючої), слід використовувати команду SELECT INTO.
Скопіювати лише вибрані стовпці
Ми також можемо скопіювати лише вибрані стовпці з однієї таблиці до іншої. Наприклад:
|
1 2 3 |
INSERT INTO OldCustomers(customer_id, age) SELECT customer_id, age FROM Customers; |
Тут ми копіюємо дані тільки зі стовпців customer_id та age до таблиці OldCustomers.

Примітка: Якщо в таблиці OldCustomers, крім customer_id та age, є інші стовпці, то значеннями цих стовпців буде NULL.
Скопіювати дані, що відповідають умові
Ми можемо використати оператор WHERE з INSERT INTO для копіювання рядків, які відповідають вказаній умові. Наприклад:
|
1 2 3 4 |
INSERT INTO OldCustomers SELECT * FROM Customers WHERE country = 'USA'; |
Тут ми копіюємо всі рядки з таблиці Customers, де значенням стовпця country є USA, в таблицю OldCustomers.

Скопіювати дані з двох таблиць в одну
Можна скопіювати дані з двох різних таблиць в одну, використовуючи оператор JOIN з INSERT INTO SELECT. Наприклад:
|
1 2 3 4 5 |
INSERT INTO OldCustomerOrders SELECT Customers.customer_id, Customers.first_name, Orders.amount FROM Customers JOIN Orders ON Customers.customer_id = Orders.customer_id; |
Тут ми копіюємо customer_id та first_name з таблиці Customers та amount з таблиці Orders в існуючу таблицю OldCustomerOrders.

Примітка: Якщо в існуючій таблиці вже є дані, то будуть додані нові рядки. Стовпці в існуючій таблиці можуть видавати такі помилки, як NOT NULL Constraint Fail, UNIQUE Constraint Failed під час копіювання даних.
Уникайте дублювання даних в INSERT INTO SELECT
Якщо вже є рядок зі схожим значенням, SQL може видати помилку при використанні команди INSERT INTO SELECT. Проте ми можемо пропустити копіювання повторюваних рядків, використовуючи оператор NOT EXISTS. Наприклад:
|
1 2 3 4 5 6 7 8 |
INSERT INTO OldCustomers(customer_id, age) SELECT customer_id, age FROM Customers WHERE NOT EXISTS( SELECT customer_id FROM OldCustomers WHERE OldCustomers.customer_id = Customers.customer_id ); |
Тут ми скопіюємо рядок у таблицю лише в тому випадку, якщо customer_id у таблиці не має такого ж значення, яке ми намагаємося скопіювати.

