602SQL-Úplná dokumentace Index  

Dotazový výraz (SQL)

dotazový_výraz ::= { dotazový_term | dotazový_výraz { UNION | EXCEPT } [ ALL ] 
    [ corresponding ] dotazový_term } [ třídění ] [ výběr ]
dotazový_term ::= specifikace_dotazu | dotazový_term INTERSECT [ ALL ] [ corresponding ] 
    specifikace_dotazu
corresponding ::= CORRESPONDING [ BY ( jméno_sloupce {, jméno_sloupce }… )]
třídění ::= ORDER BY výraz [ ASC | DESC ] {, výraz [ASC | DESC ] }… 
výběr ::= LIMIT [ offset , ] count

Dotazový výraz umožňuje povést nad výsledkem specifikace dotazu operace relační algebry UNION, INTERSECT a EXCEPT a výsledek setřídit a omezit.

Operace UNION znamená sjednocení množin záznamů, operace EXCEPT rozdíl, operace INTERSECT průnik. Pokud není uvedeno ALL, pak každý záznam bude ve výsledku nejvýše jednou. Uvedení ALL výrazně zrychluje vyhodnocení dotazu.

Oba operandy množinové operace musí mít stejný počet sloupců a typy odpovídajících si sloupců jsou stejné. V případě EXCEPT a INTERSECT se předpokládá, že v obou operandech existují stejné záznamy (které tvoří průnik nebo jsou vyloučeny z rozdílu).

Pomocí specifikace corresponding lze zadat množinu sloupců ve výsledku operace:

Výsledek dotazového výrazu se třídí podle hodnot výrazů, přičemž DESC znamená sestupné třídění, ASC nebo nic vzestupné. Pokud některý výraz má na dvou záznamech stejnou hodnotu, o pořadí záznamů rozhodné další výraz. Pokud je pro třídění použit index obsahující hodnoty NULL nebo není pro třídění použit index, jsou hodnoty NULL považovány za menší než všechny ostatní hodnoty. Pokud je pro třídění použit index neobsahující hodnoty NULL, do odpovědi se záznamy s NULL hodnotou výrazu nezahrnou.

Výrazy obsažené v klauzuli ORDER BY smějí obsahovat pouze jména sloupců specifikace dotazu (po případném přejmenování), nikoli jakákoliv jména sloupců z tabulek použitých v dotazovém výrazu (ale nepoužitých za SELECT ... ).

Z výsledku dotazového výrazu lze dále vybrat úsek záznamů pomocí klauzule LIMIT.

Rozšíření jazyka SQL proti normě

Odchylky od Intermediate level směrem k Full level nebo k SQL 3

Příklady použití:

Seznam firem, které již objednaly (mají alespoň jednu fakturu):

SELECT F.cislo_firmy,F.nazev
FROM Firmy F
WHERE EXISTS (
    SELECT * 
    FROM Fakt_hlav H
    WHERE F.cislo_firmy=H.cislo_firmy)

Seznam firem, které dosud neobjednaly:

SELECT F.cislo_firmy,F.nazev
FROM Firmy F
EXCEPT
SELECT F.cislo_firmy,F.nazev
FROM Firmy F
WHERE EXISTS (
    SELECT * 
    FROM Fakt_hlav H
    WHERE F.cislo_firmy=H.cislo_firmy)

Vybrat firmu s maximálním obratem:

SELECT SUM(Faktury.castka) AS suma,Firmy.nazev
FROM Firmy, Faktury
WHERE Faktury.firma=Firmy.cislo
GROUP BY Firmy.nazev
ORDER BY suma DESC
LIMIT 1

Viz