Clause SQL WHERE et valeurs calculées de la clause SELECT : un guide pratique
Le référencement direct aux alias définis dans l'instruction SELECT dans la clause WHERE d'une requête SQL entraîne souvent des erreurs. Cela est dû à l'ordre d'évaluation : la clause SELECT est traitée après la clause WHERE.
Considérez cet exemple problématique :
<code class="language-sql">SELECT (InvoiceTotal - PaymentTotal - CreditTotal) AS BalanceDue FROM Invoices WHERE BalanceDue > 0;</code>
Cette requête échouera car BalanceDue
n'est pas encore défini lorsque la clause WHERE
est évaluée.
Voici deux solutions efficaces :
1. Utilisation d'une sous-requête :
Cette approche utilise une sous-requête pour pré-calculer la valeur, permettant son utilisation dans la clause WHERE de la requête externe :
<code class="language-sql">SELECT BalanceDue FROM ( SELECT (InvoiceTotal - PaymentTotal - CreditTotal) AS BalanceDue FROM Invoices ) AS sub WHERE BalanceDue > 0;</code>
La requête interne calcule BalanceDue
et la requête externe filtre en fonction de ce résultat pré-calculé.
2. Calcul redondant dans la clause WHERE :
Vous pouvez également répéter le calcul directement dans la clause WHERE :
<code class="language-sql">SELECT (InvoiceTotal - PaymentTotal - CreditTotal) AS BalanceDue FROM Invoices WHERE (InvoiceTotal - PaymentTotal - CreditTotal) > 0;</code>
Bien que plus simple, cette méthode peut entraîner des problèmes de performances avec des calculs très complexes, car l'expression est évaluée deux fois.
Optimisation des performances :
Les systèmes de bases de données modernes comme SQL Server optimisent souvent les requêtes, en exécutant des calculs complexes une seule fois, même avec des références répétées. Cependant, pour les calculs extrêmement complexes ou sensibles aux performances, il convient d'éviter de répéter le calcul dans la clause WHERE
.
Pour les valeurs calculées fréquemment utilisées, la création d'une colonne calculée est une solution plus efficace à long terme. Cela stocke la valeur calculée de manière persistante, améliorant considérablement les performances des requêtes.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!