sql >> Base de Datos >  >> RDS >> PostgreSQL

Orden de procesamiento lógico o estándar SQL en la cláusula WHERE

Es la regla del estándar SQL (que es bastante complicada porque entra en muchos detalles en los que los usuarios de SQL probablemente no piensan).

Hay dos principios detrás de la regla. La primera es que el estándar no impone un ordenamiento de operaciones, excepto cuando sea lógicamente necesario (un having la cláusula, por ejemplo, tiene que procesarse lógicamente después de un group by ). Esta es la base de la noción en SQL es un descriptivo lenguaje, donde se describen los resultados. Cualquier motor de base de datos en particular puede determinar sus propias rutas de ejecución.

El segundo principio es evitar la ambigüedad. Aquí es donde entran las reglas de alcance, que definen qué sabe un compilador de SQL y cuándo.

Considere la siguiente declaración:

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

La pregunta es:¿cuál a hace a+1 consulte la columna a en la tabla o la columna b (que tiene el alias de a ) en el select . De acuerdo con el estándar esto es inequívoco. Los alias de columna no se conocen en select cláusula donde se definen.

Esto se extiende al where cláusula también, que se evalúa en el mismo ámbito. Considere el mismo ejemplo:

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

¿Cuál a hace el where ¿Condición a la que se refiere? El estándar es inequívoco. El where la cláusula no comprende los alias de columna en select . Esto se debe a que select se evalúa (lógicamente) después de where . Entonces, cuando dices:

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

El valor devuelto comienza con el primer a después 100. La enumeración no ocurre primero, las filas filtradas obtienen números de secuencia que se filtran.