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.
SELECT * FROM tab
Výsledkem takového příkazu je celá tabulka, tj. veškeré řádky a sloupce bez projekce a restrikce.
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.
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.
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.
SELECT * FROM mat ORDER BY cena
Výsledkem příkazu bude celá původní tabulka seřazena podle ceny.
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í.
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.
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.
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.
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.
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ů.
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
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í.