Traitement des requêtes logiques dans SQL Server

Pour apprendre les bases de SQL Server, vous devez comprendre comment un moteur de requête SQL Server exécute une requête SQL. T-SQL implique à la fois un traitement de requête logique et physique. Le traitement de requête physique concerne la manière dont un moteur de base de données traite une requête. Traitement de requête logique est un flux conceptuel, un ordre des clauses sachant comment SQL Server évalue ces clauses lors de l'exécution d'une requête.

La plupart des langages de programmation suivent les principes fondamentaux du traitement ligne par ligne d'un programme, mais SQL Server dispose d'un ordre de traitement de requête logique défini pour exécuter des requêtes.

L'ordre de traitement logique a été divisé en deux branches différentes selon que UNION est inclus ou non.

Exécution de la requête logique dans SQL Server sans une clause UNION

1. FROM, JOIN, APPLY et ON: Les conditions de jointure sont évaluées, puis le filtre de requête activé est appliqué.

2. Remarque: Ceci est un autre filtre de requête appliqué pour extraire les enregistrements qui correspondent au filtre de conditions WHERE.

3. GROUP BY et fonctions d'agrégation: Opérations de regroupement et d'agrégation effectuées

4. AYANT: Ceci est le troisième filtre appliqué à un résultat agrégé obtenu à partir du groupe par pour filtrer les groupes

5. SÉLECTIONNER: Liste des colonnes à renvoyer par résultat de la requête

6. DISTINCT: Supprimer les enregistrements en double

7. COMMANDÉ PAR: Tri du résultat Ascendant / Descendant

8. HAUT: Le filtre TOP est appliqué pour sélectionner un nombre X de lignes défini

9. POUR XML: Pour renvoyer les résultats de la requête au format XML

Exécution de requête logique dans SQL Server avec une clause UNION

1. FROM, JOIN, APPLY et ON: Les conditions de jointure sont évaluées, puis le filtre de requête activé est appliqué.

2. : Un autre filtre de requête appliqué pour extraire les enregistrements correspondant au filtre de conditions WHERE

3. GROUP BY et fonctions d'agrégation: Opérations de regroupement et d'agrégation effectuées

4. AYANT: Le troisième filtre, appliqué à un résultat global obtenu à partir du groupe par pour filtrer les groupes

5. HAUT: Le filtre TOP est appliqué pour sélectionner le nombre de lignes défini.

6. SELECT et UNION: Pour combiner deux résultats de requête et les renvoyer à l'aide de l'instruction SELECT

7. DISTINCT: Supprimer les enregistrements en double

8. COMMANDÉ PAR: Tri du résultat Ascendant / Descendant

9. POUR XML: Pour renvoyer les résultats de la requête au format XML

Exemples de démonstration d'un ordre de traitement de requête logique

SI OBJECT_ID ('Employee') N'EST PAS NULL DROP TABLE Employee; CREATE TABLE Employé (Id INT NON NULL IDENTITÉ (1,1) PRIMARY KEY, Prénom VARCHAR (50) NON NULL, MiddleName VARCHAR (50) NON NULL, Nom Last VARCHAR (50) NON NULL, ContactNo VARCHAR (10) NON NULL, Salaire INT NULL); Insérer dans les valeurs de l'employé ('Vishwanath', 'D', 'D', '9999955555', 12000); Insérer dans les valeurs de l'employé ('Niraj', 'Y', 'Y', '9911223344', 14000); Insérer dans les valeurs de l'employé ('Chetan', 'V', 'G', '989898989', 700000); Insérer dans les valeurs de l'employé ('Atul', 'K', 'K', '9876780987', 40000); Insérer dans les valeurs de l'employé ('Vishal', 'M', 'P', '7777711111', 12000); 

1.WHERE Clause Evaluated avant SELECT

Les développeurs qui ne comprennent pas le traitement des requêtes logiques commettent souvent cette erreur: ils essaient d'utiliser un alias de colonne défini dans une clause SELECT dans une clause WHERE. Cela n'est pas autorisé car une clause SELECT est évaluée après une clause WHERE. Par conséquent, l'alias de colonne n'est pas connu de la clause WHERE. Il génère une erreur de "Nom de colonne non valide".

Pour résoudre ce problème, vous pouvez utiliser le concept de table dérivé ou (Salary * 12) dans la clause where (ce qui n’est en fait pas une bonne pratique compte tenu de l’optimisation des performances).

SELECT Id, (Salary * 12) as YearlySalary DE l’employé WHERE YearlySalary> 10000; 

Msg 207, Niveau 16, Etat 1, Ligne 3
Nom de colonne invalide 'YearlySalary'.

2.WHERE Clause Evaluated avant d'avoir

La différence la plus importante à distinguer entre les clauses WHERE et HAVING est que la clause WHERE est évaluée avant la clause HAVING. La clause WHERE est appliquée aux lignes et la clause HAVING est appliquée aux groupes créés à l'aide de la clause GROUP BY.

Essayons de trouver dans la table des employés des départements dont la somme du salaire est supérieure à 300 000 $. La requête suivante nous donne un résultat, mais elle ne remplit pas l'exigence de la requête. Nous avons ajouté un filtre dans la clause WHERE, qui filtre les employés dont le salaire est supérieur à 300 000 euros, et non les départements.

Ce sont des tentatives erronées de filtrer les départements dont le salaire est supérieur à 300 000 $.

SELECT DeptId, SUM (Salary) en tant que SumOfSalary FROM Employee WHERE Salaire> 300000 GROUP BY DeptId; 
DeptId SumOfSalary 2 700000 

Requête de droite avec filtrage avec la clause HAVING.

SELECT DeptId, SUM (Salary) en tant que SumOfSalary FROM Employee GROUP BY DeptId HAVING SUM (Salary)> 300000; 
DeptId SumOfSalary 2 752000 

3.Référencement d'un alias de colonne dans une clause SELECT

Les alias de colonne ne sont pas visibles pour une autre expression dans la même clause SELECT. Une erreur «Nom de colonne invalide YearlySalary» est générée car nous essayons de faire référence à l'alias créé dans la même liste de sélection. La raison en est que T-SQL évalue toutes les expressions qui apparaissent dans la même phase de traitement d'une requête logique de manière tout à la fois.

SELECT (Salary * 12) as YearlySalary, YearlySalary / 100 FROM Employee; 

Msg 207, Niveau 16, Etat 1, Ligne 13
Nom de colonne invalide 'YearlySalary'.

4.Référencement d'un alias de colonne dans la clause ORDER BY

Lorsque nous créons un alias de colonne dans une clause SELECT et tentons de trier le résultat en fonction du nom d'alias de colonne créé, il est autorisé car, conformément au traitement de la requête logique, une clause SELECT est évaluée avant une clause ORDER BY.

SELECT (Salary * 12) as YearlySalary DE l'employé ORDER BY YearlySalary DESC; 
AnnuelSalary 8400000 480000 168000 144000 144000 

En savoir plus sur la programmation de base de données et SQL de Tech-Recipes.