PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Logiczna kolejność przetwarzania lub standard SQL w klauzuli WHERE

Jest to reguła ze standardu SQL (która jest dość skomplikowana, ponieważ zawiera wiele szczegółów, o których użytkownicy SQL prawdopodobnie nie myślą).

Za tą zasadą stoją dwie zasady. Po pierwsze, standard nie narzuca kolejności operacji, chyba że jest to logicznie konieczne (having na przykład klauzula musi być logicznie przetworzona po group by ). To jest podstawa pojęcia, że ​​SQL jest opisowy język, w którym opisane są wyniki. Każdy konkretny silnik bazy danych może określić własne ścieżki wykonania.

Drugą zasadą jest unikanie niejasności. W tym miejscu pojawiają się reguły określania zakresu, które określają, co kompilator SQL wie kiedy.

Rozważ następujące stwierdzenie:

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

Pytanie brzmi:który a robi a+1 patrz kolumna a w tabeli lub kolumnie b (który jest aliasem a ) w select . Zgodnie ze standardem jest to jednoznaczne. Aliasy kolumn nie są znane w select klauzula, w której są zdefiniowane.

To rozciąga się na where również klauzula, która jest oceniana w tym samym zakresie. Rozważ ten sam przykład:

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

Który a robi where warunek odnoszą się do? Standard jest jednoznaczny. where klauzula nie rozumie aliasów kolumn w select . Dzieje się tak, ponieważ select jest (logicznie) oceniany po where . Tak więc, kiedy mówisz:

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

Zwracana wartość zaczyna się od pierwszego a po 100. Wyliczenie nie odbywa się najpierw, a filtrowane wiersze otrzymują numery sekwencyjne, które są odfiltrowywane.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ActiveRecord:Jak znaleźć rodziców, których WSZYSTKIE dzieci spełniają warunek?

  2. Jak zmienić użytkownika na superużytkownika w PostgreSQL?

  3. Jak uzyskać dane lokalne w bazie danych tylko do odczytu przy użyciu programu dplyr?

  4. PostgreSQL - maksymalna liczba parametrów w klauzuli IN?

  5. Jak ręcznie wstawić plik .png lub .jpeg do kolumny bytea w PostgreSQL?