Estou apenas confuso com a sequência de execução de uma consulta SQL quando usamos GROUP BY e HAVING com uma cláusula WHERE. Qual é executado primeiro? Qual é a sequência?
Estou apenas confuso com a sequência de execução de uma consulta SQL quando usamos GROUP BY e HAVING com uma cláusula WHERE. Qual é executado primeiro? Qual é a sequência?
Respostas:
em ordem:
FROM & JOIN s determinam e filtram as linhas
WHERE mais filtros nas linhas
GROUP BY combina essas linhas em grupos
HAVING filtros grupos
ORDER BY organiza as linhas / grupos restantes
LIMIT filtros nas linhas / grupos restantes
SET SHOWPLAN_ALL ON
Aqui está a sequência completa para o servidor sql:
1. FROM
2. ON
3. JOIN
4. WHERE
5. GROUP BY
6. WITH CUBE or WITH ROLLUP
7. HAVING
8. SELECT
9. DISTINCT
10. ORDER BY
11. TOP
Portanto, a partir da lista acima, você pode entender facilmente a sequência de execução, GROUP BY, HAVING and WHERE
que é:
1. WHERE
2. GROUP BY
3. HAVING
SELECT * FROM table1 INNER JOIN table2 ON col = col2 WHERE table1.col = @val
Aqui o ON vem depois do join, e o select vem primeiro, alguma explicação?
FROM
primeiro, depois ON
e assim por diante.
WHERE é primeiro, então você GROUP o resultado da consulta e, por último, mas não menos importante, a cláusula HAVING é usada para filtrar o resultado agrupado. Essa é a ordem "lógica", não sei como isso é implementado tecnicamente no motor.
Acho que está implementado no motor como o Matthias disse: ONDE, GROUP BY, HAVING
Estava tentando encontrar uma referência online que liste toda a sequência (ou seja, "SELECT" vem na parte inferior), mas não consigo encontrar. Foi detalhado em um livro "Inside Microsoft SQL Server 2005" que li não faz muito tempo, da Solid Quality Learning
Editar: encontrou um link: http://blogs.x2line.com/al/archive/2007/06/30/3187.aspx
Pense no que você precisa fazer se deseja implementar:
A ordem é ONDE, GROUP BY e HAVING.
Na ordem abaixo
Ter Cláusula pode vir antes / antes da cláusula group by.
Exemplo: select * FROM test_std; ROLL_NO SNAME DOB TEACH
1 John 27-AUG-18 Wills
2 Knit 27-AUG-18 Prestion
3 Perl 27-AUG-18 Wills
4 Ohrm 27-AUG-18 Woods
5 Smith 27-AUG-18 Charmy
6 Jony 27-AUG-18 Wills
Warner 20-NOV-18 Wills
Marsh 12-NOV-18 Langer
FINCH 18-OCT-18 Langer
9 linhas selecionadas.
selecione ensinar, contar ( ) contar de test_std tendo contagem ( )> 1 grupo por TEACH;
TEACH COUNT
Langer 2 Wills 4
Esta é a ordem SQL de execução de uma consulta,
Você pode verificar a ordem de execução com exemplos deste artigo .
Para sua pergunta, as linhas abaixo podem ser úteis e obtidas diretamente deste artigo .
- GROUP BY -> As linhas restantes após as restrições WHERE serem aplicadas são agrupadas com base em valores comuns na coluna especificada na cláusula GROUP BY. Como resultado do agrupamento, haverá apenas tantas linhas quantos forem os valores exclusivos dessa coluna. Implicitamente, isso significa que você só precisará usar isso quando tiver funções de agregação em sua consulta.
- HAVING -> Se a consulta tiver uma cláusula GROUP BY, então as restrições na cláusula HAVING são aplicadas às linhas agrupadas, descarte as linhas agrupadas que não satisfaçam a restrição. Como a cláusula WHERE, os aliases também não são acessíveis a partir desta etapa na maioria dos bancos de dados.
Referências:-
SELECIONAR
DE
JOINs
ONDE
GROUP BY
TENDO
ORDER BY