Qual è la sequenza di esecuzione delle clausole Group By, Have e Where in SQL Server?


91

Sono solo confuso con la sequenza di esecuzione di una query SQL quando usiamo GROUP BY e HAVING con una clausola WHERE. Quale viene eseguito per primo? Qual è la sequenza?

Risposte:


184

In ordine:

FROM & JOIN s determina e filtra le righe
DOVE più filtri sulle righe
GROUP BY combina queste righe in gruppi
HAVING filtri gruppi
ORDER BY dispone le righe / gruppi rimanenti
LIMIT filtri sulle righe / gruppi rimanenti


c'è qualche riferimento a questo ??
Geshan

3
@Geshan, guarda inSET SHOWPLAN_ALL ON
KM.

Ciao, ho una domanda. l'istruzione case quando la condizione sovrascriverà la condizione where?
MAX

1
E la clausola di selezione. È negli ultimi?
MAX

Risposta breve e concisa! Grazie!
Abhishek Ghosh

14

Ecco la sequenza completa per sql server:

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

Quindi dall'elenco sopra, puoi facilmente capire la sequenza di esecuzione di GROUP BY, HAVING and WHEREcui è:

1.  WHERE
2.  GROUP BY
3.  HAVING

Ottieni maggiori informazioni su di esso da Microsoft


SELECT * FROM table1 INNER JOIN table2 ON col = col2 WHERE table1.col = @valQui ON viene dopo l'adesione e la selezione viene prima, qualche spiegazione?
noob

Questa è solo la sintassi per scrivere un'istruzione SQL. La sequenza che ho menzionato è l'ordine reale valutato da un motore SQL. Ciò significa che se la sintassi della query è corretta, il motore valuta per FROMprimo, quindi ONe così via.
Md. Suman Kabir,

1
@ShailajaGuptaKapoor Puoi leggere questo blogs.x2line.com/al/archive/2007/06/30/3187.aspx
Md. Suman Kabir

8

WHERE è il primo, quindi RAGGRUPPATE il risultato della query e, ultimo ma non meno importante, la clausola HAVING viene utilizzata per filtrare il risultato raggruppato. Questo è l'ordine "logico", non so come questo sia tecnicamente implementato nel motore.


2
Vale la pena aggiungere che l'ottimizzatore può spostare le clausole da HAVING a WHERE se non dipendono da un aggregato. Ciò non influirà sui risultati mostrati.
Damien_The_Unbeliever

2

Penso che sia implementato nel motore come ha detto Matthias: WHERE, GROUP BY, HAVING

Stavo cercando di trovare un riferimento online che elenchi l'intera sequenza (cioè "SELEZIONA" viene visualizzato in basso), ma non riesco a trovarlo. È stato dettagliato in un libro "Inside Microsoft SQL Server 2005" che ho letto non molto tempo fa, di Solid Quality Learning

Modifica: trovato un collegamento: http://blogs.x2line.com/al/archive/2007/06/30/3187.aspx


Molto bella la spiegazione a cui ti sei collegato :-).
sleske

1
Link è morto. Se riesci a risolverlo, sarebbe fantastico :)
Akash KC

2

In Oracle 12c, puoi eseguire il codice in entrambe le sequenze seguenti:

Where
Group By
Having

O

Where 
Having
Group by

1

Pensa a cosa devi fare se desideri implementare:

  • DOVE : Necessita di eseguire le operazioni JOIN.
  • GROUP BY : Specificate Group by per "raggruppare" i risultati sul join, quindi deve farlo dopo l'operazione JOIN, dopo l'utilizzo WHERE.
  • HAVING : HAVING serve per filtrare come dicono le espressioni GROUP BY. Quindi, viene eseguito dopo GROUP BY.

L'ordine è WHERE, GROUP BY e HAVING.


Quello che hai spiegato qui è geniale. Ha chiarito il mio dubbio su HAVING. Quindi, per riassumere - GROUP BY & HAVING funziona come SELECT & WHERE. La clausola HAVING viene eseguita sempre sui dati della tabella COMPLETE prendendo la condizione GROUP BY nell'immagine e NON SU dati GROUPED.
Naveen Kumar

1

In ordine inferiore

  1. DA & UNISCITI
  2. DOVE
  3. RAGGRUPPA PER
  4. AVERE
  5. SELEZIONARE
  6. ORDINATO DA
  7. LIMITE

0

La clausola che ha può venire prima / prima della clausola group by.

Esempio: selezionare * 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 righe selezionate.

selezionare teach, count ( ) count da test_std avendo count ( )> 1 gruppo per TEACH;

INSEGNARE IL CONTEGGIO


Langer 2 Testamenti 4


0

Questo è l'ordine SQL di esecuzione di una query,

inserisci qui la descrizione dell'immagine

Puoi controllare l'ordine di esecuzione con esempi tratti da questo articolo .

Per te la domanda qui sotto potrebbe essere utile e ottenuta direttamente da questo articolo .

  1. GROUP BY -> Le righe rimanenti dopo l'applicazione dei vincoli WHERE vengono quindi raggruppate in base ai valori comuni nella colonna specificata nella clausola GROUP BY. Come risultato del raggruppamento, ci saranno solo tante righe quanti sono i valori univoci in quella colonna. Implicitamente, questo significa che dovresti aver bisogno di usarlo solo quando hai funzioni aggregate nella tua query.
  1. HAVING -> Se la query ha una clausola GROUP BY, i vincoli nella clausola HAVING vengono quindi applicati alle righe raggruppate, scartare le righe raggruppate che non soddisfano il vincolo. Come la clausola WHERE, anche gli alias non sono accessibili da questo passaggio nella maggior parte dei database.

Riferimenti:-


-2

SELEZIONA
DA
UNISCITI A
WHERE
GROUP
AVENDO
ORDINE DA


13
Questo è effettivamente sbagliato. Secondo i formatori certificati MS e il materiale di formazione ufficiale, Order By è dopo Select. Un po 'logico quando ci pensi. Sarebbe stupido ordinare un tavolo virtuale che non hai ancora preso e incollato. :)
simme
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.