loading..
Русский    English
20:42
листать

Предложение HAVING

Если предложение WHERE определяет предикат для фильтрации строк, то предложение HAVING применяется после группировки для определения аналогичного предиката, фильтрующего группы по значениям агрегатных функций. Это предложение необходимо для проверки значений, которые получены с помощью агрегатной функции не из отдельных строк источника записей, определенного в предложении FROM, а из групп таких строк. Поэтому такая проверка не может содержаться в предложении WHERE.

Пример 5.5.5

Получить количество ПК и среднюю цену для каждой модели, средняя цена которой менее $800

Консоль
Выполнить
  1. SELECT model, COUNT(model) AS Qty_model,
  2.    AVG(price) AS Avg_price
  3. FROM PC
  4. GROUP BY model
  5. HAVING AVG(price) < 800;

В результате выполнения запроса получим:

model Qty_model Avg_price
1232 4 425
1260 1 350

Заметим, что в предложении HAVING нельзя использовать псевдоним (Avg_price), используемый для именования значений агрегатной функции в предложении SELECT. Дело в том, что предложение SELECT, формирующее выходной набор запроса, выполняется предпоследним перед предложением ORDER BY. Ниже приведен порядок обработки предложений в операторе SELECT:

  1. FROM
  2. WHERE
  3. GROUP BY
  4. HAVING
  5. SELECT
  6. ORDER BY

Этот порядок не соответствует синтаксическому порядку общего представления оператора SELECT, который ближе к естественному языку:

  1. SELECT [DISTINCT | ALL]{*
  2. | [<выражение для столбца> [[AS] <псевдоним>]] [,…]}
  3. FROM <имя таблицы> [[AS] <псевдоним>] [,…]
  4. [WHERE <предикат>]
  5. [[GROUP BY <список столбцов>]
  6. [HAVING <условие на агрегатные значения>] ]
  7. [ORDER BY <список столбцов>]

Следует отметить, что предложение HAVING может использоваться и без предложения GROUP BY. При отсутствии предложения GROUP BY агрегатные функции применяются ко всему выходному набору строк запроса, т.е. в результате мы получим всего одну строку, если выходной набор не пуст.

Таким образом, если условие на агрегатные значения в предложение HAVING будет истинным, то эта строка будет выводиться, в противном случае мы не получим ни одной строки. Рассмотрим такой пример.

Пример 5.5.6

Найти максимальную, минимальную и среднюю цену на персональные компьютеры.

Решение этой задачи дает следующий запрос:

Консоль
Выполнить
  1. SELECT MIN(price) AS min_price,
  2. MAX(price) AS max_price, AVG(price) avg_price
  3. FROM PC;
результатам которого будет

min_price max_price avg_price
350.00 980.00 675.00

Если же мы добавим в условие ограничение, скажем, на среднюю цену:

Найти максимальную, минимальную и среднюю цену на персональные компьютеры при условии, что средняя цена не превышает $600:

Консоль
Выполнить
  1. SELECT MIN(price) AS min_price,
  2. MAX(price) AS max_price, AVG(price) avg_price
  3. FROM PC
  4. HAVING AVG(price) <= 600;
то в результате получим пустой результирующий набор, т.к. 675.00 > 600.

Рекомендуемые упражнения: 14, 15, 202837, 57, 63, 67, 68, 70, 72, 76, 81, 82, 85, 87, 89, 102, 114, 126, 129

Bookmark and Share
Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE CONSTRAINT Convert COUNT CROSS APPLY CTE DATEADD DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FOREIGN KEY FROM FULL JOIN GROUP BY Guadalcanal HAVING IDENTITY IN INNER JOIN insert INTERSECT IS NOT NULL IS NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker MAX Больше тэгов
Учебник обновлялся
несколько дней назад
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.
Rambler's Top100