Vybrat (SQL)

Stabilní verze byla odhlášena 11. dubna 2022 . Existují neověřené změny v šablonách nebo .

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í):

Struktura operátora

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 ], ...]

Návrhy operátora

VYBRAT

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ů.

OD

Klauzule FROMse používá k vyhodnocení výrazu základní tabulky, který je pak používán zbytkem klauzulí operátora SELECT.

KDE

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

[[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.

MÍT

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.

OBJEDNAT DO

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ě.

  • Možnost ASC(výchozí) nastavuje pořadí řazení ve vzestupném pořadí, od nejmenších hodnot po největší.
  • Parametr DESCnastavuje pořadí řazení v sestupném pořadí, od největšího po nejmenší.

Příklady

"T" stůl Žádost Výsledek
C1 C2
jeden A
2 b
VYBERTE * Z T
C1 C2
jeden A
2 b
C1 C2
jeden A
2 b
VYBERTE C1 Z T
C1
jeden
2
C1 C2
jeden A
2 b
VYBERTE * OD T , KDE C1 = 1
C1 C2
jeden A
C1 C2
jeden A
2 b
VYBERTE * Z OBJEDNÁVKY OD C1 POPIS _
C1 C2
2 b
jeden A

Pro dotaz na tabulku T

VYBERTE * Z T

vrátí všechny sloupce všech řádků dané tabulky. Pro stejnou tabulku, dotaz

VYBERTE C1 Z T

vrá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 = 1

vrá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,…

SELECT * FROM název_tabulky WHERE název_sloupce IN ( 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 ) > 1000

Omezení na vrácené řetězce

Podle ISO SQL:2003 lze vrácenou datovou sadu omezit pomocí:

  • kurzory , popř
  • zavedení okenních funkcí do příkazu SELECT

Funkce okna ROW_NUMBER()

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 <= 10

ROW_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 okna RANK()

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 <= 10

Tento 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ů.

Nestandardní syntaxe

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

Literatura

  • Chamberlin, Donald D. Raná historie SQL . // IEEE Annals of the History of Computing 34.4 (2012): 78-82. (Angličtina)
  • Alex Kriegel, Boris M. Trukhnov. SQL Bible (2. vydání). Wiley Publishing, 2008.  (anglicky)
  • Gruber M. Pochopení SQL. - Moskva, 1993. - 291 s.