Appliquer des instructions conditionnelles dans ON / WHERE
Ici, j'ai expliqué les étapes de traitement des requêtes logiques.
Référence: Inside Microsoft® SQL Server ™ 2005 T-SQL Querying
Publisher: Microsoft Press
Pub Date: 07 mars 2006
Print ISBN-10: 0-7356-2313-9
Print ISBN-13: 978-0-7356-2313-2
Pages: 640
À l'intérieur de Microsoft® SQL Server ™ 2005 Requête T-SQL
(8) SELECT (9) DISTINCT (11) TOP <top_specification> <select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) WITH {CUBE | ROLLUP}
(7) HAVING <having_condition>
(10) ORDER BY <order_by_list>
Le premier aspect notable de SQL différent des autres langages de programmation est l'ordre dans lequel le code est traité. Dans la plupart des langages de programmation, le code est traité dans l'ordre dans lequel il est écrit. En SQL, la première clause qui est traitée est la clause FROM, tandis que la clause SELECT, qui apparaît en premier, est traitée presque en dernier.
Chaque étape génère une table virtuelle qui est utilisée comme entrée pour l'étape suivante. Ces tables virtuelles ne sont pas disponibles pour l'appelant (application client ou requête externe). Seule la table générée par l'étape finale est renvoyée à l'appelant. Si une certaine clause n'est pas spécifiée dans une requête, l'étape correspondante est simplement ignorée.
Brève description des phases de traitement des requêtes logiques
Ne vous inquiétez pas trop si la description des étapes ne semble pas avoir beaucoup de sens pour l'instant. Ils sont fournis à titre de référence. Les sections qui suivent l'exemple de scénario couvriront les étapes de manière beaucoup plus détaillée.
FROM: un produit cartésien (jointure croisée) est effectué entre les deux premières tables de la clause FROM et, par conséquent, la table virtuelle VT1 est générée.
ON: Le filtre ON est appliqué à VT1. Seules les lignes pour lesquelles la <join_condition>
valeur est TRUE sont insérées dans VT2.
OUTER (jointure): si une OUTER JOIN est spécifiée (par opposition à une CROSS JOIN ou une INNER JOIN), les lignes de la ou des tables préservées pour lesquelles aucune correspondance n'a été trouvée sont ajoutées aux lignes de VT2 en tant que lignes externes, générant VT3. Si plus de deux tables apparaissent dans la clause FROM, les étapes 1 à 3 sont appliquées à plusieurs reprises entre le résultat de la dernière jointure et la table suivante de la clause FROM jusqu'à ce que toutes les tables soient traitées.
WHERE: Le filtre WHERE est appliqué à VT3. Seules les lignes pour lesquelles le <where_condition>
est VRAI sont insérées dans VT4.
GROUP BY: Les lignes de VT4 sont organisées en groupes en fonction de la liste de colonnes spécifiée dans la clause GROUP BY. VT5 est généré.
CUBE | ROLLUP: des supergroupes (groupes de groupes) sont ajoutés aux lignes de VT5, générant VT6.
HAVING: Le filtre HAVING est appliqué à VT6. Seuls les groupes dont le <having_condition>
est VRAI sont insérés dans VT7.
SELECT: La liste SELECT est traitée, générant VT8.
DISTINCT: les lignes en double sont supprimées de VT8. VT9 est généré.
ORDER BY: Les lignes de VT9 sont triées selon la liste de colonnes spécifiée dans la clause ORDER BY. Un curseur est généré (VC10).
TOP: Le nombre ou pourcentage spécifié de lignes est sélectionné depuis le début de VC10. La table VT11 est générée et renvoyée à l'appelant.
Par conséquent, (INNER JOIN) ON filtrera les données (le nombre de données de VT sera réduit ici même) avant d'appliquer la clause WHERE. Les conditions de jointure suivantes seront exécutées avec des données filtrées, ce qui améliore les performances. Après cela, seule la condition WHERE appliquera les conditions de filtrage.
(L'application d'instructions conditionnelles dans ON / WHERE ne fera pas beaucoup de différence dans quelques cas. Cela dépend du nombre de tables que vous avez jointes et du nombre de lignes disponibles dans chaque table de jointure)