[ SQL ] Klauzula SELECT
Pobiera wiersze z bazy danych (jeden lub więcej) lub kolumny z jednej
lub więcej tabel. Służy ona do wyszukiwania danych w bazie. Może być
wykonywana samodzielnie lub stanowić część komend (np. CREATE, UPDATE,
INSERT, itp.). Warunki muszą być podane w odpowiedniej kolejności jak
to przedstawia poniższy schemat. Pełna składnia instrukcji SELECT jest
złożona jednak główne elementy to:
SELECT [ALL | DISTINCT] [TOP n [PERCENT] [WITH TIES]] lista_wyboru
[INTO nowa_tabela]
FROM tabele_zrodlowe
[WHERE warunki_wyszukiwania]
[ [GROUP BY [ALL] grupuj_wedlug_wyrazenia [,...n] ] [HAVING warunki_wyszukiwania]
[WITH { CUBE | ROLLUP }] ]
[ORDER BY { nazwy_kolumn [ASC | DESC] } [,...n] ]
[ COMPUTE { { AVG | COUNT | MAX | MIN | SUM } (wyrazenie) } [,...n] [ BY wyrazenie [,...n] ] ]
[ FOR BROWSE ]
W celu połączenia kilku rezultatów z różnych zapytań w jeden można użyć operatora UNION.[INTO nowa_tabela]
FROM tabele_zrodlowe
[WHERE warunki_wyszukiwania]
[ [GROUP BY [ALL] grupuj_wedlug_wyrazenia [,...n] ] [HAVING warunki_wyszukiwania]
[WITH { CUBE | ROLLUP }] ]
[ORDER BY { nazwy_kolumn [ASC | DESC] } [,...n] ]
[ COMPUTE { { AVG | COUNT | MAX | MIN | SUM } (wyrazenie) } [,...n] [ BY wyrazenie [,...n] ] ]
[ FOR BROWSE ]
Linia pierwsza nakazuje wybrać (SELECT) kolumny znajdujące się w lista_wyboru. Element ALL i DISTINCT nakazują wybrać wszystkie wiersze (ALL) lub wiersze bez powtórzeń (DISTINCT). Domyślną wartością jest ALL. Słowo kluczowe TOP może być wykorzystane do tworzenia listy tylko n początkowych wierszy lub n procent początkowych wierszy zestawu wyników. Nie jest ono zgodne ze standardem ANSI. Klauzula WITH TIES może być wykorzystana do uwzględnienia "powiązań" w zestawie wyników. Powiązania powstają wówczas, gdy dwie lub kilka wartości jest takich samych jak ostatni wiersz zwrócony w klauzuli ORDER BY. Należy pamiętać, że klauzula WITH TIES może być użyta tylko wówczas, gdy istnieje klauzula ORDER BY. Linia 2 nie jest często spotykana, gdyż nakazuje pobrane rekordy umieścić w nowej tabeli o nazwie nowa_tabela. Linia 3 jest obowiązkowa i wskazuje z jakich tabel mają być pobierane kolumny. Linia 4 zawiera listę warunków (warunki_wyszukiwania), które mają być uwzględnione przy wyborze wierszy z bazy. Ta klauzula jest nieobowiązkowa, lecz często wykorzystywana w celu zawężenia ilości zwróconych rekordów. Linia 5 to klauzula grupująca. W przypadku, gdy w lista_wyboru znajdzie się funkcja agregująca należy użyć klauzuli GROUP BY. Funkcje agregujące to m.in.:
AVG - średnia wartość w wyrażeniu numerycznym
COUNT - liczba wartości w wyrażeniu
COUNT(*) - liczba wybranych wierszy
MAX - największa wartość w wyrażeniu
MIN - najmniejsza wartość w wyrażeniu
SUM - suma wartości w wyrażeniu numerycznym
STDEV - odchylenie statystyczne dla wszystkich wartości
STDEVP - odchylenie statystyczne dla populacji
VAR - wariacja statystyczna dla wszystkich wartości
VARP - wariacja statystyczna dla wszystkich wartości w populacji
Klauzula GROUP BY grupuje po wyrażeniu grupuj_wedlug_wyrazenia (wyrażeń może być więcej niż jedno). Dodatkowo można zawęzić wynik i użyć klauzuli HAVING, która podobnie jak WHERE posiada za sobą grupę warunków. Należy pamiętać, że HAVING dotyczy tylko i wyłącznie GROUP BY. Linia 6 odnosi się również do klauzuli GROUP BY. Operator CUBE może być wykorzystany do tworzenia i podsumowania wszystkich możliwych kombinacji grup na podstawie klauzuli GROUP BY, zaś operator ROLLUP umożliwia uzyskanie danych w standardowym formacie relacyjnym. Linia 7 to klauzula ORDER BY, która określa kolumny po których wynik ma być sortowany. Klauzula jest nieobowiązkowa. Elementy ASC i DESC określają kierunek sortowania (ASC - rosnąco, DESC - malejąco). Linia 8 zawiera klauzule COMPUTE lub COMPUTE BY, które generują dodatkowe wiersze podsumowań danych w formacie nierelacyjnym, który nie jest zgodny ze standardem ANSI. Format ten jest użyteczny do przeglądania, jednak dane nie są odpowiednio przystosowane do generowania zestawów wyników, które mogą być wykorzystane z innymi aplikacjami.
SELECT TOP 5 WITH TIES orderid, productid, quantity FROM orders ORDER BY quantity DESC
SELECT COUNT(*) FORM orders
SELECT productid, SUM(quantity) AS total_quantity FROM order_hist GROUP BY productid HAVING SUM(quantity) >= 20
SELECT productid, orderid, SUM(quantity) AS total_quantity FROM
order_hist GROUP BY productid, orderid WITH CUBE ORDER BY productid
SELECT productid, orderid, quantity FROM order_hist ORDER BY productid, orderid COMPUTE SUM(quantity)
SELECT productid, orderid, quantity FROM order_hist ORDER BY productid, orderid COMPUTE BY productid COMPUTE SUM(quantity)