Cvičení předmětu KIV/DBM1
12. cvičení, cvičící: Ing. Tomáš Kotouč
Úvod do SQL
Podoba cvičné databáze před začátkem cvičení a po ukončení cvičení.
- Nyní si budeme procvičovat SQL. Celé SQL omezíme na příkaz SELECT
- V naší cvičné databázi máme k dispozici dvě tabulky DODAVATELE a ODBERATELE.
![](dod_01.jpg)
![](odb_01.jpg)
- Nyní budeme nad těmato tabulkami vytvářet různé dotazy.
- Zobrazení celé tabulky:
- Dotazy - Nový - Nový dotaz - žádná tabulka - Zavřít - ikona SQL.
- Napsat příkaz SELECT * FROM dodavatele;.
- Uložíme jako d_vse. Spustíme.
- Zobrazí se všechny záznamy a všechny sloupce tabulky DODAVATELE.
- Zobrazení jen některých sloupců:
- Dotazy - Nový - Nový dotaz - žádná tabulka - Zavřít - ikona SQL.
- Napsat příkaz SELECT ICO, nazev FROM dodavatele;.
- Uložíme jako d_dva_sloupce. Spustíme.
- Zobrazí se všechny záznamy ale jen dva sloupce tabulky DODAVATELE.
- Eliminace redundantních záznamů:
- Dotazy - Nový - Nový dotaz - žádná tabulka - Zavřít - ikona SQL.
- Napsat příkaz SELECT DISTINCT pravni_norma FROM dodavatele;.
- Uložíme jako d_distinct. Spustíme.
- Zobrazí se jen jeden sloupec a každá hodnota bude zobrazena pouze jednou, přestože v tabulce DODAVATELE jsou uvedeny dvě "s.r.o.".
- Odvozené sloupce:
- Dotazy - Nový - Nový dotaz - žádná tabulka - Zavřít - ikona SQL.
- Napsat příkaz SELECT ICO, nazev, uredniku+delniku AS zamestnancu FROM dodavatele;.
- Uložíme jako d_odvozene_sloupce. Spustíme.
- Zobrazí se všechny záznamy. Systém sečte počet UREDNIKU a počet DELNIKU a tento sloupec nazve ZAMESTNANCU.
- Jenoduchá podmínka:
- Dotazy - Nový - Nový dotaz - žádná tabulka - Zavřít - ikona SQL.
- Napsat příkaz SELECT ICO, nazev, uredniku+delniku AS zamestnancu FROM dodavatele WHERE uredniku+delniku > 15;.
- Uložíme jako d_podminka_jednoducha. Spustíme.
- Zobrazí se jen ty záznamy, u kterých je součet poctu UREDNIKU a počtu DELNIKU větší než 15. To mají jen dvě firmy.
- Složená podmínka:
- Dotazy - Nový - Nový dotaz - žádná tabulka - Zavřít - ikona SQL.
- Napsat příkaz SELECT ICO, nazev, uredniku+delniku AS zamestnancu FROM dodavatele WHERE uredniku > 5 AND uredniku < 15;.
- Uložíme jako d_podminka_slozena. Spustíme.
- Zobrazí se jen ty záznamy, u kterých je počet UREDNIKU větší než 5 a zároveň menší než 15. To má jen jedna firma.
- Kontrola položky na výskyt v množině:
- Používáme, když chceme vybrat jen ty záznamy, kde nějaká položka se má rovnat nějaké hodnotě nebo jiné hodnotě = obecně jedné hodnotě z určité množiny hodnot.
- Dotazy - Nový - Nový dotaz - žádná tabulka - Zavřít - ikona SQL.
- Napsat příkaz SELECT ICO, nazev, pravni_norma FROM dodavatele WHERE pravni_norma IN ('s.r.o.', 'a.s.');.
- Uložíme jako d_podminka_IN. Spustíme.
- Zobrazí se jen ty záznamy tabulky DODAVATELE, kde PRAVNI_NORMA je buď "s.r.o." neno "a.s.", tedy tři firmy.
- Vyhledávání v části řetězce:
- Dotazy - Nový - Nový dotaz - žádná tabulka - Zavřít - ikona SQL.
- Napsat příkaz SELECT ICO, nazev, adresa FROM dodavatele WHERE adresa LIKE '*Plzeň*';.
- Uložíme jako d_podminka_LIKE. Spustíme.
- Zobrazí se jen ty záznamy, kde na začátku, u prostřed nebo na konci adresy je uvedeno slovo "Plzeň". Znak "*" se používá snad jen v Accessu, v ostatních relačních databázích se používá znak "%".
- Kontrola na prázdnou hodnotu položky:
- Dotazy - Nový - Nový dotaz - žádná tabulka - Zavřít - ikona SQL.
- Napsat příkaz SELECT ICO, nazev, bank_konto FROM dodavatele WHERE bank_konto IS NOT NULL;.
- Uložíme jako d_podminka_NULL. Spustíme.
- Zobrazí se jen ty záznamy, kde je položka BANK_KONTO vyplněna.
- Třídění záznamů:
- Dotazy - Nový - Nový dotaz - žádná tabulka - Zavřít - ikona SQL.
- Napsat příkaz SELECT ICO, nazev, pravni_norma FROM dodavatele ORDER BY pravni_norma, nazev DESC;.
- Uložíme jako d_trideni. Spustíme.
- Zobrazí se všechny záznamy setříděné nejprve podle položky PRAVNI_NORMA vzestupně a v rámci stejné hodnoty právní normy setřídí podle položky NAZEV sestupně.
- Počet záznamů:
- Dotazy - Nový - Nový dotaz - žádná tabulka - Zavřít - ikona SQL.
- Napsat příkaz SELECT pravni_norma, count(*) AS pocet FROM dodavatele GROUP BY pravni_norma;.
- Uložíme jako d_count. Spustíme.
- Pro každou právní normu spočte, kolik tabulka DODAVATELE obsahuje záznamů. Klauzuli GROUP BY tedy používáme, když chceme seskupit (spočítat = COUNT, sečíst = SUM, vypočítat průměr = AVG, zjistit nejmenší = MIN, zjistit největší = MAX) hodnoty za nejakou či nějaké položky. Tyto položky uvedeme za kluzuli GROUP BY. Za klauzuli SELECT musí být uvedeny všechny položky uvedené za klauzulí GROUP BY a mimo ně tam mohou být jen agregované funkce (COUNT, SUM, AVG, MIN, MAX).
- Agregace dat (součet, průměr, minimum, maximum):
- Dotazy - Nový - Nový dotaz - žádná tabulka - Zavřít - ikona SQL.
- Napsat příkaz SELECT SUM(uredniku+delniku) AS soucet, AVG(uredniku+delniku) AS prumer, MIN(uredniku+delniku) AS minimum, MAX(uredniku+delniku) AS maximum FROM dodavatele;.
- Uložíme jako d_agregace. Spustíme.
- Zobrazí se součet, průměr minimum a maximum počtu UREDNIKU plus počet DELNIKU. Zobrazí se jen jedna řádka, za nic neseskupujeme, tedy zde nemáme uvedenou ani klauzuli GROUP BY.
- Dotaz nad více tabulkami:
- Dotazy - Nový - Nový dotaz - žádná tabulka - Zavřít - ikona SQL.
- Napsat příkaz SELECT A.ICO, A.nazev, A.pravni_norma, B.nazev AS pravni_norma_nazev FROM dodavatele AS A, pravni_normy AS B WHERE A.pravni_norma = B.ID;.
- Uložíme jako d_vice_dotazu. Spustíme.
- U každého záznamu z tabulky DODAVATELE ukáže i název právní normy. Pokud bychom nepoužili aliasy A a B, museli bychom před jednotlivé položky psát název celé tabulky nebo alespoň před položky NAZEV, protože tato položka se vyskytuje v obou tabulkách a tak by systém jinak nevěděl, kterou myslíme. V podmínce je uvedenou přes které atribyty jsou tabulky spojeny.
- Spojení dvou dotazů:
- Dotazy - Nový - Nový dotaz - žádná tabulka - Zavřít - ikona SQL.
- Napsat příkaz SELECT ICO, nazev, adresa FROM dodavatele UNION SELECT ICO, popis, adresa FROM odberatele;.
- Uložíme jako do_union. Spustíme.
- Zobrazí se všechny záznamy z tabulky DODAVATELE a všechny záznamy z tabulky ODBERATELE. Pokud se zde některé záznamy vyskytují vícekrát, zobrazí se jen jednou. Výpis bude setříděn. Všimněte si, že na druhém místě máme jednou položku NAZEV a jednou POPIS = na názvu položky nezáleží, záleží na tom, aby oba selecty měli stejný počet atributů a na stejné pozici byli atributy stejného typu.
- Rozdíl obsahu dvou dotazů:
- Dotazy - Nový - Nový dotaz - žádná tabulka - Zavřít - ikona SQL.
- Napsat příkaz SELECT ICO, nazev, adresa FROM dodavatele WHERE ICO NOT IN (SELECT ICO FROM odberatele);.
- Uložíme jako do_minus. Spustíme.
- Zobrazí se všechny záznamy z tabulky DODAVATELE, ktere se nenachází (není shodné IČO) v tabulce ODBERATELE. Výpis bude setříděn.
- V ostatních relačních databázích by se tento příkaz napsal stejně jako UNION, jen by se použila klauzule MINUS.
- Průnik obsahu dvou dotazů:
- Dotazy - Nový - Nový dotaz - žádná tabulka - Zavřít - ikona SQL.
- Napsat příkaz SELECT ICO, nazev, adresa FROM dodavatele WHERE ICO IN (SELECT ICO FROM odberatele);.
- Uložíme jako do_prunik. Spustíme.
- Zobrazí se všechny záznamy z tabulky DODAVATELE, které se zároveň nachází (je shodné IČO) v tabulce ODBERATELE. Výpis bude setříděn.
- V ostatních relačních databázích by se tento příkaz napsal stejně jako UNION, jen by se použila klauzule INTERSECT.
- Toto je na úvod SQL vše.
- Konzultace k semestrálním pracem.
- Odevzdávání semestrálních prací.
Pokud najdete nějaké nesrovnalosti, zašlete je, prosím, na e-mailovou adresu kotouc@civ.zcu.cz.