У меня есть следующие две таблицы:
1. Lecturers (LectID, Fname, Lname, degree).
2. Lecturers_Specialization (LectID, Expertise).
Я хочу найти лектора с самой специализацией. Когда я пытаюсь это, это не работает:
SELECT
L.LectID,
Fname,
Lname
FROM Lecturers L,
Lecturers_Specialization S
WHERE L.LectID = S.LectID
AND COUNT(S.Expertise) >= ALL (SELECT
COUNT(Expertise)
FROM Lecturers_Specialization
GROUP BY LectID);
Но когда я пытаюсь это, это работает:
SELECT
L.LectID,
Fname,
Lname
FROM Lecturers L,
Lecturers_Specialization S
WHERE L.LectID = S.LectID
GROUP BY L.LectID,
Fname,
Lname
HAVING COUNT(S.Expertise) >= ALL (SELECT
COUNT(Expertise)
FROM Lecturers_Specialization
GROUP BY LectID);
Какова причина? Спасибо.
Ответы:
WHERE
предложение вводит условие для отдельных строк ;HAVING
Предложение вводит условие для агрегатов , то есть результатов выбора, когда один результат, такой как число, среднее, минимальное, максимальное или сумма, был получен из нескольких строк. Ваш запрос требует второго типа условия (то есть условия агрегации), следовательно,HAVING
работает правильно.Как правило, используйте
WHERE
доGROUP BY
иHAVING
послеGROUP BY
. Это довольно примитивное правило, но оно полезно в более чем 90% случаев.Пока вы это делаете, вы можете переписать свой запрос, используя ANSI-версию объединения:
Это устранило бы
WHERE
то, что использовалось как условие тета-соединения .источник
HAVING
работает на агрегатах. ПосколькуCOUNT
это агрегатная функция, вы не можете использовать ее вWHERE
предложении.Вот некоторые чтения из MSDN о агрегатных функциях.
источник
Сначала мы должны знать порядок выполнения предложений, т. Е. ОТ> ГДЕ> ГРУППА BY> HAVING> DISTINCT> SELECT> ORDER BY. Поскольку предложение WHERE выполняется перед предложением GROUP BY, записи не могут быть отфильтрованы путем применения WHERE к примененным записям GROUP BY .
Msgstr "HAVING - это то же самое, что и предложение WHERE, но применяется к сгруппированным записям".
сначала предложение WHERE извлекает записи на основе условия, затем предложение GROUP BY группирует их соответствующим образом, а затем предложение HAVING выбирает записи группы на основе имеющего условия.
источник
Предложение WHERE может использоваться с операторами SELECT, INSERT и UPDATE, тогда как HAVING может использоваться только с оператором SELECT.
WHERE фильтрует строки перед агрегацией (GROUP BY), тогда как HAVING фильтрует группы после агрегации.
Агрегатная функция не может использоваться в предложении WHERE, если она не входит в подзапрос, содержащийся в предложении HAVING, тогда как агрегатные функции могут использоваться в предложении HAVING.
Источник
источник
Не видел пример обоих в одном запросе. Так что этот пример может помочь.
Это фильтрует таблицу сначала по идентификатору компании, затем группирует ее (по стране и городу) и дополнительно фильтрует ее по группам городов Мексики. Идентификатор компании не требовался при агрегации, но мы смогли использовать WHERE для фильтрации только тех строк, которые нам нужны, перед использованием GROUP BY.
источник
Вы не можете использовать предложение where с агрегатными функциями, потому что, когда выборка производится на основе условия, она переходит в таблицу «запись за записью», а затем выбирает запись на основе условия, которое мы дали. Так что время мы не можем, где оговорка. В то время как наличие условия работает с набором результатов, который мы наконец получаем после выполнения запроса.
Пример запроса:
Это сохранит resultSet во временной памяти, а затем с предложением выполнит свою работу. Таким образом, мы можем легко использовать агрегатные функции здесь.
источник
1. Мы можем использовать агрегатную функцию с предложением HAVING, а не с предложением WHERE, например, min, max, avg.
2. Предложение WHERE исключает кортеж записи с помощью предложения HAVING исключает всю группу из коллекции группы
В основном HAVING используется, когда у вас есть группы данных, и WHERE используется, когда у вас есть данные в строках.
источник