Insert select from sql: SQL INSERT INTO SELECT Statement

Использование оператора SELECT в команде INSERT

Использование оператора SELECT в команде
INSERT

Оператор
SELECT в команде INSERT позволяет взять данные из одной или нескольких
таблиц и
вставить их в другую таблицу. Если вы вставляете значения только для
части
столбцов, определить значения для других столбцов можно будет позднее с
помощью
оператора UPDATE.


Если
вы вставляете строки из одной таблицы в другую, эти таблицы должны
иметь
совместимую структуру, т.е. соответствующие столбцы должны иметь
одинаковый
тип, или же система должна уметь автоматически выполнять нужное
преобразование.


Если
столбцы в обеих таблицах совместимы по типам и определены в одинаковом
порядке
в соответствующих операторах CREATE TABLE, перечислять их в команде
INSERT
необязательно.

Пример

Предположим,
что в таблице sale_arhiiv содержатся строки с информацией о продажах в
том же
формате, что и в таблице tbl_sale.


Для
добавления в таблицу sale_arhiiv строк из таблицы tbl_sale, содержащих
данные о проджах за 2004 год
в можно
воспользоваться следующей командой:


SQL:


INSERT INTO sale_arhiiv


SELECT sale_id, client_id, prod_id, amount, saledate


FROM tbl_sale


WHERE YEAR(saledate)=2004


или


INSERT INTO sale_arhiiv


SELECT *


FROM tbl_sale


WHERE YEAR(saledate)=2004

Если
столбцы в двух таблицах (таблица, в которую вы вставляете данные, и
таблица, из
которой вы берете данные) определены в разном порядке в соответствующих
операторах CREATE TABLE, для установления соответствия между ними можно
воспользоваться предложениями INSERT или SELECT.

Пример

Например,
предположим, что в операторе CREATE TABLE для таблицы tbl_sale
столбцы определены в следующем порядке — sale_id, client_id,
prod_id, amount, saledate, a
для
таблицы sale_arviiv — sale_id, prod_id, client_id saledate и
amount. Тогда установить соответствие
между ними можно с помощью оператора INSERT. Для этого столбцы
таблицы sale_arhiiv нужно
перечислить в предложении INSERT:


SQL:
INSERT INTO sale_arhiiv
(sale_id, client_id, prod_id, amount, saledate)


SELECT *


FROM tbl_sale


WHERE YEAR(saledate)=2004


 


Такой же результат можно
получить, перечислив в нужном порядке столбцы таблицы tbl_sale в
предложении
SELECT:


SQL:
INSERT INTO sale_arhiiv


SELECT sale_id,prod_id,
client_id,
saledate
amount

FROM tbl_sale


WHERE YEAR(saledate)=2004

Одним
из преимуществ использования оператора SELECT в команде INSERT является
возможность включения в него различных выражений (expression)
— строк символов,
математических формул и функций, позволяющих манипулировать
вставляемыми
данными.


Кроме того, с помощью оператора SELECT можно добавлять данные как во
все сразу, так и в отдельные столбцы, по аналогии с предложением VALUE.
Для этого
нужно просто задать имена столбцов, в которые вы хотите добавить данные
в предложении INSERT

Пример

Ниже приводится пример предложения SELECT, в котором над
столбцом выполняются математические действия.


Предположим, что описываемая нами компания купила продукцию у другой
фармацевттической компании. Причем, по счастливой случайности, для
описания продукции эта компания
использовала таблицу tbl_prod с той же структурой, что и таблица
tbl_product. Однако при покупке стоимость продукции была увеличена на
10%. Кроме того, данные будут добавлены во все поля таблицы
tbl_product, кроме поля tbl_group. Оператор, увеличивающий значения
стоимости товаров вставляющий строки из таблицы tbl_prod в таблицу
tbl_product, имеет следующий вид:


SQL:


INSERT INTO tbl_product(prod_id, pr_name,price)


SELECT prod_id, name, price * 1. 1 FROM tbl_prod

« Previous | Next »

SQL INSERT INTO SELECT, заявление

❮ Предыдущая Следующая Глава ❯


С помощью SQL можно скопировать информацию из одной таблицы в другую.

INSERT INTO SELECT, заявление копирует данные из одной таблицы и вставляет его в существующую таблицу.


Заявление SQL INSERT INTO SELECT,

