DML. INSERT

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

 

Дорогу осилит идущий!

Report Page