- •Глава 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.2. Примеры запросов с использованием единственной таблицы.
3.2.1. Выборка без использования фразы where.
3.2.1.1. Простейшие примеры.
Пример 1.
Для каждого продукта, используемого в ресторане, указать количество белков, жиров и углеводов.
SELECT Продукт, Белки, Жиры, Углеводы
FROM Продукты;
дает результат
Результат |
|
|
|
Продукт |
Белки |
Жиры |
Углеводы |
Говядина |
189 |
124 |
NULL |
Судак |
190 |
80 |
NULL |
Масло |
60 |
825 |
90 |
Майонез |
31 |
670 |
26 |
Яйца |
127 |
115 |
7 |
… |
|
|
|
Кофе |
127 |
36 |
9 |
При необходимости получения полной информации о продуктах, можно было бы дать запрос
SELECT ID_продукта, Продукт, Белки, Жиры, Углеводы, К, Са, Na, В2, РР, С
FROM Продукты;
или использовать его более короткую нотацию:
SELECT *
Результат |
|
Основа | |
Кофе | |
Крупа | |
Молок | |
Мясо | |
Овощи | |
Рыба | |
Фрукты | |
Яйца |
Результат |
|
Основа | |
Овощи | |
Мясо | |
Овощи | |
Рыба | |
Рыба | |
Мясо | |
Молоко | |
… | |
Кофе |
Пример 2.
Выдать основу всех блюд:
SELECT Основа FROM Блюда;
дает результат, показанный на рис. 3.1 а.
а |
б |
Рис. 3.1 Простейшие запросы
3.2.1.2. Исключение дубликатов (distinct).
В предыдущем примере был выдан правильный, но не совсем удачный перечень основных продуктов: из него не были исключены дубликаты. Для исключения дубликатов необходимо дополнить запрос ключевым словом DISTINCT (различный, различные):
SELECT DISTINCT Основа
FROM Блюда;
Результат приведен на рис. 3.1 б.
3.2.1.3. Выборка вычисляемых значений.
Пример 3.
Нужно получить значение калорийности всех продуктов. В этом запросе необходимо учесть, что при окислении 1 г углеводов или белков в организме освобождается в среднем 4.1 ккал, а при окислении 1 г жиров - 9.3 ккал:
SELECT Продукт, ((Белки+Углеводы)*4.1+Жиры*9.3) as ккал
FROM Продукты;
Выражение ((Белки+Углеводы)*4.1+Жиры*9.3) не является полем базовой таблицы, а следовательно, не имеет имени. Использование псевдонима позволяет именовать результирующий столбец (рисунок 3.2 а).
Фраза SELECT может включать не только выражения, но и отдельные числовые или текстовые константы. Следует отметить, что текстовые константы должны заключаться в апострофы (') (рисунок 3.2 б).
SELECT Продукт, 'Калорий =', ((Белки+Углеводы)*4.1+Жиры *9.3)
FROM Продукты;
Результат |
|
Продукт |
ккал |
Говядина |
NULL |
Судак |
NULL |
Масло |
8287,5 |
Майонез |
6464,7 |
Яйца |
1618,9 |
Сметана |
3011,4 |
Кофе |
892,4 |
Результат |
|
|
Продукт |
|
|
Говядина |
Калорий = |
NULL |
Судак |
Калорий = |
NULL |
Масло |
Калорий = |
8287,5 |
Майонез |
Калорий = |
6464,7 |
Яйца |
Калорий = |
1618,9 |
Сметана |
Калорий = |
3011,4 |
Кофе |
Калорий = |
892,4 |
а б
Рис.3.2. Примеры запросов с вычисляемыми полями
3.2.1.4. NULL-значения в выражениях.
В некоторых ячейках результата стоит NULL. Почему?
Как правило, применение NULL-значения в выражении приводит к результату, равному NULL. Например, SELECT (5+NULL) вернет NULL, а не 5. Как и в случае простых выражений, при передаче большинству функций NULL-значений результатом будет NULL. Исключение составляют функции, специально предназначенные для работы с неопределенными значениями.
ISNULL (<проверяемое поле>,< значение, если проверяемое поле равно NULL>)
преобразует NULL-значение к значению, отличному от NULL. Тогда запрос будет выглядеть так
Результат |
|
Продукт |
|
Говядина |
1928,1 |
Судак |
1523 |
Масло |
8287,5 |
Майонез |
6464,7 |
Яйца |
1618,9 |
Сметана |
3011,4 |
Кофе |
892,4 |
( ISNULL(Белки,0)+ISNULL(Углеводы,0))*4.1
+ISNULL(Жиры,0) *9.3
FROM Продукты;