INSERT INTO SELECT, оператор выбирает данные из одной таблицы и вставляет его в существующую таблицу. Любые существующие строки в целевой таблице не изменяются.

SQL INSERT INTO SELECT, Синтаксис

Мы можем скопировать все столбцы из одной таблицы в другую, существующую таблицу:


INSERT INTO table2

SELECT * FROM table1;

Или же мы можем скопировать только те столбцы, которые мы хотим в другую, существующую таблицу:


INSERT INTO table2
(column_name(s))

SELECT column_name(s)

FROM table1;


Демо-версия базы данных

В этом уроке мы будем использовать хорошо известную базу данных Борей.

Ниже приводится подборка из «Customers» таблицы:




Пользовательский ИД Имя Клиента Контактное лицо Адрес город Почтовый индекс Страна
1Alfreds FutterkisteMaria AndersObere Str. 57Berlin12209Germany
2Ana Trujillo Emparedados y heladosAna TrujilloAvda. de la Constitucion 2222Mexico D.F.05021Mexico
3Antonio Moreno TaqueriaAntonio MorenoMataderos 2312Mexico D.F.05023Mexico

И выбор из «Suppliers» таблицы:

SupplierID Наименование поставщика Контактное лицо Адрес город Почтовый индекс Страна Телефон
1 Экзотические Liquid Шарлотта Купер 49 Гилберта St. Londona EC1 4SD Великобритания (171) 555-2222
2 Новый Орлеан Cajun наслаждений Shelley Берк PO Box 78934 Жители Нового Орлеана 70117 США (100) 555-4822
3 Homestead Бабушка Келли Regina Мерфи 707 Oxford Rd. Ann Arbor 48104 США (313) 555-5735

SQL INSERT INTO SELECT, Примеры

Копирование только несколько столбцов из «Suppliers» Into «Customers» :

пример


INSERT INTO Customers (CustomerName, Country)

SELECT SupplierName, Country FROM Suppliers;

Попробуй сам «

Копирование только немецких поставщиков в «Customers» :

пример


INSERT INTO Customers (CustomerName, Country)

SELECT SupplierName, Country FROM Suppliers
WHERE Country=’Germany’;

Попробуй сам «

❮ Предыдущая Следующая Глава ❯

Оператор SQL INSERT SELECT — обучение на примере

Оператор INSERT обычно используется для вставки строки в таблицу с использованием заданных значений. Существует вторая форма INSERT, которая вставляет результат оператора SELECT в таблицу, известную как INSERT SELECT.

Как следует из названия, он состоит из оператора INSERT и оператора SELECT. Этот оператор особенно полезен, когда вам нужно вставить одну или несколько строк из одной таблицы в другую.

Вставка строк таким образом не влияет ни на какие существующие строки ни в исходной, ни в целевой таблице.

Образец таблицы

Чтобы помочь вам лучше понять примеры и следовать руководству, мы собираемся использовать следующие образцы таблиц.

Следующая таблица является частью «Системы управления персоналом», которая содержит основную информацию о штатных сотрудниках .

2

20 Eve

1 Боб 28 Нью-Йорк Менеджер 60000 9002 24 Chicago Developer 32000
3 Max 26 New York Developer 29000
4 Kim 25 Chicago Менеджер 55000

Вторая таблица содержит основную информацию о стажерах .

5 Джо 23 New York Developer 9000
6 SAM 27 9003

.9008 9008 9008 9008 9008 9008 9008 9008 9008

9008 9008 9008 9008 9008 9008

9008 9008 9008

9008 9008 9008

9008 9008 9008 9008

9008 9008 9008 9008 9008

9008 9008 9008 9008

.9008 9008

9008 9008 9008 9008

9008 9008 9008

9. для всех строк из одной таблицы в другую с помощью INSERT SELECT вы должны, как минимум, указать две части информации — имя исходной таблицы и имя целевой таблицы. Просто убедитесь, что столбцы и их типы данных в исходной и целевой таблицах совпадают, хотя нет необходимости в совпадении имен столбцов.

Вот основной синтаксис INSERT SELECT.

 ВСТАВИТЬ В целевую_таблицу
ВЫБИРАТЬ *
ИЗ исходной_таблицы; 

Предположим, вы хотите объединить список стажеров из таблицы «Стажеры» в таблицу «Сотрудники». Вы можете сделать следующее:

 ВСТАВИТЬ В СОТРУДНИКИ
