Logisk Query Processing i SQL Server

För att lära dig grunderna i SQL Server måste du ha en förståelse för hur en SQL-sökmotor kör en SQL-fråga. T-SQL innefattar både logisk och fysisk frågabehandling. Fysisk sökfråga handlar om hur en databasmotor behandlar en fråga. Logisk frågabehandling är ett begreppsmässigt flöde, en ordning med klausuler som vet hur SQL Server utvärderar dessa klausuler när du utför en fråga.

De flesta programmeringsspråk följer grunden för att bearbeta en programlinje för rad, men SQL-servern har en definierad logisk förfrågningsbehandlingsorder för att utföra frågor.

Den logiska behandlingsordern har delats upp i två olika grenar baserat på huruvida UNION ingår eller ej.

Logisk sökfråga i SQL Server utan en UNION-klausul

1. FRÅN, GÅ MED, ANVÄND OCH PÅ: Sammanställda villkor utvärderas, och sedan används sökfilteret ON.

2. VAR: Detta är ett annat sökfilter som används för att hämta poster som matchar WHERE-förhållandena filter.

3. GROUP BY och Aggregate Functions: Grupperingar och Aggregations-operationer utförda

4. HAR: Det här är det tredje filtret som tillämpas på ett samlat resultat som erhållits från gruppen genom att filtrera bort grupperna

5. VÄLJ: Lista över kolumner som ska returneras av sökresultatet

6. DISTINKT: Att ta bort dubbla poster

7. SORTERA EFTER: Sortera resultatet Stigande / Fallande

8. TOPP: TOP-filter används för att välja definierat X antal rader

9. FÖR XML: Att returnera sökresultat som XML-format

Logisk sökfråga i SQL Server med en UNION-klausul

1. FRÅN, GÅ MED, ANVÄND OCH PÅ: Sammanställda villkor utvärderas, och sedan används sökfilteret ON.

2. VAR: Ett annat sökfilter som används för att hämta poster som matchar WHERE-förhållandena filtrerar

3. GROUP BY och Aggregate Functions: Grupperingar och Aggregations-operationer utförda

4. HAR: Det tredje filtret, applicerat på ett aggregerat resultat som erhållits från gruppen genom att filtrera bort grupperna

5. TOPP: TOP-filtret används för att välja definierat X antal rader.

6. SELECT och UNION: För att kombinera två frågesultatuppsättningar och returnera den med SELECT-satsen

7. DISTINKT: Att ta bort dubbla poster

8. SORTERA EFTER: Sortera resultatet Stigande / Fallande

9. FÖR XML: Att returnera sökresultat som XML-format

Exempel på att demonstrera logisk frågabehandlingsorder

Om OBJECT_ID ("Employee") ÄR INTE NULL DROP TABLE Employee; CREATE TABLE Anställd (Id INT INTE NULL IDENTITET (1,1) PRIMÄR KEY, Förnamn VARCHAR (50) NOT NULL, MiddleName VARCHAR (50) INTE NULL, LastName VARCHAR (50) INTE NULL, KontaktNo VARCHAR (10) INTE NULL, Lön INT NULL); Infoga i Medarbetarvärden ('Vishwanath', 'D', 'D', '9999955555', 12000); Infoga i Medarbetarvärden ('Niraj', 'Y', 'Y', '9911223344', 14000); Infoga i Medarbetarvärden ('Chetan', 'V', 'G', '989898989', 700000); Infoga i Medarbetarvärden ('Atul', 'K', 'K', '9876780987', 40000); Infoga i Medarbetarvärden ('Vishal', 'M', 'P', '7777711111', 12000); 

1.VAR Klausul utvärderas före SELECT

Ofta utvecklare som inte förstår logisk sökfråga gör detta misstag: De försöker använda ett kolumnalias som definieras i en SELECT-klausul i en WHERE-klausul. Detta är inte tillåtet eftersom en SELECT-klausul utvärderas efter en WHERE-klausul, så kolumnaliaset är inte känt för WHERE-klausulen. Det ger upphov till ett fel på "Ogiltigt kolumnnamn".

För att lösa detta problem kan du använda det härledda tabellen konceptet eller (Lön * 12) i var-klausulen (vilket egentligen inte är en bra praxis med tanke på prestationsoptimering).

VÄLJ ID, (Lön * 12) som Årlig Salong FRÅN MEDARBETARE VARAR Årsalar> 10000; 

Msg 207, Level 16, State 1, Line 3
Ogiltigt kolumnnamn 'ÅrligSalary'.

2.VAR Klausul utvärderas innan den har fått

Den viktigaste skillnaden att skilja mellan WHERE och HAVING-klausulen är WHERE-klausulen utvärderas före HAVING-klausulen. WHERE-klausulen tillämpas på rader och HAVING-klausulen tillämpas på grupper skapade med GROUP BY-klausulen.

Låt oss försöka hitta avdelningar från anställdabellen som har en Summa av lön som är större än 300000. Följande fråga ger oss ett resultat, men det uppfyller inte frågan. Vi har lagt till ett filter i WHERE-klausulen som filtrerar anställda med en lön större än 300000, inte avdelningar.

Det här är felaktiga försök att filtrera bort avdelningar vars lönesumma är större än 300000.

SELECT DeptId, SUM (Lön) som SumOfSalary FROM Employee WHERE Lön> 300000 GROUP BY DeptId; 
DeptId SumOfSalary 2 700000 

Rätt fråga med filtrering ut med HAVING-klausul.

VÄLJ DeptId, SUM (Lön) som SumOfSalary FRÅN MEDARBETARE GRUPP PER DIVISION MED SUM (Lön)> 300000; 
DeptId SumOfSalary 2 752000 

3.Referring Column Alias ​​i en SELECT-klausul

Kolumnaliaserna är inte synliga för ett annat uttryck i samma SELECT-klausul. Det ger upphov till ett fel "Ogiltigt kolumnnamn YearlySalary" eftersom vi försöker hänvisa aliaset skapat i samma väljarlista. Anledningen till att T-SQL utvärderar alla uttryck som förekommer i samma logiska frågeprocessfas på ett helt och hållet sätt.

SELECT (Lön * 12) som ÅrligSalary, ÅrligSalary / 100 FRÅN Medarbetare; 

Msg 207, Level 16, State 1, Line 13
Ogiltigt kolumnnamn 'ÅrligSalary'.

4.Referring Column Alias ​​i BESTÄLLNING AV Klausul

När vi skapar ett kolumnalias i en SELECT-klausul och försöker sortera resultatet baserat på det skapade kolumnaliasnamnet, är det tillåtet eftersom en SELECT-klausul utvärderas före en ORDER BY-klausul enligt en logisk förfrågningsbehandling.

VÄLJ (Lön * 12) som ÅrligSalarie FRÅN MEDARBETARE ORDER BY Årsredovisning DESC; 
Årsalder 8400000 480000 168000 144000 144000 

Läs mer om databas och SQL-programmering från Tech-Recipes.