SQL – příkaz SELECT 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
SELECT – ukázky syntaxe Výpis všech polí z tabulky, která se jmenuje Customers: SELECT * from Customers; Výpis vybraných polí z tabulky, která se jmenuje Customers: SELECT výčet_polí FROM tabulka; Výpis slopuců Company a Country z tabulky, která se jmenuje Customers, kde platí podmínka: SELECT Company, Country FROM Customers WHERE Country <> 'USA' ;
SELECT Výpis všech sloupců z tabulky SELECT * FROM Table Výpis z tabuky Table1 je spojen s výpisem z Table2 SELECT col1, col2 FROM Table1 UNION SELECT col1, col2 FROM Table2 Totéž včetně duplicit UNION ALL Výsledkem dotazu je rozdíl (tj. data, která jsou v Table1 a zároveň nejsou v Table2 EXCEPT Průnik INTERSECT Kartézský součin SELECT * FROM Table1 CROSS JOIN Table2 Projekce SELECT DISTINCT col1 FROM Table1
SELECT SELECT Výpis dat z tabulky FROM Seznam tabulek WHERE Predikát určující podmínku výběru (filtr dat) ORDER BY Způsob setřídění výsledných dat GROUP BY Agregační funkce (seskupení dat) HAVING Podmínka pro seskupení dat
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'
Příklad: Inner join Inner join vrátí pouze záznamy, pro které existuje Outer join vrátí všechny záznamy zprava (right) nebo zleva (left) bez ohledu na existenci záznamů v spojované tabulce Příklad inner join: SELECT column_name(s) FROM table_name1 INNER JOIN table_name2 ON table_name1.column_name=table_name2.column_name
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;