SELECT (z anglického select - „select“) je dotazovací operátor ( DML / DQL ) v jazyce SQL , který vrací datovou sadu (výběr) z databáze .
Operátor vrátí nula nebo více řádků. Seznam sloupců, které mají být vráceny, je uveden v části příkazu nazvané klauzule SELECT. Protože SQL je deklarativní jazyk, dotaz SELECT pouze definuje požadavky na vrácenou datovou sadu a není přesným návodem, jak je vypočítat. DBMS převádí dotaz SELECT do interního prováděcího plánu („plán dotazů“), který se může lišit i pro syntakticky identické dotazy z konkrétního DBMS.
Příkaz SELECT se skládá z několika klauzulí (sekcí):
Příkaz SELECT má následující strukturu:
VYBERTE [ DISTINCT | DISTINCTROW | VŠECHNY ] select_expression ,... FROM table_references [ WHERE where_definition ] [ GROUP BY { unsigned_integer | jméno_sloupec | vzorec } ] [ HAVING where_definition ] [ ORDER BY { unsigned_integer | jméno_sloupec | vzorec } [ ASC | DESC ], ...]Klauzule SELECToperátoru SELECTje určena k definování výsledné sady sloupců, která se získá poté, co byl tabulkový výraz v klauzuli vyhodnocen FROMa seskupen ve výsledku GROUP BY(pokud existuje). Tato klauzule SELECTimplementuje operaci projekce, tj. specifikuje podmnožinu sloupců z tabulek tabulkového výrazu, stejně jako operaci přejmenování sloupců a operaci přidání nových vypočitatelných sloupců.
Klauzule FROMse používá k vyhodnocení výrazu základní tabulky, který je pak používán zbytkem klauzulí operátora SELECT.
Klauzule [[WHERE (SQL)|WHERE]] se používá k určení, které řádky by měly být vybrány z tabulkového výrazu v klauzuli FROM.
[[GROUP BY (SQL)|GROUP BY]] — volitelná klauzule operátora SELECTpro seskupování řádků na základě výsledků agregačních funkcí ( MAX, SUM, AVG, …).
Je nutné, aby ve větě byly uvedeny SELECTpouze požadované sloupce ve výstupním proudu, uvedené v GROUP BYa/nebo agregované hodnoty . Častou chybou je zahrnutí SELECTsloupce do věty, která chybí v GROUP BY.
HAVING je volitelný návrh operátora SELECTpro výběr skupin vyplývajících z GROUP BY.
Když je zadán , HAVING <условия>můžete zadat podmínky pro sloupce uvedené v GROUP BYa pro hodnoty agregačních funkcí vypočítaných pro každou skupinu tvořenou GROUP BY.
ORDER BY je volitelná klauzule operátorů SELECTa UNION, což znamená, že operátory SELECT, UNIONvracejí sadu řádků seřazených podle hodnot jednoho nebo více sloupců. Lze jej použít jak na číselné sloupce, tak na řetězce. V druhém případě proběhne řazení podle abecedy .
Použití klauzule ORDER BYje jediný způsob, jak třídit výslednou sadu řádků. Bez této klauzule může DBMS vrátit řádky v libovolném pořadí. Pokud je nutná objednávka, ORDER BYmusí být přítomen v SELECT, UNION.
Řazení lze provádět vzestupně nebo sestupně.
"T" stůl | Žádost | Výsledek | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
VYBERTE * Z T |
| ||||||||||||
|
VYBERTE C1 Z T |
| ||||||||||||
|
VYBERTE * OD T , KDE C1 = 1 |
| ||||||||||||
|
VYBERTE * Z OBJEDNÁVKY OD C1 POPIS _ |
|
Pro dotaz na tabulku T
VYBERTE * Z Tvrátí všechny sloupce všech řádků dané tabulky. Pro stejnou tabulku, dotaz
VYBERTE C1 Z Tvrátí hodnoty sloupce C1 všech řádků tabulky. Z hlediska relační algebry můžeme říci, že byla provedena projekce . Pro stejnou tabulku, dotaz
VYBERTE * OD T , KDE C1 = 1vrátí hodnoty všech sloupců všech řádků tabulky, pro které je hodnota pole C1 rovna 1. Z hlediska relační algebry můžeme říci, že byl proveden výběr . Poslední žádost
VYBERTE * Z OBJEDNÁVKY OD C1 POPIS _vrátí stejné řádky jako první, ale výsledek bude seřazen v obráceném pořadí (ZA) kvůli použití klíčového slova ORDER BY s polem C1 jako třídicím polem. Tento dotaz neobsahuje klíčové slovo WHERE, takže vrátí vše, co je v tabulce. Více prvků ORDER BY může být uvedeno oddělených čárkami [např. ORDER BY C1 ASC, C2 DESC] pro přesnější třídění.
Vybere všechny řádky, kde se pole název_sloupce rovná jedné z vyjmenovaných hodnot hodnota1, hodnota2,…
Vrátí seznam ID oddělení, jejichž prodeje přesáhly 1 000 k 1. lednu 2000, spolu s jejich celkovými prodeji za daný den:
SELECT DEptID , SUM ( SaleAmount ) FROM Sales WHERE SaleDate = '01-Jan-2000' GROUP BY DeptID HAVING SUM ( SaleAmount ) > 1000Podle ISO SQL:2003 lze vrácenou datovou sadu omezit pomocí:
Existují různé funkce okna . ROW_NUMBER() OVERlze jednoduše omezit počet vrácených řádků. Chcete-li například vrátit ne více než deset řádků:
SELECT * FROM ( SELECT ROW_NUMBER () OVER ( ORDER BY key ASC ) AS numbernumber , sloupce FROM tablename ) AS foo WHERE rownumber <= 10ROW_NUMBER může být nedeterministické: pokud klíč není jedinečný, při každém provedení dotazu je možné přiřadit různá čísla řádkům, které mají stejný klíč . Když je klíč jedinečný, každý řádek vždy dostane jedinečné číslo řádku.
Funkce RANK() OVERfunguje v podstatě stejným způsobem jako ROW_NUMBER, ale za určitých podmínek může vrátit více než n řádků. Chcete-li například získat prvních 10 nejmladších lidí:
SELECT * FROM ( SELECT RANK ( ) OVER ( ORDER BY age ASC ) AS ranking , person_id , person_name , age FROM person ) AS foo WHERE ranking <= 10Tento kód může vrátit více než 10 řádků. Pokud jsou například dva lidé stejného věku, vrátí 11 řádků.
Ne všechny DBMS podporují výše uvedené funkce okna. Mnoho z nich má zároveň nestandardní syntaxi pro řešení stejných problémů. Níže jsou uvedeny příklady jednoduchých omezení vzorkování pro různé DBMS:
Prodejce/DBMS | Syntaxe omezení |
---|---|
DB2 | (Standardní podpora od DB2 verze 6) |
VYBRAT * Z [ T ] NAČTENÍ POUZE PRVNÍCH 10 ŘÁDKŮ | |
Fénix | VYBERTE PRVNÍCH 10 * Z [ T ] |
Informix | VYBERTE PRVNÍCH 10 * Z [ T ] |
Interbase | VYBERTE * Z [ T ] ŘÁDKŮ 10 |
Microsoft | (Standardní podpora od SQL Server 2005) |
TakyVYBERTE 10 NEJLEPŠÍCH [ PROCENTA ] * Z OBJEDNÁVKY PODLE sl _ | |
MySQL | VYBERTE * Z T LIMITU 10 |
SQLite | VYBERTE * Z T LIMITU 10 |
PostgreSQL | (Podporuje standard od PostgreSQL 8.4) |
VYBERTE * Z T LIMITU 10 | |
Věštec | (Podporuje standard od Oracle8i) |
TakyVYBERTE * OD T WHERE ROWNUM <= 10 |
SQL | |
---|---|
Verze |
|
Klíčová slova | |
Související články | |
Části ISO/IEC SQL |
|
Databáze | |
---|---|
Koncepty |
|
Objekty |
|
Klíče | |
SQL | |
Komponenty |