Wikipedista:ZbR/SQL - Select

SQL příkaz SELECT je základním prvkem pro dotazování v relačních databázích. Užití tohoto příkazu umožňuje v databázi nalézt a zobrazit požadované data. Jeho vykonáním dochází k dotazování se v databázi, kdy výsledek takovéhoto dotazu je následně vracen jako strukturovaná množina dat která se nejčastěji reprezentuje formou tabulky.
Pojmem "příkaz SELECT" v tomto kontextu není myšleno pouze klíčové slovo SELECT jazyka SQL, ale jeho širší forma, která je složena z dalších klíčových slov které se také označují jako klauzule. Některé klauzule jsou v zápisu povinné a některé jen volitelné. Každá klauzule pak může obsahovat další klíčová slova a parametry. Díky této variabilitě je možné pomocí příkazu SELECT konstruovat širokou škálu nejrůznějších dotazů.
Volně řečeno, klíčové slovo SELECT je pouze prvním (úvodním) prvkem v příkazu SELECT.

Možné základní podoby příkazu SELECT

  SELECT {[tabulka. | alias. | pohled.]{* | sloupec}[,...n] FROM <tabulka>[,... n]

  SELECT {[tabulka. | alias. | pohled.]{* | sloupec}[,...n] FROM <tabulka>[,... n]
  [WHERE <podmínky>]
  [GROUP BY <nazev sloupce>[,... n]] [HAVING <omezujici podminka postavena na vysledcich klauzule GROUP BY>]
  [ORDER BY <sloupec>[,... n] [ASC | DESC]]

Klauzule v příkazu SELECT:

  • SELECT je povinná úvodní klauzule totoho příkazu. Umožňuje specifikovat sloupce, které mají být ve výsledné množině zadávaného dotazu. Tyto sloupce pak mohou být vybýrány z tabulky nebo pohledu který je specifikován v klauzuli FROM. Možné je také vkládat sloupce vzniklé pomocí agragačních funkcí nebo na základě množinových operací nad více tabulkami
  • FROM je také povinnou klauzulí. Umožňuje specifikovat tabulku nebo pohled, ze které se v klauzuli SELECT vybírají sloupce.
  • WHERE je volitelná klauzule, která umožňuje filtrovat řádky zdrojů (tabulka, pohled) které jsou definovány v klauzuli FROM. Způsob filtrování se zadává pomocí výrazu (v informatice označován jako predikát) který po vyhodnocení může nabýt stavu TRUE, FALSE nebo UNKNOWN. Hodnotu tohoto výrazu je poté možno testovat pomocí různých operátorů.
  • GROUP BY je taktéž volitelná klauzule, která je však povinnou v případě, kdy je v klauzuli SELECT využita některá z agragačních funkcí. V tomto případě klauzule GROUP BY slouží k vytvoření samostatných podmnožin, kde klíčem pro jejich utváření jsou hodnoty obsažené ve sloupci, jehož název je parametrem za klíčovým slovem GROUP BY. Nad takto utvořenými podmnožinami se následně aplikují agregační funkce specifikované v klauzuli SELECT.
  • HAVING je volitelná klauzule, která však závisí na klauzuli GROUP BY. Svou funkcí je klauzule HAVING podobná WHERE. Slouží však k filtrování dat rozdělených do podmnožin pomocí GROUP BY.

SQL příkaz SELECT vrací množinu záznamů z jedné a nebo více tabulek.

SyntaxeEditovat

  SELECT
   [ALL | DISTINCT]
   {[tabulka. | alias. | pohled.]{* | sloupec | sloupec AS alias}
   | AVG([tabulka. | alias. | pohled.]<sloupec>) [AS <alias>]
   | MIN([tabulka. | alias. | pohled.]<sloupec>) [AS <alias>]
   | MAX([tabulka. | alias. | pohled.]<sloupec>) [AS <alias>]
   | COUNT([tabulka. | alias. | pohled.]<* | sloupec>) [AS <alias>]
   }[,...n]
   
   [INTO jméno_nové_tabulky]
   
   FROM <tabulka> [AS <alias>][,... n]
   
   [[INNER | FULL] JOIN <tabulka> ON <spojovaci podminka>
   | <LEFT | RIGHT> OUTER JOIN <tabulka> ON <spojovaci podminka>
   | CROSS JOIN <sloupce>
   [AS <alias>] 
   [,... n]]
   
   [WHERE <podmínky>
    | <sloupec> <operator> <sloupec | hodnota> 
    | <sloupec> <operator> <sloupec | hodnota> <AND | OR | NOT> <sloupec> <operator> <sloupec | hodnota> 
    | <sloupec> BETWEEN <hodnota> AND <hodnota>
    | <sloupec> LIKE <regularni vyraz>
    | <sloupec> IN <vycet hodnot>
    | <sloupec | vyraz> <operator> ANY | SOME (poddotaz)
    | EXISTS (poddotaz)]

   [GROUP BY <nazev sloupce>[,... n]] [HAVING <omezujici podminka postavena na vysledcich klauzule GROUP BY>]

   [ORDER BY <sloupec>[,... n] [ASC | DESC]]

[UNION <SELECT dotaz>]

Míra implementace SQL dotazů se liší u každého SŘBD, proto je třeba mít při psaní konkrétních dotazů na zřeteli konkrétní SŘDB, na kterém bude dotaz prováděn. Bližší informace naleznete v referenčních manuálech.

PříkladEditovat

 SELECT id, zakaznik, cena FROM smlouvy WHERE cena>10000 AND se_slevou=1 ORDER BY cena DESC

Další vlastnostiEditovat

DISTINCTEditovat

Klíčové slovo DISTINCT (někdy používáno DISTINCTROW) z výpisu odstraní záznamy, které se v dané hodnotě pole opakují. Výsledkem pro daný sloupec bude seznam všech hodnot (vyhovující případné podmínce výpisu); každé zastoupené jen jednou. SELECT s DISTINCT vypisuje z logických důvodů většinou jen jedno pole.

Omezení počtu zobrazených řádkůEditovat

Databázové stroje většinou umožňují pomocí nějakého klíčového slova v SQL omezit počet vybraných řádků na určitou hodnotu.

SELECT TOP 10 jmeno_skladby FROM zebricek_skladeb ORDER BY poslouchanost;
  • Např. MySQL, PostgreSQL mají klauzuli LIMIT, která kromě maximálního počtu zobrazených řádků umožňuje určit i od jakého místa (ofsetu) z výsledných řádků dotazu (pomyslného celkového výběru) má vracení výsledku začít. Například dotaz
SELECT jmeno_skladby FROM zebricek_skladeb ORDER BY poslouchanost LIMIT 5,10;

by zobrazil záznamy na 6. až 15. místě.

  • Konkrétně MySQL navíc podporuje klíčové slovo SQL_CALC_FOUND_ROWS (není součástí žádného SQL standardu), které se umisťuje za SELECT a způsobí, že databázový stroj si i přes omezení dané klíčovým slovem LIMIT ve výběrovém dotazu uloží celkový počet záznamů splňujících podmínku v klauzuli WHERE (pokud je zadaná) a ten pak může poslat jako výsledek dotazu:
SELECT FOUND_ROWS()

Výhodou je, že pro zjištění celkového počtu řádků nemusí být spouštěn další dotaz.

Externí odkazyEditovat