ВЫБИРАТЬ *
ОТ Интернов; 

Содержимое таблицы «Сотрудники» после вставки:

1 Боб 28 Нью-Йорк Менеджер 60000
2 Eve 24 Chicago Developer 32000
3 Max 26 New York Developer 29000
4 KIM 25 Чикаго Manager 55000
5 Joe 23 New York Developer 230020 9000
6 SAM 27 Чикаго Developer 10000

Этот пример импортирует все данные из «стажеров» в работники. Вместо того, чтобы перечислять ЗНАЧЕНИЯ, которые нужно вставить, оператор SELECT извлекает их из «стажеров».

Осторожно:

Хотя этот синтаксис прост, он совсем небезопасен, и его обычно следует избегать; Поскольку это сильно зависит от порядка, в котором столбцы определены как в исходной, так и в целевой таблицах.

Несмотря на то, что порядок двух столбцов сейчас совпадает, нет гарантии, что столбцы будут в том же порядке, когда один из них будет перестроен в следующий раз.

Более безопасный и рекомендуемый способ использования оператора INSERT SELECT — явно указать имена столбцов. Просто убедитесь, что каждый столбец в операторе SELECT соответствует столбцу, указанному в операторе INSERT.

 ВСТАВИТЬ В целевую_таблицу (столбец1, столбец2,...)
ВЫБЕРИТЕ столбец1, столбец2,...
ИЗ исходной_таблицы; 

Следующий пример работает точно так же, как и предыдущая инструкция INSERT SELECT, но на этот раз имена столбцов указываются явно.

 ВСТАВИТЬ В СОТРУДНИКИ (ID, имя, возраст, город, должность, зарплата)
ВЫБЕРИТЕ ID, имя, возраст, город, работу, зарплату
ОТ Интернов; 

Содержимое таблицы «Сотрудники» после вставки:

1 Боб 28 Нью-Йорк Менеджер

00032

2 Eve 24 Chicago Developer 32000
3 Max 26 New York Developer 29000
4 Kim 25 Чикаго Manager 55000
5 JOE 23 New York DEVELUCTE0019

6 Сэм 27 Чикаго Разработчик 10000

В этом примере для ясности и ясности указываются одни и те же имена столбцов в инструкциях INSERT. Однако нет необходимости сопоставлять имена столбцов. На самом деле СУБД учитывает положение столбцов в SELECT независимо от их имен. Таким образом, первый столбец в SELECT используется для заполнения первого столбца в операторе INSERT и так далее.

Основное преимущество этого синтаксиса заключается в том, что при явном указании имен столбцов вы можете располагать их в любом порядке. Следующий оператор INSERT аналогичен предыдущему, но задает список столбцов в другом порядке.

 ВСТАВЬТЕ В СОТРУДНИКИ (Город, Имя, Должность, Возраст, Зарплата, ID)
ВЫБЕРИТЕ город, имя, работу, возраст, зарплату, ID
ОТ Интернов; 

Содержимое таблицы «Сотрудники» после вставки:

0020 23

1 Боб 28 New York Manager 60000
2 Eve 24 Chicago Developer 32000
3 Max 26 New York Разработчик 29000
4 KIM 25 Чикаго Менеджер 55000
5 JOE
5 JOE
5 JOE New York Developer 9000
6 Sam 27 Chicago Developer 10000

Insert Selected Rows

The SELECT statement embedded in the INSERT statement ничем не отличается от оператора SELECT, который вы используете для извлечения данных, поэтому он может включать предложение WHERE. И это предложение WHERE фильтрует данные, которые нужно скопировать.

 ВСТАВИТЬ В целевую_таблицу (столбец1, столбец2,...)
ВЫБЕРИТЕ столбец1, столбец2,...
ИЗ исходной_таблицы
ГДЕ условие; 

Следующий запрос вставляет одну строку из таблицы «Стажеры» в таблицу «Сотрудники».

 ВСТАВИТЬ В СОТРУДНИКИ (ID, имя, возраст, город, должность, зарплата)
ВЫБЕРИТЕ ID, имя, возраст, город, работу, зарплату
ОТ СТАЖИРОВ
ГДЕ ID = 6; 

The contents of the ‘Employees’ table after the insertion are:

