SQL – základní pojmy Ing. Roman Danel, Ph.D. roman.danel@vsb.cz Institut ekonomiky a systémů řízení Hornicko–geologická fakulta
Přehled pojmů Projekce - FROM Restrikce - WHERE Kartézský součin Spojování tabulek – JOIN DISTINCT – jedinečné hodnoty UNION – sjednocení dotazů EXCEPT – rozdíl dotazů INTERSECT – průnik dotazů Řazení výsledků – ORDER BY Seskupování – GROUP BY, filtr HAVING NULL Vnořené dotazy
Projekce Výpis části tabulky – seznam sloupců v příkazu SELECT select jmeno, prijmeni from SEZNAM
Restrikce Omezení množiny řádků na základě podmínky – predikát WHERE Podmínky lze kombinovat pomocí logických spojek select jmeno, prijmeni from SEZNAM where PRIJMENI = ‚Turek‘
Kartézský součin V dotazu můžeme za slovo FROM uvést více názvů tabulek. Dosáhneme tím tzv. kartézského součinu. Získáme množinu obsahující všechny kombinace záznamů Nežádoucí jev – měla by být restrikce - WHERE! select * from SEZNAM, PREDMETY
Spojování tabulek - JOIN umožňuje oddělit dva druhy podmínek – jedny slouží k propojení tabulek (za JOIN … ON) a druhé k restrikci (za WHERE). Pomocí slova AS určíme aliasy tabulek select JMENO, PRIJMENI, NAZEV_PREDMET, ZNAMKA from SEZNAM left join VYSLEDKY on SEZNAM.ID_SEZNAM = VYSLEDKY.ID_SEZNAM left join PREDMETY on PREDMETY.ID_PREDMET = VYSLEDKY.ID_PREDMET where SEZNAM.PRIJMENI = 'Turek'
Distinct – jedinečné hodnoty select prijmeni from SEZNAM select DISTINCT prijmeni from SEZNAM
Union – sjednocení dotazů Sjednocená množina ze dvou tabulek Záznamy musí být stejného datového typu SELECT jmeno, prijmeni FROM osobni_kontakty UNION FROM autori;
EXCEPT – rozdíl dotazů Seznam osob, které jsou v autorech, ale nejsou v osobních kontaktech SRBD Oracle – „MINUS“ SELECT jmeno, prijmeni FROM autor EXCEPT FROM osobni_kontakty ORDER BY prijmeni
INTERSECT – průnik dotazů Seznam osob, které jsou autorem a zároveň i osobou v našich kontaktech SELECT jmeno, prijmeni FROM autor INTERSECT FROM osobni_kontakty ORDER BY prijmeni
Řazení výsledků Ascending – vzestupně (od 0 do 9, od A do Z…) Descending – sestupně (Z-A, 9-0) select jmeno, prijmeni from SEZNAM order by PRIJMENI [ascending / descending]
Seskupování – GROUP BY Seskupení dle podmínky v GROUP BY Ve výčtu polí lze uvést pouze pole z GROUP BY nebo agregační funkce (count, sum, min, max…) Select prijmeni, count(*) from SEZNAM group by PRIJMENI
Seskupování – agregační funkce Count Sum Min Max Avg (= average)
Seskupování – filtrování Klauzule HAVING Select prijmeni, count(*) from SEZNAM group by PRIJMENI HAVING count(*) > 1
NULL hodnoty Hodnota není určena Nelze porovnávat pomocí operátorů: =, >, < IS NULL, IS NOT NULL
Vnořené dotazy Zanořený dotaz Lze i na místě sloupce SELECT max(pocet), min(pocet), avg(pocet) FROM ( SELECT count(k.id) AS pocet FROM autor AS a LEFT JOIN kniha AS k ON (a.id = k.autor) GROUP BY a.id ) AS knihy;