Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка SQL(14) (оптимизация).docx
Скачиваний:
62
Добавлен:
17.03.2015
Размер:
452.16 Кб
Скачать

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 же обладает великолепным механизмом для одновременной или последовательной обработки данных из нескольких взаимосвязанных таблиц. В нем реализованы возможности "соединять" или "объединять" несколько таблиц и так называемые "вложенные подзапросы".