Applicazione di dichiarazioni condizionali in ON / DOVE
Qui ho spiegato le fasi di elaborazione della query logica.
Riferimento: Inside Microsoft® SQL Server ™ 2005 T-SQL Querying
Editore: Microsoft Press
Pub Data: 07 marzo 2006
Stampa ISBN-10: 0-7356-2313-9
Stampa ISBN-13: 978-0-7356-2313-2
Pagine: 640
All'interno di query T-SQL di Microsoft® SQL Server ™ 2005
(8) SELECT (9) DISTINCT (11) TOP <top_specification> <select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) WITH {CUBE | ROLLUP}
(7) HAVING <having_condition>
(10) ORDER BY <order_by_list>
Il primo aspetto evidente di SQL diverso dagli altri linguaggi di programmazione è l'ordine in cui il codice viene elaborato. Nella maggior parte dei linguaggi di programmazione, il codice viene elaborato nell'ordine in cui è scritto. In SQL, la prima clausola che viene elaborata è la clausola FROM, mentre la clausola SELECT, che appare per prima, viene elaborata quasi per ultima.
Ogni passaggio genera una tabella virtuale che viene utilizzata come input per il passaggio successivo. Queste tabelle virtuali non sono disponibili per il chiamante (applicazione client o query esterna). Solo la tabella generata dal passaggio finale viene restituita al chiamante. Se una determinata clausola non viene specificata in una query, il passaggio corrispondente viene semplicemente ignorato.
Breve descrizione delle fasi di elaborazione delle query logiche
Non preoccuparti troppo se la descrizione dei passaggi non sembra avere molto senso per ora. Questi sono forniti come riferimento. Le sezioni che seguono l'esempio dello scenario copriranno i passaggi in modo molto più dettagliato.
FROM: un prodotto cartesiano (cross join) viene eseguito tra le prime due tabelle nella clausola FROM e, di conseguenza, viene generata la tabella virtuale VT1.
ON: il filtro ON viene applicato a VT1. Solo le righe per le quali <join_condition>
è TRUE vengono inserite in VT2.
OUTER (join): se viene specificato un OUTER JOIN (al contrario di un CROSS JOIN o un INNER JOIN), le righe della tabella conservata o le tabelle per le quali non è stata trovata una corrispondenza vengono aggiunte alle righe da VT2 come righe esterne, generando VT3. Se vengono visualizzate più di due tabelle nella clausola FROM, i passaggi da 1 a 3 vengono applicati ripetutamente tra il risultato dell'ultimo join e la tabella successiva nella clausola FROM fino a quando non vengono elaborate tutte le tabelle.
DOVE: il filtro DOVE viene applicato a VT3. Solo le righe per le quali <where_condition>
è TRUE vengono inserite in VT4.
GROUP BY: le righe da VT4 sono organizzate in gruppi in base all'elenco di colonne specificato nella clausola GROUP BY. Viene generato VT5.
CUBE | ROLLUP: i supergruppi (gruppi di gruppi) vengono aggiunti alle righe da VT5, generando VT6.
HAVING: il filtro HAVING viene applicato a VT6. Solo i gruppi per i quali <having_condition>
è TRUE vengono inseriti in VT7.
SELECT: l'elenco SELECT viene elaborato, generando VT8.
DISTINCT: le righe duplicate vengono rimosse da VT8. Viene generato VT9.
ORDER BY: le righe da VT9 sono ordinate in base all'elenco di colonne specificato nella clausola ORDER BY. Viene generato un cursore (VC10).
INIZIO: il numero o la percentuale di righe specificati è selezionato dall'inizio di VC10. La tabella VT11 viene generata e restituita al chiamante.
Pertanto, (INNER JOIN) ON filtrerà i dati (il conteggio dei dati di VT verrà ridotto qui stesso) prima di applicare la clausola WHERE. Le condizioni di join successive verranno eseguite con dati filtrati che migliorano le prestazioni. Successivamente solo la condizione WHERE applicherà le condizioni del filtro.
(L'applicazione delle istruzioni condizionali in ON / DOVE non farà molta differenza in alcuni casi. Ciò dipende dal numero di tabelle che sono state unite e dal numero di righe disponibili in ciascuna tabella dei join)