Использование SELECT в INSERT в SQL: выбор и изменение данных
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
INSERT INTO ... SELECT
— это мощный метод, позволяющий перемещать данные из одной таблицы в другую. Основное требование — совпадение структуры и типов данных столбцов. Сintаксис выглядит следующим образом:
INSERT INTO destination_table (col1, col2)
SELECT col1, col2 FROM source_table WHERE your_condition;
Данная команда копирует данные из source_table
в destination_table
, применяя условие your_condition
. Главное правило заключается в том, что количество и типы столбцов обеих таблиц должны совпадать.
Преобразование данных
Использование INSERT INTO...SELECT
подразумевает возможность трансформации данных "на лету", используя для этого SQL-функции и условные операторы, например, оператор CASE:
INSERT INTO destination_table (col1, transformed_col2)
SELECT col1, CASE WHEN col2 > 10 THEN 'High' ELSE 'Low' END FROM source_table;
Если вам удаётся преобразовывать данные в процессе выполнения запроса, это уже считается профессионализмом!
Исправление несоответствий в схеме данных
С помощью команды INSERT INTO...SELECT
можно исправить различия в схемах двух таблиц. Для этого используйте статические значения для тех столбцов, которые требуются в целевой таблице, но отсутствуют в исходной.
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
стоит создать резервную копию данных.
-- Создание резервной копии: двойник к вашим услугам!
SELECT * INTO backup_table FROM destination_table;
На всякий случай всегда сделайте резервную копию.
Визуализация
Представьте команду INSERT с использованием SELECT как автобус (🚌
), который соединяет две точки: Музыкальный концерт (🎵
) и Звукозаписывающую студию (🎧
).
Рассмотрим, как работает перенос данных при помощи нашего SQL Express:
🎵 Концерт 🚌 🎧 Студия
(SELECT) (INSERT)
SELECT выступает в роли организатора, подбирающего треки после концерта:
INSERT INTO 🎧 Студия (треки)
SELECT треки FROM 🎵 Концерт WHERE жанр = 'Рок';
Автобусное путешествие 🚌
до студии обычно проходит гладко:
До: 🎵 Концерт = [🎸 Stairway to Heaven, 🥁 Whole Lotta Love]
После: 🎧 Студия = [📀 Stairway to Heaven, 📀 Whole Lotta Love]
Теперь понравившиеся треки с концерта доступны в студии. Благодаря SQL Express перемещение данных проходит в один прием!
Проблема несоответствия типов столбцов
Несоответствие типов данных исходной и целевой таблиц может стать проблемой. Для перевода данных в нужный формат используйте функции CAST()
или CONVERT()
в составе SELECT
:
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
можно без труда добавить статические значения вместе с выбранными данными:
INSERT INTO destination_table (data_col, gid)
SELECT data_col, 'MY_GID' FROM source_table;
Помимо необходимого, не помешает добавить немного индивидуальности, например, установив уникальный GID.
Сложные подзапросы
Узнайте об усиленных возможностях подзапросов, используемых в составе SELECT
, и решите сложные задачи обработки данных:
INSERT INTO destination_table (price_sum)
SELECT (SELECT SUM(price) FROM source_table WHERE product = 'banana') FROM dual;
За такую транзакцию вам полагается "банановый салют"! 🍌
Руководство по использованию
Вставка отдельных столбцов
С помощью INSERT INTO… SELECT
можно передать данные только в выбранные столбцы целевой таблицы:
INSERT INTO new_table (col1, col3)
SELECT col1, col2 FROM current_table;
В этом случае col3
в new_table
будет заполнен данными из col2
current_table
. Таким образом, переструктуризация данных произведена успешно.
Фильтр данных
Использование условия WHERE
в запросе SELECT
помогает выбрать нужные данные, исключая нежелательные значения:
INSERT INTO new_table (col)
SELECT col FROM current_table WHERE col != 'Error404';
Ошибку типа "Страница не найдена" мы без проблем исключим из выборки!
Проверка синтаксиса
Тщательный контроль синтаксиса поможет избежать проблем с типами данных и ограничениями таблиц.