Возможно ли иметь предложение WHERE после предложения HAVING?
Вопрос
Можно ли использовать предложение WHERE после предложения HAVING?
Первое, что приходит мне в голову, - это вложенные запросы, но я не уверен.
P.S.Если ответ утвердительный, не могли бы вы привести несколько примеров?
Решение
Нет, не в том же запросе.
В where
предложение идет перед having
и тот group by
.Если вы хотите отфильтровать записи перед группировкой, условие переходит в where
предложение, и если вы хотите отфильтровать сгруппированные записи, условие переходит в having
оговорка:
select ...
from ...
where ...
group by ...
having ...
Если ни один из них невозможно использовать по какой-либо странной причине, вам нужно сделать запрос подзапросом, чтобы вы могли поместить where
предложение во внешнем запросе:
select ...
from (
select ...
from ...
where ...
group by ...
having ...
) x
where ...
Другие советы
Предложение HAVING - это просто предложение WHERE после GROUP BY .Почему бы не поместить ваши условия WHERE в предложение HAVING?
Если это вопрос с подвохом, это возможно, если WHERE и HAVING не находятся на одном уровне, как вы упомянули, с подзапросом.
Я думаю, что что-то подобное сработало бы
ИМЕЮЩИЙ значение=(ВЫБЕРИТЕ max (значение) ИЗ foo, ГДЕ crit =123)
p.s.:почему ты спрашиваешь?У вас есть какая-то конкретная проблема?
p.s.s:Ладно, глупый я, я пропустил тег "интервью *"...
Из ВЫБЕРИТЕ справка
Порядок обработки предложений WHERE, GROUP BY, и HAVING Следующие шаги показывают порядок обработки для оператора SELECT с предложением WHERE, предложением GROUP BY и предложением HAVING:
Предложение FROM возвращает начальный результирующий набор.
Предложение where исключает строки, которые не встреча его условия поиска.
Предложение GROUP BY собирает выбранные строки в одну группу для каждого уникального значения в предложении GROUP BY.
Агрегатные функции, указанные в списке выбор, вычисляют итоговые значения для каждой группы.
Предложение HAVING дополнительно исключает строки, не соответствующие его условиям поиска .
Итак, нет, вы не можете.
В тех же рамках ответ - "нет".Если подзапросы разрешены, то вы можете избежать использования HAVING
полностью.
Я думаю, что HAVING
это анахронизм.Хью Дарвен ссылается на HAVING
как "Безумие структурированных запросов":
В старом SQL, the
WHERE
предложение не могло использоваться для результатов агрегирования, поэтому им пришлось изобрестиHAVING
(с тем же значением, что иWHERE
):SELECT D#, AVG(Salary) AS Avg_Sal FROM Emp GROUP BY D# HAVING AVG(Salary) > 999;
Но были бы у нас когда-нибудь
HAVING
если бы в 1979 году можно было написать:SELECT * FROM ( SELECT D#, AVG(Sal) AS Avg_Sal FROM Emp GROUP BY D# ) AS dummy WHERE Avg_Sal > 999;
Я сильно подозреваю, что ответ на вопрос Дарвен - "нет".