Jazyk SQL
Příkaz SELECT
 Tisk

Příkaz SELECT


Příkaz SELECT je základním a nejvíce využívaným příkazem jazyka SQL.


Nejdříve si ukážeme obecný tvar příkazu:


SELECT <seznam_výstupních_sloupců>

    FROM <seznam_tabulek>

    [WHERE<podmínka_řádku>]

    [GROUP BY<seznam_výrazů_seskupení>]

    [HAVING<podmínka_skupiny>]

    [{UNION|UNION ALL|INTERSECT|MINUS}<příkaz_select>]

    [ORDER BY<seznam_kriterií_řazení>]


Na první pohled se tento příkaz zdá být velmi složitý. Většina klausulí je ovšem nepovinná. Postupně si ukážeme jejich význam.


Nejjednodušší tvar


SELECT * FROM tab


Výsledkem takového příkazu je celá tabulka, tj. veškeré řádky a sloupce bez projekce a restrikce.

Podívejte se obrázek .


Jednoduchá projekce


SELECT číslo, jméno FROM mat


Výsledkem výběru z tabulky mat jsou pouze sloupce číslo a jméno, ostatní sloupce nejsou vybrány.

Podívejte se obrázek .


Jednoduchá restrikce


SELECT * FROM mat WHERE cena = 0


Výsledkem výběru z tabulky jsou pouze ty úplné řádky, kde je zadána nulová cena položky.

Podívejte se obrázek .


Kombinace jednoduché projekce a restrikce


SELECT číslo FROM mat WHERE cena < 1000


Výsledkem výběru z tabulky jsou pouze čísla materiálu (buňky tabulky), jehož cena je menší než 1000.

Podívejte se obrázek .

Řazení řádek na výstupu


SELECT * FROM mat ORDER BY cena


Výsledkem příkazu bude celá původní tabulka seřazena podle ceny.

Podívejte se obrázek .



Jednoduchá agregační informace za celou tabulku


SELECT COUNT(*), AVG(cena), MAX(dodací_množství), MIN(dodací množství) FROM mat


Výsledkem dotazu je počet řádek tabulky (COUNT), průměrné (AVG), maximální (MAX) a minimální (MIN) dodací množství.


Agregační informace za skupinu


SELECT číslo_dílu, COUNT(*), SUM(přípravný_čas) FROM operace GROUP BY číslo_dílu


Výsledkem dotazu je výběr z tabulky operací, zjištění, kolik operací má každý díl v postupu a jaký je součet přípravných časů pro každý díl.


Jednoduché spojení tabulek s restrikcí


SELECT díly.číslo_dílu, číslo_operace, počet_kusů, přípravný_čas, kusový čas,

             počet_kusů*kusový čas+přípravný_čas AS Výrobní_čas_operace

    FROM díly, operace

    WHERE díly.číslo_dílu = operace.číslo dílu


Nyní se vytvoří kartézský součin tabulek díly a operace, restrikční podmínkou je, že se číslo dílu v tabulce díly rovná číslu dílu v tabulce operací. Projekce omezuje vybrané sloupce. Navíc je v příkladu vytvořen nový sloupec a pomocí klíčového slova AS je vytvořen název tohoto nového sloupce.


Jednoduché testování skupin


SELECT číslo_dílu, COUNT(*) FROM operace

    GROUP BY číslo_dílu

    HAVING COUNT(*) > 5


Výsledkem dotazu je seznam dílů a počtů operací v postupu, které mají více než 5 operací v postupu.


Vnořený příkaz SELECT


SELECT Polozky.JmenoPolozky

    FROM Polozky

    WHERE ((Polozky.JmenoPolozky NOT IN (SELECT DISTINCT Operace.JmenoPolozky

                                                                        FROM Operace))

                   AND (Polozky.Vyrabena=True))


Výsledkem příkazu jsou jména vyráběných položek, které nemají v tabulce operací technologický postup. Klausule NOT IN znamená, že se prvek nenachází ve vybrané množině, klausule DISTINCT znamená, že se ve výběru mají vyloučit duplicity.


Výběr hodnoty s maximálním výskytem


Máme k dispozici tabulku obsahující informace o expedovaných balících válcovaného tyčového materiálu. Primárním indexem je číslo balíku. Pro každý záznam se eviduje číslo tavby, ze které byl materiál válcován.


Úkolem je nalézt číslo tavby, ze které bylo vyválcováno nejvíce balíků.


Řešení 1:


Vybrat čísla tavby, seskupit a seřadit sestupně podle počtu vyválcovaných balíků a z výsledku zobrazit jen první řádek:


SELECT TOP 1 cis_tavby, count(*) AS pocet

FROM baliky

GROUP BY cis_tavby

ORDER BY pocet desc


Řešení 2:


Použijeme příkazy SELECT vnořené v sobě.


Příkaz


SELECT cis_tavby, count(*) AS pocet

          FROM baliky

          GROUP BY cis_tavby)


vypočte pro každou tavbu, kolik balíků se z ní vyválcuje.


Příkaz


SELECT Max(pocet) FROM předchozí příkaz AS bbbb


vypočte maximání počet odválcovaných balíků.


Příkaz


SELECT něco1, něco2 from nějaká tabulka

    WHERE něco2 IN (nějaká množina)


vybere jen řádky v tabulce, kde sloupec něco2 je obsažen v této množině.


Spojením do jednoho příkazu obdržíme:


SELECT cis_tavby, pocet

FROM

     (SELECT cis_tavby, count(*) AS pocet

          FROM baliky

          GROUP BY cis_tavby) AS aaaa

WHERE pocet IN

       (SELECT max(pocet) FROM

          (SELECT cis_tavby, count(*) AS pocet

                FROM baliky

                GROUP BY cis_tavby) AS bbbb)


Což je hledané řešení.