Eu tenho as seguintes duas tabelas:
1. Lecturers (LectID, Fname, Lname, degree).
2. Lecturers_Specialization (LectID, Expertise).
Quero encontrar o professor com mais Especialização. Quando tento isso, ele não está funcionando:
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);
Mas quando eu tento isso, funciona:
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);
Qual é a razão? Obrigado.
Respostas:
WHERE
A cláusula introduz uma condição em linhas individuais ;HAVING
A cláusula introduz uma condição nas agregações , ou seja, resultados da seleção em que um único resultado, como contagem, média, min, máximo ou soma, foi produzido a partir de várias linhas. Sua consulta solicita um segundo tipo de condição (ou seja, uma condição em uma agregação), portanto,HAVING
funciona corretamente.Como regra geral, use
WHERE
antesGROUP BY
eHAVING
depoisGROUP BY
. É uma regra bastante primitiva, mas é útil em mais de 90% dos casos.Enquanto você está nisso, você pode reescrever sua consulta usando a versão ANSI da associação:
Isso eliminaria o
WHERE
que foi usado como uma condição de junção teta .fonte
HAVING
opera em agregados. ComoCOUNT
é uma função agregada, você não pode usá-la em umaWHERE
cláusula.Aqui estão algumas leituras do MSDN sobre funções agregadas.
fonte
Primeiro, devemos saber a ordem de execução das Cláusulas, ou seja, DE> ONDE> GRUPO POR> TER> DISTINTO> SELECIONAR> ORDENAR POR. Como a cláusula WHERE é executada antes da cláusula GROUP BY, os registros não podem ser filtrados aplicando WHERE a um registro aplicado GROUP BY .
"HAVING é o mesmo que a cláusula WHERE, mas é aplicada em registros agrupados".
primeiro, a cláusula WHERE busca os registros com base na condição, depois a cláusula GROUP BY os agrupa de acordo e, em seguida, a cláusula HAVING busca os registros do grupo com base na condição tendo.
fonte
A cláusula WHERE pode ser usada com as instruções SELECT, INSERT e UPDATE, enquanto HAVING pode ser usada apenas com a instrução SELECT.
WHERE filtra linhas antes da agregação (GROUP BY), enquanto HAVING filtra grupos após a agregação.
A função agregada não pode ser usada na cláusula WHERE, a menos que esteja em uma subconsulta contida na cláusula HAVING, enquanto as funções agregadas podem ser usadas na cláusula HAVING.
Fonte
fonte
Não viu um exemplo dos dois em uma consulta. Portanto, este exemplo pode ajudar.
Isso filtra a tabela primeiro pelo companyId, depois a agrupa (por país e cidade) e, adicionalmente, filtra-a apenas para agregações de cidades do México. O companyId não era necessário na agregação, mas pudemos usar WHERE para filtrar apenas as linhas que desejávamos antes de usar GROUP BY.
fonte
Você não pode usar a cláusula where com funções agregadas porque, onde busca registros com base na condição, ela entra na tabela registro por registro e, em seguida, busca o registro com base na condição que fornecemos. Então, dessa vez, não podemos cláusula where. Enquanto ter cláusula trabalha no resultSet que finalmente obtemos após executar uma consulta.
Consulta de exemplo:
Isso armazenará o resultSet em uma memória temporária, e a cláusula having fará seu trabalho. Portanto, podemos usar facilmente funções agregadas aqui.
fonte
1. Podemos usar a função agregada com a cláusula HAVING e não pela cláusula WHERE, por exemplo, min, max, avg.
2. A cláusula WHERE elimina a tupla de registro pela tupla A cláusula HAVING elimina todo o grupo da coleção de grupos
HAVING é usado principalmente quando você tem grupos de dados e WHERE é usado quando você tem dados em linhas.
fonte