- •Глава 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.2.3. Использование between.
С помощью BETWEEN … AND … (находится в интервале от ... до ...) можно отобрать строки, в которых значение какого-либо столбца находятся в заданном диапазоне.
Пример 7.
Выдать перечень продуктов, в которых значение содержания белка находится в диапазоне от 10 до 50:
Результат |
|
Продукт |
Белки |
Майонез |
31 |
Сметана |
26 |
Молоко |
28 |
Морковь |
13 |
Лук |
17 |
FROM Продукты
WHERE Белки BETWEEN 10 AND 50;
Можно задать и NOT BETWEEN (не принадлежит диапазону между), например:
Результат |
|
|
Продукт |
Белки |
Жиры |
Говядина |
189 |
124 |
Масло |
60 |
825 |
Яйца |
127 |
115 |
SELECT Продукт, Белки, Жиры
FROM Продукты
WHERE (Белки NOT BETWEEN 10 AND 50)
AND (Жиры > 100);
BETWEEN удобен при работе с данными, задаваемыми интервалами, начало и конец которых расположен в разных столбцах.
3.2.2.4. Использование in (not in).
Задает поиск выражения, включенного или исключенного из списка. Выражение поиска может быть константой или именем столбца, а списком может быть набор констант или, что чаще, вложенный запрос. Список значений необходимо заключать в скобки.
Пример 8.
Выдать сведения о блюдах на основе яиц, крупы и овощей
SELECT *
FROM Блюда
WHERE Основа IN (’Яйца’, ’Крупа’, ’Овощи’);
Результат |
|
|
|
|
|
ID_блюда |
Блюдо |
Вид |
Основа |
Вес |
Труд |
1 |
Салат летний |
1 |
Овощи |
200 |
3 |
3 |
Салат витаминный |
1 |
Овощи |
200 |
4 |
16 |
Драчена |
3 |
Яйца |
180 |
4 |
17 |
Морковь с рисом |
3 |
Овощи |
260 |
3 |
19 |
Омлет с луком |
3 |
Яйца |
200 |
5 |
20 |
Каша рисовая |
3 |
Крупа |
210 |
4 |
21 |
Пудинг рисовый |
3 |
Крупа |
160 |
6 |
23 |
Помидоры с луком |
3 |
Овощи |
260 |
4 |
Рассмотренная форма IN является в действительности просто краткой записью последовательности отдельных сравнений, соединенных операторами OR. Предыдущее предложение эквивалентно такому:
SELECT *
FROM Блюда
WHERE Основа=’Яйца’ OR Основа=’Крупа’ OR Основа=’Овощи’;
3.2.2.5. Использование like.
LIKE определяет, совпадает ли указанная символьная строка с заданным шаблоном. Шаблон может включать обычные символы и символы-шаблоны. Во время сравнения с шаблоном необходимо, чтобы его обычные символы в точности совпадали с символами, указанными в строке. Использование символов-шаблонов с оператором LIKE предоставляет больше возможностей, чем использование операторов сравнения строк = и < >.
Синтаксис:
выражение [NOT] LIKE строка_шаблон [ESCAPE esc_символ]
Символы строки_ шаблона интерпретируются следующим образом:
символ _ (подчеркивание) – заменяет любой одиночный символ,
символ % (процент) – заменяет любую последовательность из N символов (где N может быть нулем),
все другие символы означают просто сами себя.
[] – любой одиночный символ внутри диапазона([a-f]) или набора [abcdf].
[^]- любой одиночный символ, не принадлежащий диапазону ([^a-f]) или набору [^abcdf].
Пример 9.
Результат |
|
Блюдо | |
Салат летний | |
Салат мясной | |
Салат витаминный | |
Салат рыбный |
SELECT Блюдо
FROM Блюда
WHERE Блюдо LIKE 'Салат%';
В приведенном примере SELECT будет осуществлять выборку записей из таблицы Блюда, для которых значение в столбце Блюдо начинается сочетанием 'Салат' и содержит любую последовательность из нуля или более символов, следующих за сочетанием 'Салат'. Если бы среди блюд были "Луковый салат", "Фруктовый салат" и т.п., то они не были бы найдены. Для их отыскания надо изменить фразу WHERE:
WHERE Блюдо LIKE '%салат%'
(при отсутствии различий между малыми и большими буквами (такую настройку допускают некоторые СУБД))
А что делать, если необходимо искать знак процента или знак подчеркивания в строке? В LIKE предикате, вы можете определить любой одиночный символ как символ ESCAPE. Символ ESCAPE используется сразу перед процентом (подчеркиванием) в предикате, и означает, что процент (подчеркивание) будет интерпретироваться как обычный символ, а не как служебный. Например, мы могли бы найти все блюда, где присутствует символ подчеркивания, следующим образом:
SELECT *
FROM Блюда
WHERE Блюдо LIKE '%/_%' ESCAPE '/';
Данное предложение WHERE определяет '/' как символ ESCAPE. Символ ESCAPE должен быть одиночным символом и применяться только к одиночному символу сразу после него.
В примере выше, символ % начала и символ % окончания обрабатываются как служебные символы; только подчеркивание предоставлено само себе.