1 Bob 28 New York Manager 60000
2 Eve 24 Chicago Developer 32000
3 Max 26 New York Developer 29000
4 Kim 25 Chicago Manager 55000
6 SAM 27 Чикаго Developer 10000

Вставки Переполняющий ROW

.

0009

Используя приведенный выше синтаксис, вы можете копировать только некоторые столбцы. СУБД будет вставлять NULL или значение по умолчанию в столбцы, которые не копируются.

Для демонстрации давайте импортируем только столбцы «Идентификатор», «Имя», «Возраст» и «Работа» из таблицы «Стажеры» в таблицу «Сотрудники».

 ВСТАВИТЬ В СОТРУДНИКИ (ID, имя, возраст, должность)
ВЫБЕРИТЕ ID, имя, возраст, работу
ОТ Интернов; 

Содержимое таблицы «Сотрудники» после вставки:

19.

1 Bob 28 New York Manager 60000
2 Eve 24 Chicago Developer 32000
3 Max 26 New York Developer 29000
4 KIM 25 Чикаго Менеджер 55000
5 Joe 23 NULL Developer NULL
6 Sam 27 NULL Developer NULL

Как видно из приведенного выше примера, столбцы «Город» и «Зарплата» вставляются со значениями NULL.

Внимание!

Если вы планируете пропустить столбец, вам необходимо убедиться, что для этого столбца выполняется одно из следующих условий:

  1. В столбце разрешены значения NULL.
  2. Значение по умолчанию для столбца указано в определении таблицы.

Если вы опустите столбец, который не допускает значений NULL и не имеет значения по умолчанию, то инструкция INSERT завершается ошибкой и генерируется ошибка.

sql — Вставить в … значения ( SELECT … FROM … )

Оба ответа, которые я вижу, отлично работают в Informix, и в основном представляют собой стандартный SQL. То есть обозначение:

 INSERT INTO target_table[(<список-столбцов>)] SELECT ... FROM ...;
 

прекрасно работает с Informix и, как я ожидал, со всеми СУБД. (Когда-то 5 или более лет назад это было то, что MySQL не всегда поддерживал; теперь у него есть достойная поддержка такого стандартного синтаксиса SQL, и, насколько мне известно, он будет нормально работать с этой нотацией. ) Список столбцов является необязательным, но указывает целевые столбцы в последовательности, поэтому первый столбец результата SELECT попадет в первый столбец в списке и т. д. При отсутствии списка столбцов первый столбец результата SELECT входит в список. первый столбец целевой таблицы.

Между системами может различаться нотация, используемая для идентификации таблиц в разных базах данных — стандарт ничего не говорит об операциях между базами данных (не говоря уже о межСУБД). В Informix вы можете использовать следующую нотацию для идентификации таблицы:

 [dbase[@server]:][owner.]table
 

То есть вы можете указать базу данных, дополнительно указав сервер, на котором размещена эта база данных, если она не находится на текущем сервере, за которым следует необязательный владелец, точка и, наконец, фактическое имя таблицы. Стандарт SQL использует термин схема для того, что Informix называет владельцем. Таким образом, в Informix любая из следующих нотаций может идентифицировать таблицу:

 таблица
"владелец". таблица
база данных: таблица
база данных: владелец. таблица
dbase@сервер: таблица
dbase@сервер:владелец.таблица
 

Владелец вообще не нуждается в цитировании; однако, если вы используете кавычки, вам нужно правильно написать имя владельца — оно становится чувствительным к регистру. То есть:

 кто-то.таблица
"кто-то".таблица
SOMEONE.table
 

все идентифицируют одну и ту же таблицу. С Informix есть небольшие сложности с базами данных MODE ANSI, где имена владельцев обычно преобразуются в верхний регистр (informix является исключением). То есть в базе данных MODE ANSI (обычно не используемой) вы можете написать:

 СОЗДАТЬ ТАБЛИЦУ Someone.table ( ... )
 

, а имя владельца в системном каталоге будет «КТО-ТО», а не «кто-то». Если вы заключите имя владельца в двойные кавычки, оно действует как идентификатор с разделителями. В стандартном SQL идентификаторы с разделителями можно использовать во многих местах. С Informix вы можете использовать их только вокруг имен владельцев — в других контекстах Informix обрабатывает как строки в одинарных, так и в двойных кавычках как строки, а не разделяет строки в одинарных кавычках как строки, а строки в двойных кавычках — как идентификаторы с разделителями.