Je suis simplement confus 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?
en ordre:
FROM&JOINs détermine et filtre les lignes
OÙplusieurs filtres sur les lignes
GROUP BY combine ces lignes en groupes
AYANTfiltre les groupes
ORDER BY arrange les lignes/groupes restants
LIMITEfiltres sur les lignes/groupes restants
WHERE est le premier, alors vous groupez le résultat de la requête, et enfin, la clause HAVING sert à filtrer le résultat groupé. C'est l'ordre "logique", je ne sais pas comment cela est techniquement implémenté dans le moteur.
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
Donc, dans la liste ci-dessus, vous pouvez facilement comprendre la séquence d'exécution de GROUP BY, HAVING and WHERE
qui est:
1. WHERE
2. GROUP BY
3. HAVING
Je pense que cela est implémenté dans le moteur, comme Matthias l’a dit: O GROUP, GROUP BY BY
J'essayais de trouver une référence en ligne répertoriant la séquence complète ("SELECT" apparaît tout en bas), mais je ne parviens pas à la trouver. 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: Trouvé un lien: http://blogs.x2line.com/al/archive/2007/06/30/3187.aspx
En dessous de l'ordre
Dans Oracle 12c, vous pouvez exécuter le code dans l’une des deux séquences suivantes:
Where
Group By
Having
Ou
Where
Having
Group by
Pensez à ce que vous devez faire si vous souhaitez mettre en œuvre:
La commande est WHERE, GROUP BY et HAVING.
Avoir Clause peut venir avant/avant le groupe par clause.
Exemple: Sélectionnez * FROM test_std; ROLL_NO SNAME DOB TEACH
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 avec count ()> 1group by TEACH;
COMPTE D'ENSEIGNEMENT
Langer 2 Wills 4