Per apprendere le basi di SQL Server, è necessario avere una comprensione di come un motore di query di SQL Server esegue una query SQL. T-SQL comporta l'elaborazione di query sia logiche che fisiche. L'elaborazione della query fisica riguarda il modo in cui un motore di database elabora una query. Elaborazione della query logica è un flusso concettuale, un ordine delle clausole sapere come SQL Server valuta queste clausole durante l'esecuzione di una query.
La maggior parte dei linguaggi di programmazione segue il principio dell'elaborazione di un programma riga per riga, ma il server SQL ha un ordine di elaborazione delle query logiche definito per eseguire query.
L'ordine di elaborazione logico è stato suddiviso in due rami diversi in base al fatto che UNION sia incluso o meno.
Esecuzione query logica in SQL Server senza una clausola UNION
1. FROM, JOIN, APPLY e ON: Le condizioni di join vengono valutate e viene applicato il filtro di query ON.
2. DOVE: Questo è un altro filtro di query applicato per recuperare i record che corrispondono al filtro delle condizioni WHERE.
3. Funzioni GROUP BY e Aggregate: Operazioni di raggruppamento e aggregazioni eseguite
4. VISTA: Questo è il terzo filtro applicato a un risultato aggregato ottenuto dal gruppo per filtrare i gruppi
5. SELEZIONARE: Elenco di colonne da restituire in base al risultato della query
6. DISTINCT: Per rimuovere i record duplicati
7. ORDINATO DA: Ordinamento del risultato crescente / decrescente
8. SUPERIORE: Il filtro TOP viene applicato per selezionare il numero X di righe definito
9. PER XML: Per restituire i risultati della query in formato XML
Esecuzione query logica in SQL Server con una clausola UNION
1. FROM, JOIN, APPLY e ON: Le condizioni di join vengono valutate e viene applicato il filtro di query ON.
2. DOVE: Un altro filtro di query applicato per recuperare i record che corrispondono al filtro delle condizioni WHERE
3. Funzioni GROUP BY e Aggregate: Operazioni di raggruppamento e aggregazioni eseguite
4. VISTA: Il terzo filtro, applicato a un risultato aggregato ottenuto dal gruppo per filtrare i gruppi
5. SUPERIORE: Il filtro TOP viene applicato per selezionare il numero X di righe definito.
6. SELEZIONA e UNIONE: Per combinare due set di risultati di query e restituirli utilizzando l'istruzione SELECT
7. DISTINCT: Per rimuovere i record duplicati
8. ORDINATO DA: Ordinamento del risultato crescente / decrescente
9. PER XML: Per restituire i risultati della query in formato XML
Esempi di dimostrazione dell'ordine di elaborazione delle query logiche
IF OBJECT_ID ('Employee') NON è un dipendente NULL DROP TABLE; CREATE TABLE Employee (ID INT NOT NULL IDENTITY (1,1) PRIMARY KEY, FirstName VARCHAR (50) NOT NULL, MiddleName VARCHAR (50) NOT NULL, LastName VARCHAR (50) NOT NULL, ContactNo VARCHAR (10) NOT NULL, Stipendio INT NULL); Inserisci in valori Employee ('Vishwanath', 'D', 'D', '9999955555', 12000); Inserisci in valori Employee ('Niraj', 'Y', 'Y', '9911223344', 14000); Inserisci nei valori Impiegato ('Chetan', 'V', 'G', '989898989', 700000); Inserisci in valori Employee ('Atul', 'K', 'K', '9876780987', 40000); Inserisci nei valori Impiegato ("Vishal", "M", "P", "7777711111", 12000);
1.WHERE Clausola valutata prima di SELECT
Spesso gli sviluppatori che non comprendono l'elaborazione logica delle query fanno questo errore: tentano di utilizzare un alias di colonna definito in una clausola SELECT in una clausola WHERE. Ciò non è consentito perché una clausola SELECT viene valutata dopo una clausola WHERE, quindi l'alias di colonna non è noto alla clausola WHERE. Solleva un errore di "Nome colonna non valido".
Per risolvere questo problema, è possibile utilizzare il concetto di tabella derivata o (Salary * 12) nella clausola where (che in realtà non è una buona pratica considerando l'ottimizzazione delle prestazioni).
SELEZIONA Id, (Salario * 12) come Yearlyalary FROM Employee WHERE YearlySalary> 10000;
Msg 207, livello 16, stato 1, riga 3
Nome colonna non valido 'YearlySalary'.
2.WHERE Clausola valutata prima di HAVING
La differenza più importante per distinguere tra la clausola WHERE e HAVING è la clausola WHERE viene valutata prima della clausola HAVING. La clausola WHERE viene applicata alle righe e la clausola HAVING viene applicata ai gruppi creati utilizzando la clausola GROUP BY.
Proviamo a trovare i reparti della tabella dei dipendenti con una Somma dello stipendio superiore a 300.000. La seguente query ci fornisce un risultato, ma non soddisfa il requisito della query. Abbiamo aggiunto un filtro nella clausola WHERE che sta filtrando i dipendenti con uno stipendio superiore a 300.000, non ai reparti.
Si tratta di tentativi errati di filtrare i dipartimenti la cui somma salariale è superiore a 300.000.
SELECT DeptId, SUM (Salary) come SumOfSalary FROM Employee WHERE Stipendio> 300000 GROUP BY DeptId;
SOGGETTO DISPONIBILE 2 700000
Right Query con filtraggio con la clausola HAVING.
SELECT DeptId, SUM (Salary) come SumOfSalary FROM Employee GROUP BY DeptId HAVING SUM (Salario)> 300000;
DeptId SumOfSalary 2 752000
3.Riferimento di alias di colonne in una clausola SELECT
Gli alias di colonne non sono visibili a un'altra espressione nella stessa clausola SELECT. Segnala un errore "Nome colonna non valido YearlySalary" perché stiamo cercando di riferire l'alias creato nella stessa lista di selezione. Il motivo per cui T-SQL valuta tutte le espressioni che appaiono nella stessa fase di elaborazione della query logica in modo tutto-in-un-una volta.
SELEZIONA (Salario * 12) come Yearlyalari, YearlySalary / 100 FROM Employee;
Msg 207, livello 16, stato 1, riga 13
Nome colonna non valido 'YearlySalary'.
4.Riferimento dell'alias della colonna nella clausola ORDER BY
Quando creiamo un alias di colonna in una clausola SELECT e proviamo a ordinare il risultato in base al nome dell'alias della colonna creata, è consentito perché, come per l'elaborazione della query logica, una clausola SELECT viene valutata prima di una clausola ORDER BY.
SELEZIONA (Salario * 12) come Yearlyalary FROM Employee ORDER BY YearlySalary DESC;
YearlySalary 8400000 480000 168000 144000 144000
Maggiori informazioni sulla programmazione di database e SQL da Tech-Recipes.