Может ли предложение HAVING SQL-запроса использовать ТОЛЬКО агрегатные функции? - PullRequest
0 голосов
/ 06 октября 2019

Слайды лекций нашего инструктора по базам данных HAVING и GROUP BY приводят следующие требования:


enter image description here

К сожалению, так как SEO по этой теме настолько насыщен, почти невозможно найти источник, который отвечает на мой вопрос. Я могу найти множество примеров, когда HAVING действительно используется с агрегатами, но означает ли это, что он ДОЛЖЕН использовать агрегаты?

Исходя из моего понимания и опыта, предложение HAVING не обязательно только используют группирующие атрибуты или атрибуты, которые появляются в агрегатах (даже если он может , в отличие от его аналога WHERE).

Насколько я понимаю, HAVING был создан, потому чтоWHERE не может работать на уровне группы.

Итак, что именно мешает мне использовать любые другие условия в предложении HAVING, такие как простое старое условие HAVING attribute = value, где attribute не появляется ни в GROUP BY, ни в агрегате в предложении SELECT? Визуально говоря, для меня имеет смысл сказать:

"Выберите только те группы, в которых есть строка, у которой есть это значение в этом столбце."

1 Ответ

2 голосов
/ 06 октября 2019

HAVING похоже на предложение WHERE, которое имеет место после агрегации . Следующие два запроса функционально идентичны (при условии, что эллипсы совместимы):

select key1, key2, . . . 
from t
group by key1, key2
having . . .

и:

select x.*
from (select key1, key2, . . . 
      from t
      group by key1, key2
     ) x
having . . .

Предложение having может относиться к:

  • Агрегированные значения из select.
  • ключей из group by.
  • Функции, которые не имеют аргументов (например, текущая дата).
  • Выражениясостоит из вышеперечисленного.

Он не может относиться к неагрегированным столбцам, которые не являются ключами. Такие столбцы просто не существуют в наборе результатов, создаваемом group by.

. Есть одно исключение из этого, которое я объясняю с риском путаницы. Несколько баз данных поддерживают столбцы, которые функционально зависят как клавиши group by. На английском языке это означает, что если запрос агрегируется по уникальным / первичным ключам, то другие столбцы из этой таблицы могут использоваться без функций агрегации. Однако это расширение общего правила, согласно которому ссылки в предложении having являются только теми, которые доступны после агрегации.

...