- •Глава 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
- •Рекомендуемая литература
Глава 3. Выборка данных.
Все запросы на получение практически любого количества данных из одной или нескольких таблиц выполняются с помощью единственного оператора SELECT. В общем случае результатом выполнения оператора SELECT является другая таблица. К этой новой (рабочей) таблице может быть снова применена операция SELECT и т.д., т.е. такие операции могут быть вложены друг в друга. Представляет исторический интерес тот факт, что именно возможность включения одного предложения SELECT внутрь другого послужила мотивировкой использования прилагательного "структурированный" в названии языка SQL.
3.1. Оператор select. Синтаксис.
Оператор SELECT может использоваться как:
самостоятельная команда на получение и вывод строк таблицы, сформированной из столбцов и строк одной или нескольких таблиц (представлений);
элемент WHERE- или HAVING-условия (сокращенный вариант предложения, называемый "вложенный запрос");
фраза выбора в командах CREAT VIEW, DECLARE CURSOR или INSERT;
средство присвоения глобальным переменным значений из строк сформированной таблицы (INTO-фраза).
Оператор SELECT (выбрать) имеет следующий формат:
SELECT [[ALL] | DISTINCT] [ТОР n [PERCENT]] [WITH TIES] {* | элемент_SELECT [, элемент_SELECT] ...}
FROM таблица [псевдоним] [, таблица [псевдоним]] ...
[WHERE условие_отбора_строк]
[GROUP BY [таблица.]столбец [, [таблица.]столбец] ...
[HAVING условие_отбора_групп]]
[ORDER BY {[таблица.]столбец | номер_элемента_SELECT} [[ASC] | DESC]
[, {[таблица.]столбец | номер_элемента_SELECT } [ [ASC] | DESC] ] ...] ];
Этот оператор можно прочитать следующим образом:
SELECT (выбрать) — данные из указанных столбцов и (если необходимо) выполнить перед выводом их преобразование в соответствии с указанными выражениями и (или) функциями
FROM (из) — перечисленных таблиц, в которых расположены эти столбцы
WHERE (где) — строки из указанных таблиц должны удовлетворять указанному перечню условий отбора строк
GROUP BY (группируя по) — указанному перечню столбцов с тем, чтобы получить для каждой группы единственное агрегированное значение, используя во фразе SELECT SQL-функции SUM (сумма), COUNT (количество), MIN (минимальное значение), MAX (максимальное значение) или AVG (среднее значение)
HAVING (имея) — в результате лишь те группы, которые удовлетворяют указанному перечню условий отбора групп
ORDER BY (упорядочить) — результаты выбора данных по указанному перечню столбцов. При этом упорядочение можно производить в порядке возрастания - ASC (ASCending)(по умолчанию) или убывания DESC (DESCending).
Рассмотрим каждую строку этого оператора подробно.
Раздел SELECT.
В разделе SELECT указывается список столбцов, которые будут включены в результат выборки. Структура раздела SELECT следующая:
SELECT [[ALL] | DISTINCT] [ТОР n [PERCENT]] [WITH TIES] {* | элемент_SELECT [, элемент_SELECT]...}
Параметры раздела обозначают следующее:
ALL – указывает, что в результат выборки должны быть включены все строки возвращаемые запросом, т.е. выборка может содержать повторяющиеся строки (используется по умолчанию).
DISTINCT – позволяет исключить из выборки повторяющиеся строки.
ТОР n [PERCENT] [WITH TIES] – ограничивает количество строк в выборке. Параметр n задает максимальное количество строк, при указании параметра PERCENT количество строк задается в процентах от общего числа строк, возвращаемых запросом.
*- означает включение в результат выборки всех столбцов всех таблиц, участвующих в запросе и указанных в разделе FROM. При этом порядок вывода полей соответствует порядку, в котором эти поля определялись при создании таблиц.
элемент_SELECT – список столбцов, которые включены в результат выборки. Структура этой конструкции следующая:
элемент_SELECT = {[таблица.]* | [таблица.]столбец [AS псевдоним] | (выражение) [AS псевдоним] | константа [AS псевдоним] | переменная [AS псевдоним] | SQL_функция [AS псевдоним]}
термин таблица – используется для обобщения понятий: базовая таблица, представление.
выражение – подразумевает выражение, на основе которого будет формироваться содержимое столбца.
AS псевдоним – определение псевдонима для столбца.
Раздел FROM.
Раздел FROM содержит список таблиц, из которых будет производиться выборка данных.
Структура раздела FROM следующая:
FROM таблица [псевдоним] [, таблица [псевдоним]] ...
псевдоним - позволяет присвоить таблице имя, под которым на неё можно будет ссылаться в запросе, служит для упрощения вида запроса при работе с длинными именами таблиц и для именования временных таблиц (полученных в результате выполнения оператора SELECT)
Также в разделе FROM можно указать метод связывания таблиц между собой (фраза JOIN будет рассмотрена в п. 3.4.)
Следует обратить внимание на тот факт, что если даже ни один из столбцов таблицы не включен в результат запроса, но используется в других разделах запроса, то имя этой таблицы также должно быть указано в разделе FROM.