SQL код скопирован в буфер обмена
EN PT FR

Урок 8.1: Оператор INSERT INTO

До сих пор мы фокусировались на извлечении данных из существующих таблиц с помощью оператора SELECT. Теперь мы начнем изучать язык манипулирования данными (DML), начав с того, как добавлять новые данные в ваши таблицы с помощью оператора INSERT INTO.

Lesson illustration

Базовый синтаксис

Существует два основных способа использования оператора INSERT INTO.

1. Указание столбцов (Рекомендуется)

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

INSERT INTO table_name (column1, column2, column3)
VALUES (value1, value2, value3);

2. Без указания столбцов

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

INSERT INTO table_name
VALUES (value1, value2, value3, ...);

Важные правила вставки данных

  • Типы данных: Предоставляемые вами значения должны соответствовать типу данных соответствующего столбца (например, вы не можете вставить текст в числовой столбец).
  • Строки и даты: Как и в условии WHERE, строковые (текстовые) и даты должны быть заключены в одинарные кавычки (').
  • Числа: Числовые значения не требуют кавычек.
  • Значения NULL: Если столбец допускает NULL и вы не предоставляете для него значение, он будет заполнен NULL (или значением по умолчанию, если оно определено).

Примеры

Пример 1: Добавление нового актера

Давайте добавим нового актера в таблицу actor базы данных Sakila.

INSERT INTO actor (first_name, last_name)
VALUES ('JOHNNY', 'DEPP');

Примечание: Мы не указывали actor_id, так как он обычно генерируется базой данных автоматически.

Пример 2: Вставка в определенные столбцы

Если у нас есть таблица со множеством столбцов, но мы хотим заполнить только некоторые из них:

INSERT INTO customer (first_name, last_name, email, store_id, address_id)
VALUES ('ALICE', 'JOHNSON', 'alice.j@example.com', 1, 5);

Пример 3: Вставка нескольких строк

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

INSERT INTO actor (first_name, last_name)
VALUES 
    ('TOM', 'HANKS'),
    ('MERYL', 'STREEP'),
    ('LEONARDO', 'DICAPRIO');

Вставка данных из другого запроса (INSERT INTO ... SELECT)

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

Синтаксис

INSERT INTO target_table (column1, column2, column3)
SELECT source_column1, source_column2, source_column3
FROM source_table
WHERE condition;

Гибкость формирования данных

Важной особенностью этой команды является то, что в блоке SELECT вы можете комбинировать различные типы значений:

  1. Выбранные значения: напрямую из исходной таблицы (source_column1).
  2. Вычисляемые значения: результат формул или функций (например, amount * 0.1).
  3. Константные значения: фиксированные данные, которых нет в исходной таблице (например, дата вставки или статус в виде строки).

Пример: Создание архива неактивных клиентов

Допустим, у нас есть таблица customer_archive, и мы хотим перенести туда данные из основной таблицы customer, добавив дату архивации и пометку о статусе:

INSERT INTO customer_archive (customer_id, full_name, archived_at, status_note)
SELECT 
    customer_id, 
    CONCAT(first_name, ' ', last_name), -- Вычисляемое значение (ФИО)
    CURRENT_DATE,                       -- Константа (текущая дата)
    'Auto-archived'                     -- Константа (текстовая метка)
FROM customer
WHERE active = 0;

Примечание: Количество и порядок столбцов в INSERT INTO должны строго совпадать с количеством и порядком столбцов, возвращаемых в SELECT.


Работа с NULL и значениями по умолчанию

При вставке строки не всегда нужно указывать значение для каждого столбца. База данных обрабатывает пропущенные значения двумя способами: через NULL и через значения по умолчанию.

Явная вставка NULL

Если столбец допускает NULL, вы можете передать ключевое слово NULL напрямую в качестве значения:

INSERT INTO customer (first_name, last_name, email, store_id, address_id)
VALUES ('BOB', 'SMITH', NULL, 1, 5);

Здесь столбец email будет сохранён как NULL, то есть «значение не задано».

Использование значений по умолчанию

Если у столбца определено значение DEFAULT в схеме таблицы, его можно полностью опустить из списка столбцов. База данных заполнит его автоматически:

INSERT INTO actor (first_name, last_name)
VALUES ('CATE', 'BLANCHETT');

Столбцы actor_id (автоинкремент) и last_update (временная метка по умолчанию) заполняются базой данных без явного указания.

Явное использование DEFAULT

Можно также использовать ключевое слово DEFAULT, чтобы указать базе данных применить значение по умолчанию, при этом сохранив столбец в списке:

INSERT INTO actor (actor_id, first_name, last_name, last_update)
VALUES (DEFAULT, 'CATE', 'BLANCHETT', DEFAULT);

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


Ключевые выводы этого урока:

  • Оператор INSERT INTO используется для добавления новых строк в таблицу.
  • Команда INSERT INTO ... SELECT позволяет копировать данные из одной таблицы в другую.
  • В блоке SELECT можно комбинировать реальные данные из таблицы, вычисляемые поля и константы.
  • Явное перечисление имен столбцов рекомендуется для повышения надежности и читаемости кода.
  • Строковые значения и даты должны быть заключены в одинарные кавычки.
  • Вы можете вставлять несколько строк одновременно для повышения производительности.
  • Столбцы с NULL или значением DEFAULT можно опустить или передать явно с помощью ключевых слов NULL и DEFAULT.

В следующем уроке мы рассмотрим, как изменять уже существующие записи с помощью оператора UPDATE.