/SelectProste
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.