- •Глава 1. Историческая справка. 10
- •Глава 2. Пример бд «Ресторан». 20
- •Глава 3. Выборка данных. 25
- •Глава 4. Подзапросы и производные таблицы 65
- •Глава 5. Функции ранжирования. 86
- •Глава 1. Историческая справка.
- •Стандарты.
- •1.2. Структура sql.
- •Глава 2. Пример бд «Ресторан».
- •2.1. Описание.
- •2.2. Диаграмма.
- •2.3. Данные в таблицах.
- •Глава 3. Выборка данных.
- •3.1. Оператор select. Синтаксис.
- •3.2. Примеры запросов с использованием единственной таблицы.
- •3.2.1. Выборка без использования фразы where.
- •3.2.1.1. Простейшие примеры.
- •3.2.1.2. Исключение дубликатов (distinct).
- •3.2.1.3. Выборка вычисляемых значений.
- •3.2.2. Выборка c использованием фразы where.
- •3.2.2.1. Использование операторов сравнения.
- •3.2.2.2. Сравнение с null.
- •3.2.2.3. Использование between.
- •3.2.2.4. Использование in (not in).
- •3.2.2.5. Использование like.
- •3.2.2.6. Выборка с упорядочением.
- •3.2.3. Использование агрегатных функций для подведения итогов.
- •3.2.3.1. Агрегатные функции без использования фразы group by.
- •3.2.3.2. Фраза group by.
- •3.2.3.3. Раздел having.
- •3.3. Примеры запросов с использованием нескольких таблиц.
- •3.3.1. Соединения «с условием where».
- •3.3.2. Соединение таблиц с дополнительными условиями.
- •3.3.2.1. Соединение таблицы со своей копией.
- •3.4. Соединения нескольких таблиц, используя join.
- •3.4.1. Внутреннее соединение.
- •3.4.2. Внешнее соединение.
- •3.4.2.1. Левое внешнее соединение.
- •3.4.2.2. Правое внешнее соединение.
- •3.4.2.3. Полное внешнее соединение.
- •3.4.2.4. Перекрёстное соединение.
- •3.4.3. Реальные примеры соединений.
- •Isnull(cast(n.Количество as varchar), ’нет’) as на_складе
- •Isnull(cast(n.Количество as varchar),’нет’) as на_складе
- •Глава 4. Подзапросы и производные таблицы
- •4.1.Производная таблица.
- •4.2. Вложенные подзапросы
- •4.2.1 Простые вложенные подзапросы
- •4.2.2. Использование одной и той же таблицы во внешнем и вложенном подзапросе
- •4.2.3. Использование агрегатных функций в подзапросах.
- •4.2.4. Подзапросы в предложении having.
- •4.3. Соотнесенные подзапросы.
- •4.4 Использование оператора exists.
- •4.5. Использование операторов any и all.
- •4.6. Объединение запросов union.
- •4.6.1. Union и устранение дубликатов.
- •4.6.2. Использование строк и выражений с union.
- •4.6.3. Использование union с order by.
- •4.6.4. Реализация внешнего полного соединения через запросы с union.
- •Глава 5. Функции ранжирования.
- •5.1. Функция row_number.
- •5.2. Функции rank() и dense_rank()
- •Глава 6. ИспользованиеPivoTиUnpivot.
- •In ([Овощи], [Мясо], [Рыба], [Молоко], [Яйца], [Крупа], [Фрукты], [Кофе])
- •In ( [первый сведенный столбец], [второй сведенный столбец],
- •In ([Овощи], [Мясо], [Рыба], [Молоко], [Яйца], [Крупа], [Фрукты], [Кофе])
- •Insert into Продукты (id_Продукта, Продукт, Белки)
- •Values (18, 'Горох', 180 );
- •Insert into Продукты (Продукт, Белки, Жиры)
- •7.4. Оператор update.
- •Глава 8. Представление.
- •Insert into Список_блюд values (36, 'Рагу', 3, 20);
- •Глава 9. Создание, изменение и удаление таблиц.
- •9.1. Оператор create table
- •6. Ограничение identity (автоинкрементное поле).
- •9.2. Изменение таблицы после того как она была создана (alter table).
- •9.3. Удаление таблицы (drop table).
- •9.4. Операторы создания и удаления индексов.
- •9.5. Понятие домена
- •Глава 10. Обобщенные табличные выражения (сте).
- •Представления, производные таблицы и выражения cte.
- •Рекурсивные запросы.
- •Id_father integer foreign key references Tree (id),
- •Values (1, null, 'all'), (2, 1, 'sea'), (3, 1, 'earth'),
- •Деревья без рекурсии.
- •Пример использования сте для решения задачи Коммивояжера.
- •Insert into tur select to_town, from_town, miles from tur;
- •Глава 11. Этапы выполнения командыSql.
- •11.1. Оптимизация запросов.
- •Приложение 1. Реализация реляционной алгебры средствами оператора select (Реляционная полнота sql).
- •Intersect
- •Рекомендуемая литература
7.4. Оператор update.
Операция обновления данных UPDATE требуется тогда, когда происходят изменения во внешнем мире и их надо адекватно отразить в БД, так как надо всегда помнить, что БД отражает некоторую предметную область. Например, изменились закупочные цены на продукты питания.
Синтаксис:
UPDATE< имя_таблицы>
SET <имя_столбца> = <новое_значение>[,< имя_столбца> = <новое_значение> …]
[ FROM <список_таблиц>]
[WHERE <условие_отбора>]
Часть WHERE является необязательной, так же как и в операторе DELETE. Она позволяет отобрать строки, к которым будет применена операция модификации. Если условие отбора не задается, то операция модификации будет применена ко всем строкам таблицы.
Часть FROM позволяет задать имена таблиц, которые будут использоваться при формировании условия отбора
Например, при удорожании говядины на 5 процентов, необходимо выполнить следующую команду обновления
Пример 51.
UPDATE Наличие
SET Цена = Цена * 1.5
WHERE Продукт = (SELECT ID_Продукта
FROM Продукты
WHERE Продукт = 'Говядина');
Или
UPDATE Наличие
SET Цена = Цена * 1.5
FROM Продукты
WHERE Наличие.Продукт = Продукты.ID_Продукта
and Продукты.Продукт = 'Говядина';
В первом случае используется вложенный подзапрос, который возвращает номер продукта, во втором случае происходит соединение таблиц для нахождения нужного номера продукта.
В каких случаях требуется провести изменение в нескольких строках? Это не такая уж редкая задача.
Пример 52.
UPDATE Наличие
SET Цена = Цена * 1.5;
Этот запрос поднимет цены на все продукты на 5%.
Если необходимо изменить значения в нескольких столбцах таблицы, то надо выполнить запрос подобный этому
Пример 53.
UPDATE Наличие
SET Количество = Количество + 100, Цена = Цена * 1.5
FROM Продукты
WHERE Наличие.Продукт = Продукты. ID_Продукта
and Продукты.Продукт = 'Говядина';
Пример изменения значения на неопределенное:
SET Белки = NULL
Глава 8. Представление.
Обычные таблицы, те, что мы рассматривали ранее, относятся к базовым, т.е. содержащим данные и постоянно находящимся на устройстве хранения информации. Представления, или просмотры (VIEW), представляют собой временные, производные (иначе - виртуальные) таблицы и являются объектами базы данных, информация в которых не хранится постоянно, как в базовых таблицах, а формируется динамически при обращении к ним. Представление не может существовать само по себе, а определяется только в терминах одной или нескольких таблиц (базовых или виртуальных). Применение представлений позволяет разработчику базы данных обеспечить каждому пользователю или группе пользователей наиболее подходящие способы работы с данными, что решает проблему простоты их использования и безопасности. Содержимое представлений выбирается из других таблиц с помощью выполнения запроса, причем при изменении значений в таблицах данные в представлении автоматически меняются. Представление - это фактически тот же запрос, который выполняется всякий раз при участии в какой-либо команде. Результат выполнения этого запроса в каждый момент времени становится содержанием представления. У пользователя создается впечатление, что он работает с настоящей, реально существующей таблицей.
В отличие от других объектов базы данных представление не занимает дисковой памяти за исключением памяти, необходимой для хранения определения самого представления.
Синтаксис:
CREATE VIEW <имя_представления> [(<имя_столбца> [,<имя_столбца> ...])]
[WITH ENCRYPTION]
AS SELECT …
[WITH CHECK OPTION]
По умолчанию имена столбцов в представлении соответствуют именам столбцов в исходных таблицах. Явное указание имени столбца требуется для вычисляемых столбцов или при соединении нескольких таблиц, имеющих столбцы с одинаковыми именами. Имена столбцов перечисляются через запятую, в соответствии с порядком их следования в представлении.
Параметр WITH ENCRYPTION предписывает СУБД шифровать SQL-код запроса, что гарантирует невозможность его несанкционированного просмотра и использования. Параметр WITH CHECK OPTION предписывает СУБД исполнять проверку изменений, производимых через представление, на соответствие критериям, определенным в операторе SELECT. Это означает, что не допускается выполнение изменений, которые приведут к исчезновению строки из представления. Такое случается, если для представления установлен горизонтальный фильтр и изменение данных приводит к несоответствию строки установленным фильтрам. Использование аргумента WITH CHECK OPTION гарантирует, что сделанные изменения будут отображены в представлении. Если пользователь пытается выполнить изменения, приводящие к исключению строки из представления, при заданном аргументе WITH CHECK OPTION СУБД выдаст сообщение об ошибке и все изменения будут отклонены.
Пример 54.
Показать в представлении стоимость всех блюд.
Создание представления:
CREATE VIEW Цены (Название, Цена)
AS
SELECT b.Блюдо, SUM (s.Вес*n.Цена/1000)+b.Труд as Цена
FROM (Блюда b JOIN Состав s ON b.ID_блюда =s.Блюдо )
JOIN Наличие n ON s.Продукт = n.Продукт
GROUP BY b.Блюдо, b.Труд;
Представление можно использовать в команде так же, как и любую другую таблицу. К представлению можно строить запрос, модифицировать его (если оно отвечает определенным требованиям), соединять с другими таблицами. Содержание представления не фиксировано и обновляется каждый раз, когда на него ссылаются в команде.
Пример 55 (использование представлений):
Найти самые дешевые блюда.
SELECT *
FROM Цены
WHERE Цена = ( SELECT MIN(Цена) From Цены );
Представления значительно расширяют возможности управления данными. В частности, это прекрасный способ разрешить доступ к информации в таблице, скрыв часть данных.
Представление может изменяться командами модификации DML, но фактически модификация воздействует не на само представление, а на базовую таблицу.
Не все представления в SQL могут быть модифицированы. Модифицируемое представление определяется следующими критериями:
основывается только на одной базовой таблице;
содержит первичный ключ этой таблицы;
не содержит DISTINCT в своем определении;
не использует GROUP BY или HAVING в своем определении;
по возможности не применяет в своем определении подзапросы;
не использует константы или выражения значений среди выбранных полей вывода;
в просмотр должен быть включен каждый столбец таблицы, имеющий атрибут NOT NULL;
оператор SELECT просмотра не использует агрегирующие (итоговые) функции, соединения таблиц, хранимые процедуры и функции, определенные пользователем;
основывается на одиночном запросе, поэтому объединение UNION не разрешено.
Если представление удовлетворяет этим условиям, к нему могут применяться операторы INSERT, UPDATE, DELETE. Различия между модифицируемыми представлениями и представлениями, предназначенными только для чтения, не случайны. Цели, для которых их используют, различны. С модифицируемыми представлениями в основном обходятся точно так же, как и с базовыми таблицами. Фактически, пользователи не могут даже осознать, является ли объект, который они запрашивают, базовой таблицей или представлением, т.е. прежде всего это средство защиты для сокрытия конфиденциальных или не относящихся к потребностям данного пользователя частей таблицы. Представления в режиме <только для чтения> позволяют получать и форматировать данные более рационально. Они создают целый арсенал сложных запросов, которые можно выполнить и повторить снова, сохраняя полученную информацию. Результаты этих запросов могут затем использоваться в других запросах, что позволит избежать сложных предикатов и снизить вероятность ошибочных действий.
Приведенное в примере представление является немодифицируемым.
Пример 56 (модифицируемого представления).
CREATE VIEW Список_блюд
AS
SELECT ID_Блюда, Блюдо, Вид, Труд FROM Блюда;
Команда модификации представления.