Еще немного SQL
Вложенные SQL запросы
Вложенный запрос – это запрос, который находится внутри другого SQL запроса и встроен внутри условного оператора WHERE. На самом деле вложенность может быть и многоуровневой, то есть select в select в select и т.д.
Общая структура запроса
SELECT – поля_таблиц
FROM – список_таблиц
WHERE – конкретное_поле IN (
SELECT поле_таблицы FROM таблица )
Пример использования
Для примера мы хотим найти самого младшего члена семьи. Запрос будет выглядеть так:
SELECT *
FROM FailyMembers
WHERE birthday = ( SELECT MAX(birthday) FROM FamilyMembers)
Результат запроса
Подзапросы с ANY, IN, ALL
ANY — ключевое слово, которое должно следовать за операцией сравнения (>, <, <>, = и т.д.), возвращающее TRUE, если хотя бы одно из значений столбца подзапроса удовлетворяет обозначенному условию.
SELECT – поле_таблиц_1
FROM – таблица_1
WHERE – поле_таблицы_1 <= ANY (SELECT поле_таблицы_2 FROM таблица_2 )
ALL — ключевое слово, которое должно следовать за операцией сравнения, возвращающее TRUE, если все значения столбца подзапроса удовлетворяет обозначенному условию.
SELECT – поле_таблиц_1
FROM – таблица_1 WHERE – поле_таблицы_1 > ALL (SELECT поле_таблицы_2 FROM таблица_2 )
IN — ключевое слово, являющееся псевдонимом ключевому слову ANY с оператором сравнения = (эквивалентность), либо <> ALL для NOT IN. Например, следующие запросы равнозначны:
SELECT – поле_таблиц_1
FROM – таблица_1
WHERE – поле_таблицы_1 = ANY (SELECT поле_таблицы_2 FROM таблица_2 )
или
WHERE – поле_таблицы_1 IN (SELECT поле_таблицы_2 FROM таблица_2 )
Другие операции с БД
В теории реляционных баз данных часто фигурирует акроним CRUD, образованный от слов Create, Read, Update, Delete. Обозначает он тот факт, что данные в БД можно:
- добавлять (INSERT),
- считывать их оттуда (SELECT),
- изменять (UPDATE),
- удалять (DELETE).
Добавление данных, оператор INSERT
Для добавления новых записей в таблицу предназначен оператор INSERT.
Общая структура запроса
INSERT INTO – имя_таблицы [(поле_таблицы, …)]
VALUES – (значение_поля_таблицы, …)
| SELECT поле_таблицы, … FROM имя_таблицы …
Значения можно вставлять перечислением с помощью слова values, перечислив их в круглых скобках через запятую или c помощью оператора select. Таким образом, добавить новые записей можно следующими способами:
INSERT INTO Goods (good_id, good_name, type)
VALUES (5, ‘Table’, 2)
или
INSERT INTO Goods
VALUES (5, ‘Table’, 2)
| good_id | good_name | type |
| 1 | apartment fee | 1 |
| 2 | phone fee | 1 |
| 3 | bread | 2 |
Сделали INSERT, результат следующий
| good_id | good_name | type |
| 1 | apartment fee | 1 |
| 2 | phone fee | 1 |
| 3 | bread | 2 |
| 4 | Table | 2 |
Мы можем также вставить значения при помощи SELECT.
INSERT INTO Users (name, last_name, balance)
SELECT name, last_name, balance
FROM clients
| user_id | name | last_name | balance | phone_number | type |
| 1 | Edwin | Greer | 5000 | 38067… | 1 |
| 2 | Clifford | Barnett | 13000 | 38050… | 1 |
| 3 | Dinah | Wilson | 30000 | 38066… | 2 |
| name | last_name | balance |
| Carol | Hoover | 3000 |
| Rebecca | Small | 1000 |
| Robert | Banks | 20000 |
| user_id | name | last_name | balance | phone_number | type |
| 1 | Edwin | Greer | 5000 | 38067… | 1 |
| 2 | Clifford | Barnett | 13000 | 38050… | 1 |
| 3 | Dinah | Wilson | 30000 | 38066… | 2 |
| 4 | Carol | Hoover | 3000 | null | null |
| 5 | Rebecca | Small | 1000 | null | null |
| 6 | Robert | Banks | 20000 | null | null |
Обновление данных, оператор UPDATE
Для редактирования записей в таблице существует SQL оператор UPDATE.
Общая структура запроса
UPDATE – имя_таблицы
SET – поле_таблицы_1 = значение_поля_таблицы_1
поле_таблицы_n = значение_поля_таблицы_n
WHERE – условие_выборки
Например, нам надо обновить имя, тогда запрос будет выглядеть следующим образом:
UPDATE FamilyMembers
SET member_name = “Andie Anthony”
WHERE member_name = “Andie Quincey”
В запросах на обновление данных можно менять значения, опираясь на предыдущие значение.
UPDATE Payments
SET unit_price = unit_price * 2
Удаление данных, оператор DELETE
Время от времени возникает задача удаления записей из таблицы. Для этого в SQL предусмотрены операторы DELETE и TRUNCATE, из которых наиболее универсальным и безопасным является первый вариант.
Общая структура запроса
DELETE FROM – имя_таблицы
WHERE – условие_выборки
Эту же операцию (удаления всех записей) можно сделать также с помощью оператора TRUNCATE. Он выполнит удаление таблицы и пересоздаст ее заново – этот вариант работает гораздо быстрее, чем удаление всех записей одна за другой (как в случае с DELETE) особенно для больших таблиц.
Если в DELETE запросе используется JOIN, то необходимо указать из каких(ой) именно таблиц(ы) требуется удалять записи.
DELETE имя_таблицы_ 1 (, имя_таблицы_2)
FROM имя_таблицы_1 JOIN имя_таблицы_2
ON имя_таблицы_1.поле = имя_таблицы_2.поле WHERE – условие_выборки
Например, удалим все бронирования жилья, где нет кухни. Запрос будет следующий:
DELETE Reservations
FROM Reservations JOIN Rooms
ON Reservations.room_id = Rooms.id
WHERE Rooms.has_kitchen = false