SQL - наличие VS, где

У меня есть следующие две таблицы:

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); 

Какова причина? Благодарю.

Ответ 1

WHERE условие вводит условие для отдельных строк; Предложение HAVING вводит условие об агрегировании, то есть результаты выбора, где один результат, такой как подсчет, средний, мин, макс или сумма, был получен из нескольких строк. Ваш запрос вызывает второй тип условия (т.е. Условие для агрегации), поэтому HAVING работает правильно.

Как правило, используйте WHERE до GROUP BY и HAVING после GROUP BY. Это довольно примитивное правило, но оно полезно в более чем 90% случаев.

Пока вы на нем, вы можете повторно написать свой запрос, используя ANSI версию соединения:

SELECT  L.LectID, Fname, Lname
FROM Lecturers L
JOIN Lecturers_Specialization S ON 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, который использовался как условие соединения theta.

Ответ 3

Сначала мы должны знать порядок выполнения пунктов i.e FROM > WHERE > GROUP BY > HAVING > DISTINCT > SELECT > ORDER BY. Поскольку предложение WHERE выполняется до GROUP BY. Задание не может быть отфильтровано, применяя WHERE к GROUP BY записи.

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

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

Ответ 4

  1. Предложение WHERE может использоваться с операторами SELECT, INSERT и UPDATE, тогда как HAVING может использоваться только с оператором SELECT.

  2. WHERE фильтрует строки перед агрегацией (GROUP BY), тогда как HAVING фильтрует группы после агрегации.

  3. Агрегатная функция не может использоваться в предложении WHERE, если она не входит в подзапрос, содержащийся в предложении HAVING, тогда как агрегатные функции могут использоваться в предложении HAVING.

Источник

Ответ 5

Вы не можете использовать предложение where с агрегатными функциями, потому что, когда вы извлекаете записи по условию, оно переходит в запись таблицы по записи, а затем извлекает запись на основе условия, которое мы даем. Так что в это время мы не можем найти предложение. Хотя предложение clue работает на resultSet, который мы наконец получаем после запуска запроса.

Пример запроса:

select empName, sum(Bonus) 
from employees 
order by empName 
having sum(Bonus) > 5000;

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

Ответ 6

Не видел пример как в одном запросе. Поэтому этот пример может помочь.

  /**
INTERNATIONAL_ORDERS - table of orders by company by location by day
companyId, country, city, total, date
**/

SELECT country, city, sum(total) totalCityOrders 
FROM INTERNATIONAL_ORDERS with (nolock)
WHERE companyId = 884501253109
GROUP BY country, city
HAVING country = 'MX'
ORDER BY sum(total) DESC

Это сначала фильтрует таблицу companyId, затем группирует ее (по стране и городу) и дополнительно фильтрует ее только до городских агрегатов Мексики. Компания companyId не нужна в агрегации, но мы могли использовать WHERE для фильтрации только тех строк, которые мы хотели, прежде чем использовать GROUP BY.

Ответ 7

1. Мы можем использовать агрегированную функцию с предложением HAVING не по предложению WHERE, например. мин, макс, ср.

2. Предложение WHERE исключает запись кортежа кортежем Предложение HAVING исключает целую группу из коллекции группы

В основном HAVING используется, когда у вас есть группы данных, а WHERE используется, когда у вас есть данные в строках.