Можно ли использовать предложение WHERE после предложения HAVING?
Первое, что приходит мне на ум, - это sub-запросы, но я не уверен.
P.S. Если ответ утвердительный, не могли бы вы привести несколько примеров?
Можно ли использовать предложение WHERE после предложения HAVING?
Первое, что приходит мне на ум, - это sub-запросы, но я не уверен.
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 ...
Если это трюк, возможно, если WHERE и HAVING не находятся на том же уровне, о котором вы говорили, с подзапросом.
Я думаю, что-то вроде этого будет работать
Значение HAVING = (SELECT max (значение) FROM foo WHERE crit = 123)
p.s.: Почему вы спрашивали? У вас есть конкретная проблема?
p.s.s: ОК, глупо меня, я пропустил тег "интервью"...
Предложение HAVING - это просто предложение WHERE после GROUP BY. Почему бы не поставить свои условия WHERE в предложение HAVING?
В справке SELECT
Порядок обработки WHERE, GROUP BY, и HAVING Clauses Следующие шаги показать порядок обработки для SELECT с предложением WHERE, GROUP BY и предложение HAVING:
Предложение FROM возвращает начальную результат.
Предложение WHERE исключает строки, не удовлетворяя условиям поиска.
Предложение GROUP BY собирает выбранные строки в одну группу для каждого уникальное значение в предложении GROUP BY.
Совокупные функции, указанные в select list вычисляет суммарные значения для каждой группы.
Дополнительно предложение HAVING исключает строки, не соответствующие его поиску состояние.
Итак, нет, вы не можете.
В той же области ответа нет. Если подзапросы разрешены, вы можете полностью не использовать HAVING
.
Я думаю, что HAVING
является анахронизмом. Хью Дарвен ссылается на HAVING
как "Беспокойство структурированных запросов":
В старом SQL предложение
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;
Я сильно подозреваю, что ответ на вопрос Дарвена - нет.