/SelectProste

Z Brain-wiki

TI:WTBD/SelectProste

Zapytanie (czasami zwane kwerendą) jest instrukcją zwracającą wynik. Wynikiem w SQL jest zawsze zbiór wynikowy — tabela o określonej przez postać zapytania liczbie (i dziedzinach) kolumn, natomiast liczba (i zawartość) jej wierszy zależy od aktualnej zawartości tabel źródłowych. Zbiór wynikowy nie całkiem jest relacją w sensie teorii relacyjnej: nie charakteryzuje się kluczem głównym, może mieć powtórzenia wierszy, i nie ma co udawać, że jego wiersze nie są przekazywane w określonym porządku — istnieje zresztą klauzula ORDER BY, pozwalająca narzucić kryterium sortowania.

Zapytanie zaczyna się od słowa SELECT, po nim następuje definicja kolumn wyniku, a dalej — szereg opcjonalnych klauzul (FROM czasami jest traktowana jako obowiązkowa, ale większość systemów dopuszcza domyślny FROM, mimo że jest to rzadko przydatne). Kolejność klauzul jest istotna, nie mogą one być przestawiane.


SELECT -- zapytania proste
SELECT 2+1;
najprostszy SELECT nie czerpie z żadnej tabeli, tylko dokonuje ewaluacji wyrażenia zbudowanego ze stałych ew. wywołań funkcji. Oczywiście jest to mało przydatne. UWAGA: Oracle (np.) nie dopuszcza tej postaci -- tzn. klauzulę FROM traktuje jako obowiązkową.
SELECT kol1, kol2, ... FROM tabela;
to co wcześniej określaliśmy jako rzutowanie;
SELECT wyr1, wyr2, ... FROM tabela;
wyrażenia mogą być zbudowane ze stałych, operatorów, wywołań funkcji, oraz nazw kolumn odpytywanej tabeli
SELECT wyr1, wyr2, ... FROM tabela WHERE warunek;
warunek wyznacza podzbiór wierszy, dla którego zostaną obliczone wyrażenia tworzące kolumny zbioru wynikowego
SELECT wyr1, wyr2, ... FROM tabela WHERE warunek
ORDER BY klucz_sortowania1, ... [ASC|DESC];
klucz_sortowania jest wyrażeniem utworzonym tak, jak kolumny zbioru wynikowego, jego wartości decydują o porządku zwracania wierszy wyniku. W wielu systemach możliwe jest też użycie numeru kolumny zbioru wynikowego;
SELECT wyr1, wyr2, ... FROM tabela WHERE warunek
ORDER BY klucz_sortowania1, ... [ASC|DESC]
LIMIT [offset,] limit;
oznacza pominięcie pierwszych offset wierszy wyniku i zwrócenie maksymalnie limit kolejnych wierszy. Nb. Oracle tego nie rozumie. Można tę klauzulę napisać też inaczej:
LIMIT limit OFFSET offset
Specjalne wyrażenie "*" zastosowane jako lista kolumn wyniku oznacza wszystkie kolumny tabel źródłowej:
SELECT * FROM tabela [WHERE warunek];
Można również napisać tabela.*, co się przydaje zwłaszcza w zapytaniach wielotabelowych (p. dalej). Nota bene do zasad dobrej praktyki należy nieużywanie zapytań postaci SELECT * ... w kodzie produkcyjnym -- ich sens się zmieni, jeżeli zmieni się zestaw kolumn w tabeli źródłowej, co wbrew pozorom nie jest rzadkie w ewolucji aplikacji. Jawne wymienianie wszystkich kolumn potrzebnych w zapytaniu pozwala, by zmiany takie nie unieważniały zapytań korzystających tylko z takiego podzbioru kolumn, który nie uległ zmianie.
Można też zastosować inne wyrażenie specjalne, liczące ile wierszy zawiera wynik:
SELECT COUNT(*) FROM tabela [WHERE warunek];
To jest przykład funkcji agregującej, o których dokładniej będzie dalej.