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?
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:
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
SET SHOWPLAN_ALL ON
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 WHERE
cui è:
1. WHERE
2. GROUP BY
3. HAVING
SELECT * FROM table1 INNER JOIN table2 ON col = col2 WHERE table1.col = @val
Qui ON viene dopo l'adesione e la selezione viene prima, qualche spiegazione?
FROM
primo, quindi ON
e così via.
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.
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
Pensa a cosa devi fare se desideri implementare:
L'ordine è WHERE, GROUP BY e HAVING.
In ordine inferiore
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
Questo è l'ordine SQL di esecuzione di una query,
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 .
- 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.
- 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:-
SELEZIONA
DA
UNISCITI A
WHERE
GROUP
AVENDO
ORDINE DA