Qual é a sequência de execução da cláusula Group By, Having e Where no SQL Server?

91

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?

Jonathan Leffler
fonte

Respostas:

184

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

KM.
fonte
existe alguma referência a isso ??
Geshan
3
@Geshan, olhe paraSET SHOWPLAN_ALL ON
KM.
Oi, eu tenho uma pergunta. a instrução case quando a condição substituirá a condição where?
MÁX.
1
E quanto à cláusula select. Está no último?
MAX
Resposta curta e concisa! Obrigado!
Abhishek Ghosh
14

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 WHEREque é:

1.  WHERE
2.  GROUP BY
3.  HAVING

Obtenha mais informações sobre isso com a Microsoft

Md. Suman Kabir
fonte
SELECT * FROM table1 INNER JOIN table2 ON col = col2 WHERE table1.col = @valAqui o ON vem depois do join, e o select vem primeiro, alguma explicação?
noob
Esta é apenas a sintaxe para escrever uma instrução SQL. A sequência que mencionei é a ordem real avaliada por um mecanismo SQL. Isso significa que se a sintaxe de sua consulta estiver correta, o mecanismo avalia FROMprimeiro, depois ONe assim por diante.
Md. Suman Kabir
1
@ShailajaGuptaKapoor Você pode ler este blogs.x2line.com/al/archive/2007/06/30/3187.aspx
Md. Suman Kabir
8

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.

Matthias Meid
fonte
2
Vale a pena acrescentar que o otimizador pode mover cláusulas de HAVING para WHERE se elas não dependerem de um agregado. Isso não afetará os resultados mostrados.
Damien_The_Unbeliever
2

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

AdaTheDev
fonte
Explicação muito boa que você vinculou a :-).
sleske
1
Link está morto. Se você puder consertar isso, seria ótimo :)
Akash KC
2

No Oracle 12c, você pode executar o código nas duas sequências abaixo:

Where
Group By
Having

Ou

Where 
Having
Group by
Jim Chen
fonte
1

Pense no que você precisa fazer se deseja implementar:

  • ONDE : É necessário executar as operações JOIN.
  • GROUP BY : Você especifica Group by para "agrupar" os resultados na junção, então deve ser feito após a operação JOIN, após o uso de WHERE.
  • HAVING : HAVING serve para filtrar como dizem as expressões GROUP BY. Em seguida, ele é executado após o GROUP BY.

A ordem é ONDE, GROUP BY e HAVING.

FerranB
fonte
O que você explicou aqui é brilhante. Tirou minha dúvida sobre TER. Então, para resumir - GROUP BY & HAVING funciona da mesma forma que SELECT & WHERE. A cláusula HAVING sempre é executada nos dados da tabela COMPLETE levando a condição GROUP BY na imagem e nos dados NOT ON GROUPED.
Naveen Kumar
1

Na ordem abaixo

  1. DE & PARTICIPAR
  2. ONDE
  3. GRUPO POR
  4. TENDO
  5. SELECIONE
  6. ORDENAR POR
  7. LIMITE
GimmicksWorld
fonte
0

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

manoj remala
fonte
0

Esta é a ordem SQL de execução de uma consulta,

insira a descrição da imagem aqui

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 .

  1. 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.
  1. 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:-

Kushan Gunasekera
fonte
-2

SELECIONAR
DE
JOINs
ONDE
GROUP BY
TENDO
ORDER BY

OcTella
fonte
13
Isso está realmente errado. De acordo com os MS Certified Trainers e o material oficial de treinamento, Order By é após a Seleção. Meio lógico quando você pensa sobre isso. Seria estúpido pedir uma mesa virtual que você ainda não tenha buscado e colado. :)
simme