- •Глава 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
- •Рекомендуемая литература
Insert into Продукты (Продукт, Белки, Жиры)
VALUES ( 'Горох', 180, NULL);
Так как значение NULL - это специальный маркер, а не просто символьное значение, он не включается в одиночные кавычки. Поле ID_Продукта в данном случае не указывается, так как оно автоинкрементное.
7.2. Оператор INSERT для добавления набора записей.
Синтаксис:
INSERT INTO <имя_таблицы> [(<список столбцов>)]
SELECT …
Оператор ввода данных позволяет ввести сразу множество строк, если их можно выбрать из некоторой другой таблицы.
Допустим, мы хотим в меню на ‘03-01-2011’ добавить все горячие блюда из ассортимента ресторана.
Пример 47.
INSERT INTO Меню
SELECT b. ID_Блюда, b.Вид, '2011-01-03'
FROM Блюда b JOIN Справочник_вид_блюда c ON b.Вид=c.ID_Вид
WHERE c.Вид = 'Горячее';
Следует отметить, что количество полей и их тип в результате запроса, должны полностью совпадать с описанием таблицы. Запросы при добавлении могут быть любой сложности.
Пример 48.
INSERT INTO Продукты (Продукт, Белки, Жиры)
SELECT 'Горох', 180, NULL
UNION
SELECT 'Фасоль', 185, NULL;
Следует отметить, что в SQL Server 2008 реализована вставка нескольких строк с помощью VALUES.
С учетом этой возможности, последний запрос можно переписать в виде:
Пример 49.
INSERT INTO Продукты ( Продукт, Белки, Жиры)
VALUES ( 'Горох', 180, NULL), ( 'Фасоль', 185, NULL);
7.3. Оператор DELETE.
Оператор удаления данных позволяет удалить одну или несколько строк из таблицы в соответствии с условиями, которые задаются для удаляемых строк, при этом удаляется вся строка (строки), а не индивидуальные значения полей.
Синтаксис:
DELETE FROM <имя_таблицы>
[WHERE <условия_отбора>]
Если условия отбора не задаются, то из таблицы удаляются все строки, однако это не означает, что удаляется вся таблица. Исходная таблица остается, но она остается пустой, незаполненной.
Например, если нам надо очистить таблицу Меню, то мы можем удалить все строки командой
DELETE FROM Меню;
Условия отбора в части WHERE имеют тот же вид, что и условия фильтрации в операторе SELECT. Эти условия определяют, какие строки из исходного отношения будут удалены. Например, удалить из таблицы наличия все закончившиеся продукты
DELETE FROM Наличие
WHERE Количество = 0;
В предложении WHERE может находиться встроенный запрос. Например, если нам надо исключить из меню на сегодняшний день блюда, для приготовления которых необходимы продукты, имеющиеся на складе в ограниченном количестве(< 1 кг), то надо выполнить запрос.
Пример 50.
DELETE FROM Меню
WHERE Дата = GETDATE() and Блюдо IN (SELECT Блюдо
FROM Состав c LEFT JOIN Наличие n ON c.Продукт = n.Продукт
WHERE количество < 1 OR количество IS NULL);
Однако при выполнении операции DELETE, включающей сложный подзапрос, в подзапросе нельзя упоминать таблицу, из которой удаляются строки.
Функция GETDATE() возвращает текущую дату и время.
Все операции манипулирования данными связаны с понятием целостности базы данных, которое будет рассматриваться далее, поэтому они не всегда выполнимы, даже если написаны синтаксически правильно. Например, нельзя удалить продукт из таблицы Продукты, если он используется для приготовления какого-либо блюда, так как на него ссылаются строки из таблицы Состав.