sql >> Databáze >  >> RDS >> PostgreSQL

Logical Processing Order nebo SQL Standard v klauzuli WHERE

Je to pravidlo ze standardu SQL (které je poměrně komplikované, protože jde do mnoha detailů, o kterých uživatelé SQL pravděpodobně nepřemýšlejí).

Za pravidlem stojí dva principy. První je, že standard neukládá pořadí operací, kromě případů, kdy je to logicky nutné (having klauzule, například, musí být logicky zpracována po group by ). To je základ toho, že SQL je popisný jazyk, kde jsou popsány výsledky. Každý konkrétní databázový stroj může určit své vlastní cesty provádění.

Druhou zásadou je vyhnout se nejednoznačnosti. Zde nastupují pravidla pro stanovení rozsahu, která definují, co kdy kompilátor SQL ví.

Zvažte následující tvrzení:

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

Otázka zní:který a dělá a+1 viz sloupec a v tabulce nebo sloupci b (který má alias jako a ) v select . Podle normy je to jednoznačné. Aliasy sloupců nejsou v select známy klauzule, kde jsou definovány.

To se vztahuje na where doložka, která je hodnocena ve stejném rozsahu. Zvažte stejný příklad:

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

Které a dělá where stav odkazovat? Norma je jednoznačná. where klauzule nerozumí aliasům sloupců v select . Je to proto, že select je (logicky) vyhodnocen za where . Takže, když říkáte:

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

Vrácená hodnota začíná prvním a po 100. Výčet neproběhne jako první, filtrované řádky získají pořadová čísla, která jsou odfiltrována.




  1. Jak obnovit databázi MySQL z fyzických souborů

  2. Funkce zálohování PDO MySQL

  3. Jak vložit data z jednoho sloupce do jiné tabulky

  4. Zabraňuje použití databázové funkce WordPress get_results() vkládání SQL