DML. INSERT
Дорогу осилит идущийСегодняшняя статья будет разбита на две части. В первой мы создадим таблицу – одну из нескольких, которая будет в тестовой БД. Вторая же будет обзорной и посвящена, собственно, SQL-оператору INSERT.
Создание таблицы в БД
Как вы можете помнить, создание сущностей БД относится к разделу DDL. С ним мы будем знакомиться чуть позже. Однако для закрепления знаний как по типам данных, так и по операторам из раздела DML, которым будут посвящены ближайшие уроки, потребуется создать хоть какую-то структуру, с которой и будем взаимодействовать в рамках практических заданий.
Нам потребуется консоль для выполнения запроса. В случае с psql – вы уже в консоли, при использовании графических оболочек – как правило, ПКМ по БД –> Console/New console/Редактор SQL. Зависит от оболочки и выбранного языка
Собственно, запрос на создание таблицы:
create table passenger ( id bigserial, first_name varchar(100), last_name varchar(100), birth_date date, male boolean default true, last_purchase timestamp, favorite_airports text[] );
Если вы работаете через графический интерфейс - потребуется не только написать, но и запустить запрос. Обычно – зеленый (или не зеленый) треугольник. Если в редакторе написано более одного запроса – выделите нужный и лишь затем нажимайте на кнопку запуска.
Пусть это будет таблица «Пассажир» для системы какой-то авиакомпании или другой системы, связанной с авиаперевозками. Мы определяем у данной таблицы поле id – чтобы хранить некий уникальный идентификатор пассажира, а также ряд полей с полезной нагрузкой: имя и фамилия, дата рождения, дата и время последней покупки, список любимых аэропортов (в виде массива строк).
Также есть булева колонка «пол», для которой указано значение по умолчанию: true. Если при добавлении записи в таблицу, не будет указано значение для данной колонки – будет использовано значение по умолчанию. В нашем случае – true, т.е., исходя из названия колонки, мужчина.
Данная таблица является, с одной стороны, упрощенной – вероятно, в любой реальной системе состав колонок был бы шире, с другой – содержит ряд упущений технического характера. Если первое примем за данность, чтобы не усложнять собственные запросы лишними значениями, то второе – умышленное допущение. По мере знакомства с SQL будем вносить некоторые структурные правки в данную таблицу.
Кроме того, стоит отметить одно из отличий SQL от Java: регистрозависимость. Java не позволяет использовать заглавные буквы вместо строчных и наоборот. Так, n и N могут быть названиями двух переменных в рамках одного метода – конфликта имен не будет. То же и с ключевыми словами: private – ключевое слово, модификатор доступа. PRIVATE, Private, PrIvAtE – неизвестный оператор, ошибка компиляции (если попытаться использовать любой из предложенных вариантов вместо private).
SQL же не имеет зависимости от регистра, поэтому в запросах можно писать операторы, а также названия (таблиц, колонок и т.д.) в любом удобном вам виде. Традиционно, рекомендуется писать операторы заглавными буквами, а имена – строчными:
CREATE TABLE passenger …
Де-факто, эти рекомендации не всегда соблюдаются и, как правило, в рамках реальных проектов команда руководствуется внутренними договоренностями. Я, например, предпочитаю писать целиком в нижнем регистре, поэтому в примерах будет именно так:)
Команда INSERT
Итак, мы создали таблицу, осталось наполнить ее данными.
Именно за вставку данных в таблицу и отвечает оператор INSERT. В целом, данный оператор – достаточно мощный инструмент, с которым можно работать достаточно тонко: от вставки данных на базе результатов другого запроса до возвращения каких-то результатов при удачной вставке и обработки конфликтных вставок.
Не могу сказать, что последние две опции очень популярны для типовых задач, с которыми может встретиться начинающий Java-разработчик, поэтому сегодня мы ограничимся самыми базовыми возможностями, а в рамках ближайших уроков рассмотрим некоторые иные возможности INSERT – по мере знакомства с необходимым синтаксисом.
Базовые примеры использования INSERT можно найти здесь: https://postgrespro.ru/docs/postgresql/9.6/sql-insert (рекомендую первые примеров пять, дальше демонстрируются более узкие сценарии использования, в т.ч. с пока незнакомым синтаксисом).
Возможно, более простыми будут примеры здесь (но и более сложная структура таблицы): https://metanit.com/sql/postgresql/3.1.php
Что нужно отметить:
· Общая форма запроса выглядит как
insert into *имя таблицы* (*список колонок, куда добавляем данные*) values (*набор значений первой записи, для колонок в заданном порядке*), … (*набор значений n-й записи, для колонок в заданном порядке*);
Пример:
insert into passenger (id, first_name, last_name, birth_date, male, last_purchase, favorite_airports) values
(1, 'Ivan', 'Ivanov', '02-07-1990', true, null, null),
(2, 'Petr', 'Petrov', '02-07-1991', true, '02-07-2023 20:32:00', '{"Minsk", "Kyiv"}');
· Если для вставки используются все колонки таблицы без изменения их порядка (как в таблице, так и при вставке), (*список колонок, куда добавляем данные*) можно опустить:
insert into passenger values (3, 'Anna', 'Annina', '02-07-1993', false, null, null);
· Также можно в разных форматах использовать значение по умолчанию: пропускать его в перечислении добавляемых колонок или указывать в явном виде с помощью ключевого слова DEFAULT;
· Если значение по умолчанию не задано для колонки – таким значением будет null.
Обратите внимание на форму записи для значений типа массив: одинарные кавычки, элементы внутри {}, сами строковые значения в двойных кавычках (а не одинарных, как обычно бывает у строк в SQL). При этом для массива чисел, например, кавычки вокруг каждого элемента не нужны: '{1, 2, 3}'.
Отдельно отмечу, что добавление записей возможно и через графический редактор (как правило – двойной щелчок по таблице, дальше будет понятно). Это, обычно, неудобно для множественной вставки, но для одиночных – вполне. Однако, в рамках изучения именно SQL рекомендую максимально сосредоточиться на консоли.
Также, в качестве приятного бонуса вне основной темы урока: если при работе с типами даты и/или времени вам нужно текущее значение – вы можете воспользоваться функцией now():
insert into passenger values (3, 'Anna', 'Annina', '02-07-1993', false, now(), null);
С теорией на сегодня все!

Переходим к практике:
В целом, заданий по SQL в Сети множество, в т.ч. специализированные сайты вроде https://www.sql-ex.ru/
Рекомендую выбрать сервис по душе и практиковаться на нем. Но в рамках данных статей тоже будут символические задачи, позволяющие закрепить изученный материал.
Задача 1
Вставьте в таблицу «Пассажиров» 10 мужчин. Их id должен быть задан автоматически. Как новые пассажиры, они не имеют любимых аэропортов и еще не совершали покупок.
Задача 2
Добавьте семью из двух родителей и двух детей. Глава семейства как раз купил билеты на всю семью (вот прям только что, прямо сейчас). Обычно они вылетают из Ростова.
Если что-то непонятно или не получается – welcome в комменты к посту или в лс:)
Канал: https://t.me/ViamSupervadetVadens
Мой тг: https://t.me/ironicMotherfucker
Дорогу осилит идущий!