|
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:
1: 2: 3: 4: 5: 6: 7: 8: 9: |
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.
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. Linia 9 ....
Przykłady:
1: |
SELECT TOP 5 WITH TIES orderid, productid, quantity FROM orders ORDER BY quantity DESC |
2: |
SELECT COUNT(*) FORM orders |
3: |
SELECT productid, SUM(quantity) AS total_quantity FROM order_hist GROUP BY productid HAVING SUM(quantity) >= 20 |
4: |
SELECT productid, orderid, SUM(quantity) AS total_quantity FROM order_hist GROUP BY productid, orderid WITH CUBE ORDER BY productid |
5: |
SELECT productid, orderid, quantity FROM order_hist ORDER BY productid, orderid COMPUTE SUM(quantity) |
6: |
SELECT productid, orderid, quantity FROM order_hist ORDER BY productid, orderid COMPUTE BY productid COMPUTE SUM(quantity) | | |