- •Глава 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
- •Рекомендуемая литература
Приложение 1. Реализация реляционной алгебры средствами оператора select (Реляционная полнота sql).
Для того, чтобы показать, что язык SQL является реляционно полным, нужно показать, что любой реляционный оператор может быть выражен средствами SQL. На самом деле достаточно показать, что средствами SQL можно выразить любой из примитивных реляционных операторов.
Оператор декартового произведения
Реляционная алгебра: (R S),
Оператор SQL:
SELECT R.*, S.*
FROM R, S;
или
SELECT R.*, S.*
FROM R CROSS JOIN S;
Оператор проекции
Реляционная алгебра: ([X, Y,…, Z](R)),
Оператор SQL:
SELECT DISTINCT X, Y, …, Z
FROM R;
Оператор выборки
Реляционная алгебра: (,
Оператор SQL:
SELECT * FROM R
WHERE ;
Оператор объединения
Реляционная алгебра: (R S) ,
Оператор SQL:
SELECT * FROM R
UNION
SELECT * FROM S;
Оператор вычитания
Реляционная алгебра: (R S) ,
Оператор SQL:
SELECT * FROM R
EXCEPT
SELECT * FROM S;
Некоторые СУБД не поддерживают данный синтаксис, поэтому оператор вычитания может быть реализован с помощью предиката NOT IN. Пусть отношение R имеет первичный ключ PK1, а отношение S — PK2, тогда отрицание представляется:
SELECT * FROM R
WHERE PK1 NOT IN (SELECT PK2 FROM S);
Оператор пересечения
Реляционная алгебра: (R S)
Оператор SQL:
SELECT * FROM R
Intersect
SELECT * FROM S;
Некоторые СУБД не поддерживают данный синтаксис, поэтому оператор вычитания может быть реализован с помощью предиката IN. Пусть отношение R имеет первичный ключ PK1, а отношение S — PK2, тогда отрицание представляется:
SELECT * FROM R
WHERE PK1 IN (SELECT PK2 FROM S)
Оператор соединения
Реляционная алгебра:
Оператор SQL:
SELECT *
FROM R, S
WHERE ;
или
SELECT * FROM R JOIN S ON ;
Оператор деления
Реляционная алгебра: (R/S), где R (Х,Y) , S(Y)
Оператор SQL:
SELECT DISTINCT R.X
FROM R
WHERE NOT EXISTS (SELECT * FROM S
WHERE NOT EXISTS (SELECT * FROM R R1
WHERE R1.X = R.X and R1.Y = S.Y)
);
Замечание. Оператор SQL, реализующий деление отношений трудно запомнить, поэтому дадим пример эквивалентного преобразования выражений, представляющих суть запроса.
Пусть отношение R содержит данные о продуктах, необходимых для приготовления блюда, отношение S содержит список некоторых продуктов, которые есть в наличии. Атрибут X является номером блюда, атрибут Y является номером продукта.
Разделить отношение R на отношение S означает в данном примере "отобрать номера блюд, которые используют все продукты".
Преобразуем текст выражения:
"Отобрать номера блюд, которые используют все продукты" эквивалентно
"Отобрать те номера блюд из таблицы R, для которых не существует отсутствующих продуктов в таблице S" эквивалентно
"Отобрать те номера блюд из таблицы R, для которых не существует тех номеров продуктов из таблицы S, которые не используются этим блюдом" эквивалентно
"Отобрать те номера блюд из таблицы R, для которых не существует тех номеров продуктов из таблицы S, для которых не существует записей о блюдах в таблице R для этого продукта и этого блюда".
Последнее выражение дословно переводится на язык SQL. При переводе выражения на язык SQL нужно учесть, что во внутреннем подзапросе таблица R должна быть переименована, для того чтобы отличать ее от экземпляра этой же таблицы, используемой во внешнем запросе.
Реляционный оператор переименования выражается при помощи ключевого слова AS в списке отбираемых полей оператора SELECT.
Таким образом, язык SQL является реляционно полным.