NULL
|
15
|
8
|
2011-01-03
|
16
|
1
|
NULL
|
16
|
1
|
2011-01-03
|
25
|
1
|
NULL
|
25
|
1
|
2011-01-02
|
27
|
2
|
NULL
|
27
|
2
|
2011-01-02
|
33
|
2
|
NULL
|
33
|
2
|
NULL
|
NULL
|
14
|
2011-01-02
|
NULL
|
10
|
2011-01-03
|
NULL
|
4
| Рассмотрим пример для нашей БД.
SELECT Дата, Блюдо,
SUM(Количество_порций) as Кол_порций
FROM Заказы
WHERE Блюдо >= 15
GROUP BY CUBE(Дата, Блюдо);
3.2.3.3. Раздел HAVING.
Предложение HAVING обычно используется c предложением GROUP BY. Предложение HAVING подобно предложению WHERE, но применимо только к целым группам (то есть к строкам в результирующем наборе, представляющим собой группы), тогда как предложение WHERE применимо к отдельным строкам. В запросе могут содержаться оба предложения: WHERE и HAVING. В этом случае:
Предложение WHERE применяется сначала к отдельным строкам таблиц или возвращающих табличное значение объектов в области схем. Группируются только строки, которые удовлетворяют условиям в предложении WHERE.
Затем предложение HAVING применяется к строкам в результирующем наборе. Только строки, которые удовлетворяют условиям HAVING, появляются в результирующем запросе. Можно применить предложение HAVING только к тем столбцам, которые появляются в предложении GROUP BY или статистической функции.
Когда GROUP BY не используется, предложение HAVING работает так же, как и предложение WHERE. (проверить)
Синтаксис
[HAVING условие_отбора_групп]
Пример 15.
Вывести статистику заказов по конкретному блюду
SELECT Дата,
Блюдо, SUM(Количество_порций) AS Количество_порций
FROM Заказы
GROUP BY Дата, Блюдо
HAVING Блюдо = 15;
Результат
|
|
Блюдо
|
Количество_порций
|
15
|
6
|
15
|
2
|
Эквивалентный ему запрос, но без HAVING
SELECT Дата, Блюдо, SUM(Количество_порций) AS Количество_порций
FROM Заказы
WHERE Блюдо = 15
GROUP BY Дата, Блюдо;
будет работать быстрее, так как будут заранее (до группировки и вычисления функции) отброшены ненужные строки.
Пример 16.
Вывести названия блюд, у которых количество заказанных порций в день превышает 5:
SELECT Дата, Блюдо, SUM(Количество_порций) AS Кол_порций
Результат
|
|
|
Дата
|
Блюдо
|
Кол_порций
|
2011-01-02
|
1
|
10
|
2011-01-02
|
15
|
6
| FROM Заказы
GROUP BY Дата, Блюдо
HAVING SUM(Кол_порций) > 5;
Для данного запроса эквивалентного с предложением WHERE не существует.
3.3. Примеры запросов с использованием нескольких таблиц.
Типичен вопрос: как же получить сведения о том, какие продукты необходимы для приготовления того или иного блюда, какова его калорийность и стоимость, если нужные данные "рассыпаны" по нескольким различным таблицам? Не лучше ли иметь одну большую таблицу, содержащую все сведения базы данных «Ресторан»?
База данных - это множество взаимосвязанных сущностей или отношений (таблиц) в терминологии реляционных СУБД. При проектировании стремятся создавать таблицы, в каждой из которых содержалась бы информация об одном и только об одном типе сущностей. Это облегчает модификацию базы данных и поддержание ее целостности. Даже при отсутствии средств одновременного доступа ко многим таблицам нежелателен проект, в котором информация о многих типах сущностей перемешана в одной таблице. SQL же обладает великолепным механизмом для одновременной или последовательной обработки данных из нескольких взаимосвязанных таблиц. В нем реализованы возможности "соединять" или "объединять" несколько таблиц и так называемые "вложенные подзапросы".
3.3.1. Соединения «с условием WHERE».
Вообще, соединения - это подмножества декартова произведения. Так как декартово произведение n таблиц - это таблица, содержащая все возможные строки r, такие, что r является сцеплением какой-либо строки из первой таблицы, строки из второй таблицы, ... и строки из n-й таблицы (а мы уже научились выделять с помощью SELECT любое подмножество реляционной таблицы), то осталось лишь выяснить, можно ли с помощью SELECT получить декартово произведение. Для получения декартова произведения нескольких таблиц, надо указать в предложении FROM перечень перемножаемых таблиц, а в предложении SELECT – все их столбцы.
Пример 17.
Предположим нам необходимо получить состав продуктов для каждого блюда.
Информация для этого запроса хранится в таблицах Блюда, Состав и Продукты. Для получения декартова произведения таблиц Блюда(n-строк), Состав (m-строк) и Продукты (k - строк) надо написать запрос
SELECT Блюда.*, Состав.*, Продукты.*
FROM Блюда, Состав, Продукты;
Получим таблицу, содержащую (n × m × k) строк:
Do'stlaringiz bilan baham: |