PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Ordre de traitement logique ou SQL Standard dans la clause WHERE

C'est la règle du standard SQL (qui est assez compliquée car elle entre dans beaucoup de détails auxquels les utilisateurs de SQL ne pensent probablement pas).

Il y a deux principes derrière la règle. La première est que la norme n'impose pas d'ordonnancement des opérations, sauf lorsque cela est logiquement nécessaire (un having la clause, par exemple, doit logiquement être traitée après un group by ). C'est la base de la notion chez SQL est un descriptif langue, où les résultats sont décrits. Tout moteur de base de données particulier peut déterminer ses propres chemins d'exécution.

Le deuxième principe est d'éviter l'ambiguïté. C'est là qu'interviennent les règles de portée, qui définissent ce qu'un compilateur SQL sait quand.

Considérez la déclaration suivante :

select a as b, b as a, a + 1 as d
-----------------------^
from t

La question est :quel a fait a+1 reportez-vous à la colonne a dans le tableau ou la colonne b (qui est alias a ) dans le select . Selon la norme, cela est sans ambiguïté. Les alias de colonne ne sont pas connus dans le select clause où ils sont définis.

Cela s'étend à where clause également, qui est évaluée dans le même périmètre. Prenons le même exemple :

select a as b, b as a, a + 1 as d
from t
where a > 100

Quel a fait le where état se référer? La norme est sans ambiguïté. Le where la clause ne comprend pas les alias de colonne dans le select . C'est parce que le select est (logiquement) évalué après le where . Alors, quand vous dites :

select row_number() over (order by a) as seqnum
from t
where a > 100

La valeur renvoyée commence par le premier a après 100. L'énumération ne se produit pas en premier, les lignes filtrées obtenant des numéros de séquence qui sont filtrés.