Кафедра ИТКафедра ИТ
Обучение
  • О кафедре
  • Направления подготовки
  • Друзья и партнеры
  • Структура кафедры
  • Обращение к студентам
  • Официальный сайт «ВШП»
GitHub
Обучение
  • О кафедре
  • Направления подготовки
  • Друзья и партнеры
  • Структура кафедры
  • Обращение к студентам
  • Официальный сайт «ВШП»
  • ОП.08 - 18 - Переменные, условия и LAST_INSERT_ID

Примечание

ЭТО АРХИВНАЯ ВЕРСИЯ КУРСА!

Материалы предназначаются для пересдающих дисциплину "ОП.08 - Основы проектирования баз данных" в соответствии с учебными планами СПО годов набора ДО 2024-го. Для того чтобы ознакомиться с актуальным курсом "ИТ.03 - Основы проектирования баз данных" включающим интерактивные примеры, перейдите по ссылке.

Материалы были перенесены со старого сайта с минимальной доработкой, поэтому не все возможности курса могут работать как ожидается, где-то может слететь форматирование.

Домашние задания в рамках курса проверяться не будут!

ОП.08 - 18 - Переменные, условия и LAST_INSERT_ID

Примеры данной темы используют учебную БД:

bookshelf.sql

bookshelf.sql

Переменные

Переменные - это именованные значения, которые могут изменяться в процессе выполнения программы. В языке SQL, переменные позволяют сохранять и использовать значения, которые были вычислены ранее или введены пользователем.

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

В MySQL 8, синтаксис определения переменных выглядит следующим образом:

SET @variable_name = value;

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

Пример 1

Допустим, мы хотим определить переменную shelf_count, которая будет содержать количество полок в библиотеке. Мы можем использовать следующий запрос:

SET @shelf_count = (SELECT COUNT(*) FROM shelves);
SELECT @shelf_count;

Этот запрос выбирает количество строк из таблицы shelves и сохраняет его в переменной @shelf_count.

Пример 2

Мы можем также использовать переменные для выполнения операций на выборкой данных. Например, мы можем определить переменную book_count и вывести список книг, опубликованных после указанного года:

SET @year = 1970;
SET @book_count = (SELECT COUNT(*) FROM books WHERE year > @year);
SELECT @book_count;

Этот запрос использует переменную @year для указания года, после которого нужно выбрать книги, и переменную @book_count для подсчета количества таких книг.

Посмотреть что это за книги можно запросом:

SELECT title, year FROM books WHERE year > @year;

Пример 3

Мы можем использовать переменные для обновления данных в таблицах. Например, мы можем определить переменную shelves_id и обновить запись в таблице books, указав ее идентификатор:

SET @shelf_id = (SELECT id FROM shelves WHERE title = 'Полка в спальне' LIMIT 1);
SET @book_id = (SELECT id FROM books WHERE title = 'Война и мир' AND year = 1869 LIMIT 1);
UPDATE books SET shelves_id = @shelf_id WHERE id = @book_id;

Этот запрос использует переменную @shelf_id для указания идентификатора полки, на которую нужно переместить книгу, id которой хранится в переменной @book_id.

Условия

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

Оператор IF

Оператор IF имеет простой синтаксис и может использоваться в качестве конструкции условия:

IF(условие, выражение_1, выражение_2)

В этом случае, если условие истинно, оператор вернет значение выражения_1, в противном случае - значение выражения_2.

Рассмотрим пример использования оператора IF на таблице books, чтобы извлечь данные только тех книг, у которых есть полка:

SELECT title, YEAR, IF(shelves_id IS NULL, 'Нет полки', 'Есть полка') AS shelf FROM books;

Это запрос извлекает данные из таблицы books и добавляет новый столбец shelf, который содержит информацию о том, есть ли у книги стеллаж или нет.

Оператор CASE

Оператор CASE похож на оператор IF, но он более гибкий и может проверять несколько условий. Его синтаксис выглядит следующим образом:

CASE
    WHEN условие_1 THEN выражение_1
    WHEN условие_2 THEN выражение_2
    ...
    ELSE выражение_n
END

В этом случае, если условие_1 истинно, оператор вернет значение выражения_1, если условие_2 истинно - значение выражения_2 и так далее. Если ни одно из условий не истинно, оператор вернет значение выражения_n.

Рассмотрим пример использования оператора CASE на таблице books, чтобы добавить новый столбец, отображающий информацию о том, сколько авторов написали каждую книгу:

SELECT title,
       (CASE
            WHEN COUNT(authors_books.authors_id) = 1 THEN CONCAT(COUNT(authors_books.authors_id), ' автор')
            ELSE CONCAT(COUNT(authors_books.authors_id), ' авторов')
        END) AS authors_count
FROM books
JOIN authors_books ON books.id=authors_books.books_id
GROUP BY title;

Этот запрос извлекает данные из таблицы books и связанной таблицы authors_books. Затем он считает количество авторов для каждой книги и создает новый столбец authors_count, который содержит это количество, а также слово "автор" или "авторов" в зависимости от количества.

LAST_INSERT_ID

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

Для примеров мы будем использовать базу данных, состоящую из четырех таблиц: shelves (полки), friends (друзья), books (книги) и authors (авторы). Таблицы books и authors связаны многие-ко-многим через таблицу authors_books.

Предположим, что мы хотим добавить новую полку в таблицу shelves и затем добавить новую книгу в таблицу books, используя только что созданный идентификатор полки. Мы можем использовать LAST_INSERT_ID(), чтобы получить этот идентификатор.

Пример:

INSERT INTO shelves (title) VALUES ('Новая полка');
SET @shelf_id = LAST_INSERT_ID();
INSERT INTO books (title, year, shelves_id) VALUES ('Гарри Поттер и сдача практического экзамена по основам проектирования баз данных', 2023, @shelf_id);

В этом примере мы вставляем новую запись в таблицу shelves, затем сохраняем идентификатор этой записи в переменную @shelf_id с помощью LAST_INSERT_ID(). Затем мы используем эту переменную для вставки новой записи в таблицу books, связывая ее с только что созданной полкой.

Также можно использовать LAST_INSERT_ID() для получения идентификатора автоматически созданных записей, например, когда вы вставляете новую запись в таблицу с автоинкрементным первичным ключом.

Пример:

INSERT INTO friends (name, contacts) VALUES ('Денис', 'deniska@example.com');
SELECT LAST_INSERT_ID();

В этом примере мы вставляем новую запись в таблицу friends, которая имеет автоинкрементный первичный ключ. Затем мы используем LAST_INSERT_ID(), чтобы получить идентификатор только что созданной записи.

LAST_INSERT_ID() полезна для выполнения множества операций на нескольких таблицах с использованием значения первичного ключа, связанного со вставленным значением. Она предоставляет удобный способ получить доступ к последнему вставленному идентификатору и использовать его в следующих запросах.

Последнее обновление: 31.10.2025, 18:45
Предыдущая
ОП.08 - 17 - UPDATE SELECT и INSERT INTO SELECT для запросов с JOIN-ами
Следующая
ОП.08 - Практический экзамен - Вариант №1
© Кафедра информационных технологий ЧУВО «ВШП», 2025. Версия: 0.20.1
Материалы доступны в соответствии с лицензией: