Использование SELECT в INSERT в SQL: выбор и изменение данных

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

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

SQL
Скопировать код
INSERT INTO destination_table (col1, col2)
SELECT col1, col2 FROM source_table WHERE your_condition;

Данная команда копирует данные из source_table в destination_table, применяя условие your_condition. Главное правило заключается в том, что количество и типы столбцов обеих таблиц должны совпадать.

Кинга Идем в IT: пошаговый план для смены профессии

Преобразование данных

Использование INSERT INTO...SELECT подразумевает возможность трансформации данных "на лету", используя для этого SQL-функции и условные операторы, например, оператор CASE:

SQL
Скопировать код
INSERT INTO destination_table (col1, transformed_col2)
SELECT col1, CASE WHEN col2 > 10 THEN 'High' ELSE 'Low' END FROM source_table;

Если вам удаётся преобразовывать данные в процессе выполнения запроса, это уже считается профессионализмом!

Исправление несоответствий в схеме данных

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

SQL
Скопировать код
INSERT INTO destination_table (col1, col2, static_col)
SELECT a.col1, b.col2, 'Static' FROM table1 a JOIN table2 b ON a.id = b.id;

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

Надежность ваших данных

Перед выполнением крупных операций INSERT INTO...SELECT стоит создать резервную копию данных.

SQL
Скопировать код
-- Создание резервной копии: двойник к вашим услугам!
SELECT * INTO backup_table FROM destination_table;

На всякий случай всегда сделайте резервную копию.

Визуализация

Представьте команду INSERT с использованием SELECT как автобус (🚌), который соединяет две точки: Музыкальный концерт (🎵) и Звукозаписывающую студию (🎧). Рассмотрим, как работает перенос данных при помощи нашего SQL Express:

Markdown
Скопировать код
🎵 Концерт     🚌      🎧 Студия
(SELECT)      (INSERT)

SELECT выступает в роли организатора, подбирающего треки после концерта:

SQL
Скопировать код
INSERT INTO 🎧 Студия (треки)
SELECT треки FROM 🎵 Концерт WHERE жанр = 'Рок';

Автобусное путешествие 🚌 до студии обычно проходит гладко:

Markdown
Скопировать код
До: 🎵 Концерт = [🎸 Stairway to Heaven, 🥁 Whole Lotta Love]
После: 🎧 Студия = [📀 Stairway to Heaven, 📀 Whole Lotta Love]

Теперь понравившиеся треки с концерта доступны в студии. Благодаря SQL Express перемещение данных проходит в один прием!

Проблема несоответствия типов столбцов

Несоответствие типов данных исходной и целевой таблиц может стать проблемой. Для перевода данных в нужный формат используйте функции CAST() или CONVERT() в составе SELECT:

SQL
Скопировать код
INSERT INTO destination_table (int_col, date_col)
SELECT CAST(char_col AS INT), CONVERT(date, char_date, 101) FROM source_table;

Вставка статических значений

С помощью команды INSERT INTO...SELECT можно без труда добавить статические значения вместе с выбранными данными:

SQL
Скопировать код
INSERT INTO destination_table (data_col, gid)
SELECT data_col, 'MY_GID' FROM source_table;

Помимо необходимого, не помешает добавить немного индивидуальности, например, установив уникальный GID.

Сложные подзапросы

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

SQL
Скопировать код
INSERT INTO destination_table (price_sum)
SELECT (SELECT SUM(price) FROM source_table WHERE product = 'banana') FROM dual;

За такую транзакцию вам полагается "банановый салют"! 🍌

Руководство по использованию

Вставка отдельных столбцов

С помощью INSERT INTO… SELECT можно передать данные только в выбранные столбцы целевой таблицы:

SQL
Скопировать код
INSERT INTO new_table (col1, col3)
SELECT col1, col2 FROM current_table;

В этом случае col3 в new_table будет заполнен данными из col2 current_table. Таким образом, переструктуризация данных произведена успешно.

Фильтр данных

Использование условия WHERE в запросе SELECT помогает выбрать нужные данные, исключая нежелательные значения:

SQL
Скопировать код
INSERT INTO new_table (col)
SELECT col FROM current_table WHERE col != 'Error404';

Ошибку типа "Страница не найдена" мы без проблем исключим из выборки!

Проверка синтаксиса

Тщательный контроль синтаксиса поможет избежать проблем с типами данных и ограничениями таблиц.

Полезные материалы

  1. SQL INSERT INTO SELECT Statement
  2. sql – Insert into ... values ( SELECT ... FROM ... ) – Stack Overflow
  3. How to create calculated tables in a tabular SSAS model