Procházet otázky :: SZZ na MFF UK

#

- Hlavní strana
- Okruhy
- Projít
- Stáhnout
- Co je potřeba
- Chci přispět
- Kredity

Hledat:

## Prohlížení státnicových textů

### Dotazy v SQL

Hlavním nástrojem dotazů v SQL je příkaz `SELECT`. Sdílí prvky relačního kalkulu i relační algebry - obsahuje práci se sloupci, kvantifikátory a agregační funkce z relačního kalkulu a další operace - projekce, selekce, spojení, množinové operace - z relační algebry. Na rozdíl od striktní formulace relačního modelu databáze povoluje duplikátní řádky a NULLové hodnoty atributů.

Netříděný dotaz v SQL sestává z:

- příkazu(ů) `SELECT` (hlavní logika dotazování), to obsahuje vždy
- může obsahovat i množinové operace nad výsledky příkazů `SELECT` - `UNION`, `INTERSECTION` ...

Výsledky nemají definované uspořádání (resp. jejich pořadí je určeno implementací vyhodnocení dotazu).

Příkaz `SELECT` vypadá následovně (tato verze už zahrnuje i třídění výsledků):

    SELECT [DISTINCT]
    výraz1 [[AS] c_alias1] [, ...]
    FROM
    zdroj1 [[AS] t_alias1] [, ...]
    [WHERE podmínka_ř]
    [GROUP BY výraz_g1 [, …]
    [HAVING podmínka_s]]
    [ORDER BY výraz_o1 [, …] ASC/DESC]

Kde

- výrazy mohou být sloupce, sloupce s agregačními funkcemi, výsledky dalších funkcí ...

  `výraz = <název sloupce>, <konstanta>,
  (DISTINCT) COUNT( <název sloupce> ),
  [DISTINCT] [ SUM | AVG ]( <výraz> ),
  [ MIN | MAX ]( <výraz> )`
  a navíc lze použít operátory .

- zdroje jsou tabulky nebo vnořené selecty
- výrazy i zdroje být přejmenovány pomocí `AS`, např. pro odkazování uvnitř dotazu nebo jména na výstupu (od SQL-92)
- podmínka je logická podmínka (spojovaná logickými spojkami `AND, OR`) na hodnoty dat ve zdrojích:

  `podmínka = <výraz> BETWEEN <x> AND <y>, <výraz> LIKE "%_ ... ",
  <výraz> IS [NOT] NULL,
  <výraz> > = <> <= < > [<výraz>/ ALL / ANY <dotaz>],
  <výraz> NOT IN [<seznam hodnot> / <dotaz>], EXIST ( <dotaz> )`

- `GROUP BY` znamená agregaci podle unikátních hodnot jmenovaných sloupců (v ostatních sloupcích vznikají množiny hodnot, které se spolu s oněmi unikátnímí vyskytují na stejných řádkách
- `HAVING` označuje podmínku na agregaci
- `ORDER BY` definuje, podle hodnot ve kterých sloupcích nebo podle kterých jiných výrazů nad nimi provedených se má výsledek setřídit (`ASC` požaduje vzestupné setřídění, `DESC` sestupné).

SQL nemá příkaz na omezení rozsahu na některé řádky (jako např. potřebuji jen 50.-100. řádek výpisu), a to lze řešit buď složitě standardně (počítání kolik hodnot je menších než vybraná, navíc náročné na hardware) nebo pomocí některého nepřenositelného rozšíření.

Pořadí vyhodnocování jednoho příkazu `SELECT` (nebereme v úvahu optimalizace):

1. Nejprve se zkombinují data ze všech zdrojů (tabulek, pohledů, poddotazů). Pokud jsou odděleny čárkami, provede se kartézský součin (to samé co `CROSS JOIN`), v SQL-92 a vyšším i složitější spojení - `JOIN ON` (vnitřní spojení podle podmínky), `NATURAL JOIN` (přirozené spojení podle stejných hodnot stejně pojmenovaných sloupců), `OUTER JOIN` (vnější spojení, do kterého jsou zahrnuty i záznamy, pro které v jednom ze zdrojů není nalezeno nic, co by odpovídalo podmínce, doplněnné NULLovými hodnotami) atd.
2. Vyřadí se vzniklé řádky, které nevyhovují podmínce (`WHERE`)
3. Zbylé řádky se seskupí do skupin se stejnými hodnotami uvedených výrazů (`HAVING`), každá skupina obsahuje atomické sloupce s hodnotami uvedených výrazů a množinové sloupce se skupinami ostatních hodnot sloupců.
4. Vyřadí se skupiny, nevyhovující podmínce (`HAVING`)
5. Výsledky se setřídí podle požadavků
6. Vygeneruje se výstup s požadovanými hodnotami
7. V případě `DISTINCT` se vyřadí duplicitní řádky

Poznámka

- Klauzule `GROUP BY` setřídí před vytvořením skupin všechny řádky dle výrazů v klauzuli. Proto by se měl seskupovat co nejmenší možný počet řádek. Pokud je možné řádky odfiltrovat pomocí WHERE, je výsledek efektivnější, než následné odstraňování celých skupin.
- Klauzule `DISTINCT` třídí výsledné záznamy (před operací ORDER BY), aby našla duplicitní záznamy. Pokud to jde, je vhodné se bez ní obejít.
- Klauzule `ORDER BY` by měla být použita jen v nutných případech. Není příliš vhodné ji používat v definicích pohledů, nad kterými se dále dělají další dotazy