Quelle est la séquence d'exécution de la clause Group By, Have et Where dans SQL Server?

91

Je suis juste confondu avec la séquence d'exécution d'une requête SQL lorsque nous utilisons GROUP BY et HAVING avec une clause WHERE. Lequel est exécuté en premier? Quelle est la séquence?

Jonathan Leffler
la source

Réponses:

184

en ordre:

FROM & JOIN s déterminent et filtrent les lignes
WHERE plus de filtres sur les lignes
GROUP BY combine ces lignes en groupes
HAVING filtres groupes
ORDER BY arrange les lignes / groupes restants
LIMIT filtres sur les lignes / groupes restants

KM.
la source
y a-t-il une référence à cela ??
Geshan
3
@Geshan, regardez dansSET SHOWPLAN_ALL ON
KM.
Salut, j'ai une question. l'instruction case when condition remplacera-t-elle la condition where?
MAX
1
Qu'en est-il de la clause select. Est-ce dans le dernier?
MAX
Réponse courte et concise! Je vous remercie!
Abhishek Ghosh
14

Voici la séquence complète pour le serveur SQL:

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

Ainsi, à partir de la liste ci-dessus, vous pouvez facilement comprendre la séquence d'exécution GROUP BY, HAVING and WHEREdont:

1.  WHERE
2.  GROUP BY
3.  HAVING

Obtenez plus d'informations à ce sujet auprès de Microsoft

Md. Suman Kabir
la source
SELECT * FROM table1 INNER JOIN table2 ON col = col2 WHERE table1.col = @valIci ON vient après la jointure, et sélectionnez vient en premier, des explications?
noob
C'est juste la syntaxe de l'écriture d'une instruction SQL. La séquence que j'ai mentionnée est l'ordre réel qu'un moteur SQL évalue. Cela signifie que si la syntaxe de votre requête est correcte, le moteur évalue d' FROMabord, puis ONet ainsi de suite.
Md. Suman Kabir
1
@ShailajaGuptaKapoor Vous pouvez lire ce blogs.x2line.com/al/archive/2007/06/30/3187.aspx
Md. Suman Kabir
8

WHERE est le premier, puis vous GROUP le résultat de la requête, et le dernier mais non le moindre HAVING-clause est prise pour filtrer le résultat groupé. C'est l'ordre "logique", je ne sais pas comment cela est techniquement implémenté dans le moteur.

Matthias Meid
la source
2
Il vaut la peine d'ajouter que l'optimiseur peut déplacer des clauses de HAVING vers WHERE si elles ne dépendent pas d'un agrégat. Cela n'affectera pas les résultats affichés.
Damien_The_Unbeliever
2

Je pense qu'il est implémenté dans le moteur comme le disait Matthias: WHERE, GROUP BY, HAVING

J'essayais de trouver une référence en ligne qui répertorie la séquence entière (c'est-à-dire que "SELECT" vient tout en bas), mais je ne la trouve pas. Il a été détaillé dans un livre "Inside Microsoft SQL Server 2005" que j'ai lu il n'y a pas si longtemps, par Solid Quality Learning

Edit: J'ai trouvé un lien: http://blogs.x2line.com/al/archive/2007/06/30/3187.aspx

AdaTheDev
la source
Très belle explication à laquelle vous avez lié :-).
sleske
1
Link est mort. Si vous pouvez résoudre ce problème, ce serait génial :)
Akash KC
2

Dans Oracle 12c, vous pouvez exécuter le code dans les deux séquences ci-dessous:

Where
Group By
Having

Ou

Where 
Having
Group by
Jim Chen
la source
1

Réfléchissez à ce que vous devez faire si vous souhaitez mettre en œuvre:

  • WHERE : il a besoin d'exécuter les opérations JOIN.
  • GROUP BY : Vous spécifiez Group by pour "grouper" les résultats sur la jointure, puis il doit le faire après l'opération JOIN, après l'utilisation WHERE.
  • HAVING : HAVING est destiné au filtrage comme le dit les expressions GROUP BY. Ensuite, il est exécuté après le GROUP BY.

L'ordre est WHERE, GROUP BY et HAVING.

FerranB
la source
Ce que vous avez expliqué ici est brillant. Cela a dissipé mon doute concernant HAVING. Donc, pour résumer - GROUP BY & HAVING fonctionne de la même manière que SELECT & WHERE. La clause HAVING s'exécute toujours sur les données de table COMPLETE prenant la condition GROUP BY dans l'image et NOT ON GROUPED.
Naveen Kumar
1

Dans l'ordre ci-dessous

  1. DE & REJOINDRE
  2. PAR GROUPE
  3. AYANT
  4. SÉLECTIONNER
  5. COMMANDÉ PAR
  6. LIMITE
GimmicksWorld
la source
0

Avoir la clause peut précéder / précéder la clause group by.

Exemple: sélectionnez * FROM test_std; ROLL_NO SNAME DOB ENSEIGNER


     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 lignes sélectionnées.

sélectionnez Teach , count ( ) count à partir de test_std ayant count ( )> 1 group by TEACH;

ENSEIGNER LE NOMBRE


Langer 2 testaments 4

manoj remala
la source
0

Il s'agit de l'ordre d'exécution SQL d'une requête,

entrez la description de l'image ici

Vous pouvez vérifier l'ordre d'exécution avec des exemples de cet article .

Pour votre question ci-dessous, les lignes peuvent être utiles et directement tirées de cet article .

  1. GROUP BY -> Les lignes restantes après l'application des contraintes WHERE sont ensuite regroupées en fonction des valeurs communes dans la colonne spécifiée dans la clause GROUP BY. En raison du regroupement, il y aura seulement autant de lignes qu'il y a de valeurs uniques dans cette colonne. Implicitement, cela signifie que vous ne devriez avoir besoin de l'utiliser que lorsque vous avez des fonctions d'agrégation dans votre requête.
  1. HAVING -> Si la requête a une clause GROUP BY, alors les contraintes de la clause HAVING sont alors appliquées aux lignes groupées, supprimez les lignes groupées qui ne satisfont pas la contrainte. Comme la clause WHERE, les alias ne sont pas non plus accessibles à partir de cette étape dans la plupart des bases de données.

Références:-

Kushan Gunasekera
la source
-2

SÉLECTIONNER
DES
JOINTS O
LE
GROUPE
EN PASSANT LA
COMMANDE PAR

OcTella
la source
13
C'est en fait faux. Selon les formateurs certifiés MS et le matériel de formation officiel, Order By est après Select. Un peu logique quand on y pense. Ce serait stupide de commander une table virtuelle que vous n'avez pas encore récupérée et collée. :)
simme