Fakulta elektrotechniky a informatiky jiri.zechmeister@upce.cz Databázové systémy I Přednáška č. 6 Ing. Jiří Zechmeister Fakulta elektrotechniky a informatiky jiri.zechmeister@upce.cz
Databázové systémy 1 - př. 6 Obsah Příkaz SELECT Vnitřní, vnější spojování tabulek Operátory, výrazy, podmínky Databázové systémy 1 - př. 6
Syntaxe příkazu SELECT 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 kritérií třídění>] Databázové systémy 1 - př. 6
Syntaxe příkazu SELECT <seznam výstupních sloupců> =[ALL|DISTINCT|DISTINCTROW] { * | <specifikace sloupce1> [, <specifikace sloupce2> [, …]] } <specifikace sloupce> = { <název sloupce> | < specifikace tabulky > . <název sloupce> | < specifikace tabulky > . * | výraz} [[AS] <pojmenování sloupce> ] < specifikace tabulky > = { <název tabulky> | <pojmenování tabulky> | <název pohledu> } [<pojmenování tabulky>] Databázové systémy 1 - př. 6
Syntaxe příkazu SELECT DISTINCT - ve výsledku nebudou duplicitní řádky, které mají stejné hodnoty ve vypisovaných sloupcích DISTINCTROW - ve výsledku nebudou duplicitní řádky, které mají stejné hodnoty ve všech sloupcích bez ohledu na to, zda jsou vypisovány ALL – ve výsledku budou všechny řádky bez ohledu na duplicity, defaultní nastavení Databázové systémy 1 - př. 6
Databázové systémy 1 - př. 6 SELECT - příklady Příklad: SELECT * FROM dodavatele WHERE mesto = 'Praha 4'; SELECT dodavatel_id, nazev, zastoupeni WHERE dodavatel_id > 4; Databázové systémy 1 - př. 6
Databázové systémy 1 - př. 6 Druhy spojení Spojení (join): spojení založené na libovolném typu vztahu mezi hodnotami propojovacích položek Ekvivalentní spojení (equi-join): spojení založené na shodě hodnot v propojovacích položkách Spojení nerovností (non-equi-join): spojení založené na nerovnosti hodnot v propojovacích položkách Databázové systémy 1 - př. 6
Databázové systémy 1 - př. 6 Druhy spojení Vnitřní spojení (inner join, exkluzivní spojení): spojení, v němž jsou záznamy ze dvou tabulek kombinovány a přidávány k výsledkům dotazu pouze tehdy, když k záznamům z první tabulky existují odpovídající záznamy v tabulce druhé Vnější spojení (outer join, inkluzivní spojení): spojení, kdy je každý odpovídající záznam ze dvou tabulek kombinován do jednoho záznamu ve výsledku dotazu. Není-li k záznamu z tabulky, která poskytuje všechny své záznamy, nalezen odpovídající záznam ve druhé tabulce, je přesto zahrnut do výsledků dotazu s prázdnými poli v místech, kde nebyl nalezen odpovídající záznam ve druhé tabulce. Databázové systémy 1 - př. 6
Databázové systémy 1 - př. 6 Druhy spojení Samospojení (self–join, recursive join): spojení, v němž jsou záznamy z tabulky kombinovány s jinými záznamy z téže tabulky Kartézský součin (cartesian product-join): Spojení bez podmínek. Záznamy z tabulek jsou kombinovány stylem každý s každým. Výsledná množina obsahuje MxN záznamů. Varianta kartézského součinu od Oracle je cross-join. Přirozené spojení (natural-join): Spojení, kde si systém sám najde nejvhodnější sloupce, přes které bude spojovat Databázové systémy 1 - př. 6
Spojení tabulek – syntaxe SELECT Základní syntaxe pro vnitřní spojení <seznam tabulek> = < specifikace tabulky1> JOIN < specifikace tabulky2> ON < podmínky spojení> [ JOIN < specifikace tabulky3> ON < podmínky spojení> [, … ] ] Příklad SELECT dodavatele.nazev, produkty.oznaceni FROM dodavatele JOIN produkty ON dodavatele.dodavatel_id = produkty.dodavatel_id; Databázové systémy 1 - př. 6
Spojení tabulek – syntaxe SELECT Vnitřní spojení – varianta 2. <seznam tabulek> =[ < specifikace tabulky1> [, <specifikace tabulky2> [, …]] } Sloupce, přes které se realizuje spojení se uvádějí v podmínce za klíčovým slovem WHERE <podmínky spojení> . Příklad SELECT dodavatele.nazev, produkty.oznaceni FROM dodavatele, produkty WHERE dodavatele.dodavatel_id = produkty.dodavatel_id; Databázové systémy 1 - př. 6
Spojení tabulek – syntaxe SELECT Vnitřní spojení INNER INNER JOIN, JOIN Do výsledku budou zahrnuty pouze ty řádky, pro které byla nalezena odpovídající hodnota v druhé tabulce. Vnější spojení OUTER Ve výsledku budou i ty řádky, pro které nebyly nalezeny odpovídající hodnoty v druhé tabulce. Pravé (RIGHT JOIN, RIGHT OUTER JOIN) .. Ve výsledku budou všechny řádky z pravé (druhé tabulky). Nebyl-li nalezen aspoň jeden odpovídající řádek v levé tabulce, budou ve výsledku hodnoty NULL ve všech sloupcích z první tabulky. Levé (LEFT JOIN, LEFT OUTER JOIN) .. Ve výsledku budou všechny řádky z levé (první tabulky). Nebyl-li nalezen aspoň jeden odpovídající řádek v pravé tabulce, budou ve výsledku hodnoty NULL ve všech sloupcích z druhé tabulky. Úplné (FULL JOIN) .. Ve výsledku budou všechny řádky z levé i pravé (první i druhé tabulky). Databázové systémy 1 - př. 6
Spojení tabulek – syntaxe SELECT Vnější spojení – syntaxe podle Oracle Nepoužívá se klíčové slovo JOIN, spojení probíhá přes klazuli WHERE Tabulky, které NEBUDOU obsaženy ve výsledku celé, jsou v podmínkách označeny jako symbolem (+) Příklad SELECT * FROM a_hr.zamestnanci, a_hr.oddeleni WHERE zamestnanci.oddeleni_id=oddeleni.oddeleni_id(+); -- odpovídá dotazu SELECT * FROM a_hr.zamestnanci LEFT JOIN a_hr.oddeleni ON zamestnanci.oddeleni_id=oddeleni.oddeleni_id; Databázové systémy 1 - př. 6
Spojení tabulek – syntaxe SELECT Obecný zápis syntaxe pro různé druhy spojení <seznam tabulek> = < specifikace tabulky1> [ { INNER | { LEFT | RIGHT | FULL } [OUTER] }] JOIN < specifikace tabulky2> ON < podmínky spojení> [ { INNER | { LEFT | RIGHT | FULL } [OUTER] }] JOIN < specifikace tabulky3> ON < podmínky spojení> [, … ] ] ] Příklad SELECT dodavatele.nazev, produkty.oznaceni FROM dodavatele JOIN produkty ON dodavatele.dodavatel_id = produkty.dodavatel_id; Databázové systémy 1 - př. 6
Spojení tabulek – syntaxe SELECT Kartézský součin SELECT dodavatele.nazev, produkty.oznaceni FROM dodavatele, produkty Oracle Cross Join SELECT dodavatele.nazev, produkty.oznaceni FROM dodavatele CROSS JOIN produkty Databázové systémy 1 - př. 6
Databázové systémy 1 - př. 6 Spojení tabulek A_OBCHOD SCHÉMA Příklad: SQL> DESC Produkty Name Null? Type ---------------------- -------- ----------------- Produkt_ID NOT NULL NUMBER(8) Oznaceni NOT NULL VARCHAR(30) Dodavatel_ID NUMBER(4) … SQL> SELECT * FROM Produkty; PRODUKT_ID DODAVATEL_ID OZNACENI 6 2 A600N 7 A2500H 8 A8JN-4P019M 9 3 Lifebook S2110 17 null Star new DODAVATEL_ID NAZEV 2 Asus 3 Fujitsu Siemens 8 UMAX 9 VBI SQL> DESC Dodavatele Name Null? Type ----------------------------- -------- ----------------- Dodavatel_ID NOT NULL NUMBER(4) Nazev NOT NULL VARCHAR2(100) SQL> SELECT * FROM Dodavatele; Databázové systémy 1 - př. 6
Spojení tabulek – příklady A_OBCHOD SCHÉMA Příklad - vnitřní spojení SQL> SELECT Produkty.produkt_id, Dodavatele.Nazev FROM Produkty, Dodavatele WHERE dodavatele.dodavatel_id = produkty.dodavatel_id; Produkt_Id Nazev 8 Asus 7 6 9 Fujitsu Siemens Databázové systémy 1 - př. 6
Spojení tabulek – příklady A_OBCHOD SCHÉMA Příklad - vnitřní spojení s klauzulí JOIN SQL> SELECT Produkty.produkt_id, Dodavatele.Nazev FROM Produkty INNER JOIN Dodavatele ON dodavatele.dodavatel_id = produkty.dodavatel_id; Produkt_Id Nazev 8 Asus 7 6 9 Fujitsu Siemens Databázové systémy 1 - př. 6
Spojení tabulek – příklady A_OBCHOD SCHÉMA Příklad - levé vnější spojení SQL> SELECT Produkty.produkt_id, Dodavatele.Nazev FROM Produkty LEFT OUTER JOIN Dodavatele ON dodavatele.dodavatel_id = produkty.dodavatel_id; Produkt_Id Nazev 8 Asus 7 6 9 Fujitsu Siemens 17 null Databázové systémy 1 - př. 6
Spojení tabulek – příklady A_OBCHOD SCHÉMA Příklad - pravé vnější spojení SQL> SELECT Produkty.produkt_id, Dodavatele.Nazev FROM Produkty RIGHT OUTER JOIN Dodavatele ON dodavatele.dodavatel_id = produkty.dodavatel_id; Produkt_Id Nazev 6 Asus 7 8 9 Fujitsu Siemens null UMAX VBI Databázové systémy 1 - př. 6
Spojení tabulek – příklady A_OBCHOD SCHÉMA Příklad - úplné vnější spojení SQL> SELECT Produkty.produkt_id, Dodavatele.Nazev FROM Produkty FULL OUTER JOIN Dodavatele ON dodavatele.dodavatel_id = produkty.dodavatel_id; Produkt_Id Nazev 8 Asus 7 6 9 Fujitsu Siemens 17 null UMAX VBI Databázové systémy 1 - př. 6
Spojení tabulek – příklady Příklady využití vnějších spojení: Zobrazení všech dodavatelů, tedy i těch, kteří nedodávají žádný výrobek Zobrazení všech výrobků, tedy i těch, které nejsou přiřazeny žádnému dodavateli S využitím agregačních funkcí zobrazení počtu výrobků, které dodávají jednotliví dodavatelé (s vnějším spojením se zobrazí i hodnoty 0 u těch dodavatelů, kteří žádný výrobek nedodávají, v případě vnitřního spojení ve výsledku nebudou vůbec zahnuti) Databázové systémy 1 - př. 6
Řazení řádků ve výsledku SELECT 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 kritérií třídění>] <seznam kritérií třídění>= <kritérium třídění 1> [<kritérium třídění 2> [, …]] <kritérium třídění>= {<výraz> | <specifikace sloupce> | <pořadí sloupce>} } [{ ASC | DESC }] Ve výsledku budou řádky seřazeny dle požadavků uvedených za klauzulí ORDER BY: ASC .. Vzestupně DESC .. Sestupně Databázové systémy 1 - př. 6
Řazení řádků ve výsledku SELECT A_OBCHOD SCHÉMA SELECT nazev FROM dodavatele WHERE mesto <> 'Ostrava' ORDER BY nazev DESC; SELECT nazev, mesto FROM dodavatele WHERE mesto <> 'Ostrava' ORDER BY 2 ASC, 1 DESC; SELECT mesto, zastoupeni FROM dodavatele WHERE nazev <> ' IBM' ORDER BY mesto ASC, zastoupeni DESC ; Databázové systémy 1 - př. 6
Aritmetické operátory Umožňují na základě původních hodnot vypočítat hodnoty nové. Sčítání + (unární i binární) Odčítání - (unární i binární) Násobení * Dělení / Priorita Nejprve se vyhodnocují části výrazu uzavřené v závorkách Násobení a dělení mají přednost před sčítáním a odečítáním Operátory se stejnou prioritou se vyhodnocují zleva doprava Databázové systémy 1 - př. 6
Databázové systémy 1 - př. 6 Operátor zřetězení Umožňuje spojovat hodnoty ze sloupců a znakové řetězce Zřetězení || Příklad SELECT nazev, mesto || ' ' || zastoupeni AS pobocka FROM dodavatele; Databázové systémy 1 - př. 6
Operátory pro porovnávání = rovnost <> nerovnost < menší než > větší než <= menší nebo rovno >= větší nebo rovno Databázové systémy 1 - př. 6
Operátory pro porovnávání [NOT] BETWEEN x AND y [není] větší nebo rovno x a menší nebo rovno y [NOT] IN [ne] patří do množiny ANY, SOME porovnání hodnoty s každou hodnotou v seznamu nebo řádkem vnořeného dotazu, musí být doplněn jedním z operátorů =, <,>, <=, >=. Výraz je pravdivý, pokud je pravdivý alespoň pro JEDNU položku seznamu. ALL porovnání hodnoty s každou hodnotou v seznamu nebo řádkem vnořeného dotazu, musí být doplněn jedním z operátorů =, <,>, <=, >=. Výraz je pravdivý, pokud je pravdivý pro VŠECHNY položky seznamu. Databázové systémy 1 - př. 6
Operátory pro porovnávání [NOT] EXISTS ve vnořeném dotazu je vrácen alespoň jeden řádek IS [NOT] NULL test na [ne] rovnost NULL X [NOT] LIKE y porovnání řetězce s maskou obsahující zástupné znaky _ právě jeden libovolný znak % nula nebo více libovolných znaků Databázové systémy 1 - př. 6
Operátory pro porovnávání A_OBCHOD SCHÉMA Příklady SELECT oznaceni FROM produkty WHERE cena BETWEEN 20000 AND 30000 SELECT Produkty.oznaceni FROM Produkty, Dodavatele WHERE dodavatele.dodavatel_id = produkty.dodavatel_id AND dodavatel.nazev IN (‘UMAX’, ‘Asus’) WHERE cena = ANY (20000, 30000, 25000, 35000) WHERE cena>= ALL (SELECT cena FROM produkty) Databázové systémy 1 - př. 6
Databázové systémy 1 - př. 6 SELECT …. LIKE A_OBCHOD SCHÉMA LIKE umožňuje využití zástupných znaků při definici podmínek za WHERE v SQL příkazech jako select, insert, update, delete. % nahrazuje libovolný řetězec libovolné délky (i nulové délky) _ nahrazuje libovolný jeden znak Příklady: SELECT * FROM dodavatele WHERE mesto LIKE '%ra%'; SELECT * FROM dodavatele WHERE mesto NOT LIKE 'Pha%'; SELECT * FROM produkty WHERE oznaceni LIKE 'TravelMate 2__0'; Databázové systémy 1 - př. 6
Operátory pro porovnávání A_OBCHOD SCHÉMA Příklady SELECT oznaceni FROM produkty WHERE EXISTS (SELECT * FROM dodavatele WHERE dodavatele.dodavatel_id = produkty.dodavatel_id); SELECT nazev FROM dodavatele WHERE zastoupeni IS NULL; SELECT nazev, oznaceni FROM dodavatele, produkty WHERE dodavatele.dodavatel_id = produkty.dodavatel_id AND oznaceni LIKE 'VAIO%'; Databázové systémy 1 - př. 6
Databázové systémy 1 - př. 6 Prostor pro otázky a praktické ukázky Děkuji za pozornost Databázové systémy 1 - př. 6