Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Databázové systémy I Přednáška č. 7 Ing. Jiří Zechmeister Fakulta elektrotechniky a informatiky

Podobné prezentace


Prezentace na téma: "Databázové systémy I Přednáška č. 7 Ing. Jiří Zechmeister Fakulta elektrotechniky a informatiky"— Transkript prezentace:

1 Databázové systémy I Přednáška č. 7 Ing. Jiří Zechmeister Fakulta elektrotechniky a informatiky

2 Obsah – Vnitřní a vnější spojení tabulek Opakování Spojování více než 2 tabulek (SQL 92) Vlastní spojení – Alias – Logické operátory – Funkce Databázové systémy 1 - př. 7 2

3 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).. 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).. 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ř. 7 3

4 Spojení tabulek Příklad: Máme 4 tabulky popisující produkty, jejich dodavatele, lokální zastoupení v ČR a pobočky, v nichž mají tato zastoupení vlastní prodejny. PRODUKT_IDDODAVATEL_IDOZNACENICENA 62A600N A2500H A8JN-4P019M Lifebook S nullStar newnull DODAVATEL_IDZASTOUPENI_IDZASTOUPENI 330Fujitsu CR, a.s. 333Fujitsu Siemens Computers, s.r.o. 888UMAX Czech a.s. DODAVATEL_IDNAZEV 2Asus 3Fujitsu Siemens 8UMAX 9VBI POBOCKA_IDZASTOUPENI_IDMESTO 10130Stříbro 10230Karviná 10333Praha 10533Brno 10633Ostrava 10488Praha Zastoupeni Dodavatele Produkty Pobocky A_OBCHOD SCHÉMA Databázové systémy 1 - př. 7 4

5 Databázový model – schéma A_OBCHOD Databázové systémy 1 - př. 7 5

6 Spojení tabulek – příklady Zjistěte produkty a města, v nichž je lze přímo od oficiálního zastoupení dodavatele v ČR zakoupit. Varianta dle SQL92: SELECT DISTINCT Produkty.oznaceni, Pobocky.mesto FROM Produkty JOIN Zastoupeni ON produkty.dodavatel_id = zastoupeni.dodavatel_id JOIN Pobocky ON zastoupeni.zastoupeni_id = pobocky.zastoupeni_id; A_OBCHOD SCHÉMA Databázové systémy 1 - př. 7 6

7 Spojení tabulek – příklady Varianta dle SQL89: SELECT DISTINCT Produkty.oznaceni, Pobocky.mesto FROM Produkty, Zastoupeni, Pobocky WHERE produkty.dodavatel_id = zastoupeni.dodavatel_id AND zastoupeni.zastoupeni_id = pobocky.zastoupeni_id; A_OBCHOD SCHÉMA Databázové systémy 1 - př. 7 7 Zjistěte produkty a města, v nichž je lze přímo od oficiálního zastoupení dodavatele v ČR zakoupit.

8 Spojení tabulek – příklady Zjistěte názvy všech dodavatelů, kteří nemají v ČR oficiální zastoupení a doplňte názvy jejich produktů, které lze na trhu zakoupit (pokud nějaké dodávají). SELECT Dodavatele.nazev, Produkty.oznaceni FROM Dodavatele LEFT JOIN zastoupeni ON dodavatele.dodavatel_id = zastoupeni.dodavatel_id LEFT JOIN Produkty ON dodavatele.dodavatel_id = produkty.dodavatel_id WHERE zastoupeni.zastoupeni_id IS NULL; A_OBCHOD SCHÉMA Databázové systémy 1 - př. 7 8

9 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ř. 7 9

10 Logické operátory AND a zároveň (vrací ANO, pokud oba operandy jsou zároveň ANO) OR nebo (vrací ANO, pokud alespoň jeden operand je ANO) NOT není pravda, že (vrací ANO, když následující operand je NE) Databázové systémy 1 - př. 7 10

11 Pravdivostní tabulka AND Operand 1Operand 2Výsledek AND ANO NE ANONE ANONULL NENULLNE NULLANONULL NE NULL Databázové systémy 1 - př. 7 11

12 Pravdivostní tabulka OR Operand 1Operand 2Výsledek AND ANO NEANO NEANO NE ANONULLANO NENULL ANO NULLNENULL Databázové systémy 1 - př. 7 12

13 Pravdivostní tabulka NOT Operand 1Výsledek AND ANONE ANO NULL Databázové systémy 1 - př. 7 13

14 Logické operátory – příklady SELECT DISTINCT oznaceni, cena FROM Produkty WHERE cena > ; SELECT DISTINCT oznaceni, cena FROM Produkty WHERE cena IS NULL OR oznaceni LIKE ‘A%’; SELECT DISTINCT oznaceni, cena FROM Produkty WHERE (cena <30000 AND oznaceni LIKE 'A%') OR dodavatel_id IS NULL; A_OBCHOD SCHÉMA Databázové systémy 1 - př Příklady použití logických operátorů v jednoduchém dotazu nad jedinou tabulkou:

15 Aliasy v syntaxi příkazu SELECT SELECT FROM …………. =[ ALL|DISTINCT|DISTINCTROW] { * | [, [, …]] } = { |. |. * | výraz } [[AS] ] = { | | } [ ] Databázové systémy 1 - př. 7 15

16 Aliasy – příklad Příklad SELECT prd.oznaceni AS Vyrobek, dod.Nazev Vyrobce FROM Produkty prd, Dodavatele dod WHERE dod.dodavatel_id = prd.dodavatel_id; Vyrobek Vyrobce A600N Asus A2500H Asus A8JN-4P019M Asus Lifebook S2110Fujitsu Siemens A_OBCHOD SCHÉMA Databázové systémy 1 - př. 7 16

17 Aliasy – kdy se bez nich neobejdeme ? Příklad - spojení tabulky s tou samou tabulkou Máme dánu tabulku: LIDE(Id, jmeno, prijmeni, narozen, pohlaví, Id_otce, Id_matky) Zjistěte jména dětí, které mají matku Boženu Malou? SELECT deti.jmeno as jmeno_ditete FROM lide rodice JOIN lide deti ON deti.Id_matky=rodice.Id WHERE rodice.jmeno LIKE 'Božena' AND rodice.prijmeni LIKE 'Malá'; A_CLOVEK SCHÉMA Databázové systémy 1 - př. 7 17

18 Aliasy – kdy se bez nich neobejdeme ? Další příklady Zjistěte jména dětí, které mají rodiče s Id=2? SELECT vnoucata.jmeno as jmeno_vnoucete FROM lide JOIN lide deti ON (deti.Id_matky=lide.Id OR deti.Id_otce=lide.Id) WHERE lide.id=2; A_CLOVEK SCHÉMA Databázové systémy 1 - př. 7 18

19 Aliasy – kdy se bez nich neobejdeme ? Další příklady Zjistěte jména vnoučat, které má osoba s Id=6? SELECT vnoucata.jmeno as jmeno_vnoucete FROM lide JOIN lide deti ON (deti.Id_matky=lide.Id OR deti.Id_otce=lide.Id) JOIN lide vnoucata ON (vnoucata.Id_matky= deti.Id OR vnoucata.Id_otce= deti.Id) WHERE lide.id=6; A_CLOVEK SCHÉMA Databázové systémy 1 - př. 7 19

20 Výrazy Výraz je skupina konstant, proměnných a funkcí spojených pomocí operátorů. Výsledkem je hodnota. Datový typ je odvozen z datových typů jednotlivých prvků ve výrazu. Automatická konverze datových typů (například znaky na číslo při sčítání atd.) Základními kameny výrazů jsou Názvy sloupců Textové konstanty Číselné konstanty Výsledky funkcí Hodnota NULL Uzavření do závorek Unární (+/-) a binární operátory Vnořené dotazy (SELECT ….) Databázové systémy 1 - př. 7 20

21 Funkce Funkce jsou programové bloky, které provádějí požadované operace například s číselnými, znakovými či datovými hodnotami. Seznam lze najít např. na: Obecně je můžeme rozdělit: a) Jednořádkové funkce Analytické Konverzní Funkce pro práci s datem a časem Matematické Funkce pro práci s hodnotou NULL Řetězcové funkce Objektové funkce Funkce pro práci s formátem XML b) Agregační funkce Databázové systémy 1 - př. 7 21

22 Datové typy Oracle Datové typy pro kalendářní a časové hodnoty - datum a čas Oba typy se skládají z polí YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, TIMEZONE_HOUR, TIMEZONE_MINUTE (časový posun) DATE Vyjádření konkrétního data a času s přesností na sekundy, rozsah je od př.n.l. do TIMESTAMP ( ) Struktura obsahující datum a čas s požadovanou přesností (až na miliontiny sekundy pro hodnotu parametru =6). TIMESTAMP WITH TIME ZONE Struktura jako TIMESTAMP doplněná o časový posun oproti UTC Vnitřní reprezentace data v Oracle je číselná (rozdíl jednoho dne odpovídá 1). Datum možno sčítat a odčítat. Databázové systémy 1 - př. 7 22

23 Aktuální datum a čas v Oracle Pro zjištění data a času můžeme použít několik funkcí aktuální datum a čas SYSDATE – vrací aktuální datum a čas jako typ date, Pozor: obvykle se zobrazuje jen datum, ale hodnota obsahuje i čas, pro plné zobrazení je třeba použít konverzní funkci např. SELECT TO_CHAR(sysdate, 'DD.MM.YYYY HH24:MI:SS') FROM dual; LOCALTIMESTAMP vrací TIMESTAMP (v lokálním časovém pásmu) SYSTIMESTAMP vrací TIMESTAMP WITH TIME ZONE (s uvedeným časovým posunem systému) CURRENT_TIMESTAMP vrací TIMESTAMP WITH TIME ZONE (dle časového posunu nastaveného pro danou session) SELECT SESSIONTIMEZONE from dual; ALTER SESSION SET TIME_ZONE = '+1:0'; Všechny hodnoty jsou odvezeny dle systémových hodin na dtb. serveru. Databázové systémy 1 - př. 7 23

24 Tabulka DUAL V Oracle není možné použít příkaz SELECT bez klauzule „FROM" Příkaz SELECT 1+1 je syntakticky nesprávný. Chceme-li zapsat příkaz bez přístupu dat k reálné tabulce, můžeme uvést tabulku DUAL, která je součástí systémového katalogu a vždy vrací jediný řádek výsledku. Příklad SELECT 1+1 FROM DUAL; SELECT sysdate FROM DUAL; SELECT user FROM DUAL; Databázové systémy 1 - př. 7 24

25 Práce s typy datum a čas v Oracle Pro zjištění jedné hodnoty z hodnoty typu datum a čas je vhodná funkce EXTRACT. Příklad použití: SELECT EXTRACT(year FROM systimestamp) EY, EXTRACT(month FROM systimestamp) EM, EXTRACT(day FROM systimestamp) ED, EXTRACT(hour FROM systimestamp) EH, EXTRACT(minute FROM systimestamp) EM, EXTRACT(second FROM systimestamp) ES, EXTRACT(timezone_hour FROM systimestamp) TH, EXTRACT(timezone_minute FROM systimestamp) TM, EXTRACT(timezone_region FROM systimestamp) TR, EXTRACT(timezone_abbr FROM systimestamp) TA FROM dual; Databázové systémy 1 - př. 7 25

26 Práce s typy datum a čas v Oracle Posun datumu a času lze povést například takto: SELECT current_timestamp + INTERVAL '10:30' MINUTE TO SECOND FROM dual; SELECT localtimestamp + INTERVAL '1' year(1) FROM dual; SELECT sysdate + 1/24 FROM dual; -- výsledek bude o hodinu posunut, nicméně čas není zobrazen (jen nastavení způsobu zobrazení) SELECT to_char(sysdate + 1/24, 'DD.MM.YYYY HH24:MI:SS') FROM dual; -- v posledním příkladu je pro zobrazení času použita funkce to_char Databázové systémy 1 - př. 7 26

27 Funkce pro zjištění aktuálního času Next_day(datum, den_v_týdnu) funkce vrací nové datum představující následující zadaný den v týdnu Last_day(datum) poslední den v aktuálním měsíci Add_months(datum, n-měsíců) posune datum o n měsíců Months_between(datum1, datum2)počet měsíců mezi 2 daty Databázové systémy 1 - př. 7 27

28 Konverzní funkce Bin_To_Num(posloupnost 0 a 1 oddělená čárkami) převod binárního čísla na číslo desítkové soustavy To_Char(řet) převádí řetězec do standardní znakové sady To_Char(number [, formátovací_řetězec, nsl_par]) převádí datový typ NUMBER na typ VARCHAR2 To_Char(datetime [, formátovací_řetězec, nsl_par]) převádí datové typy na typ VARCHAR2 To_Date(řet, formátovací_řetězec [, nsl_par]) převádí textové datové typy na datový typ DATE To_Number(řet, formátovací_řetězec [, nsl_par]) převádí datový typ VARCHAR2 na číselný typ NUMBER nsl_par … parametr určující národní formát pro zápis data a času, čísel.. Databázové systémy 1 - př. 7 28

29 Parametry formátovacího řetězce funkce TO_CHAR pro práci s datem a časem YYYY 4-číslicový formát roku YYY, YY, Y Poslední 3, 2 nebo 1 číslice roku Q Čtvrtletí (1, 2, 3, 4) MM Měsíc (01-12; JAN = 01) MON Měsíc vyjádřený 3 znaky MONTH Měsíc celým názvem velkými písmeny RM Měsíc vyjádřený římskými číslicemi (I-XII; JAN = I) WW Týden v roce (1-53) W Týden v rámci měsíce (1-5) D Den v týdnu (1-7) DAY Den v týdnu vyjádřený slovně velkými písmeny DD Den v měsíci (1-31) DDD Den v roce (1-366) DY Den v týdnu vyjádřený pomocí zkratky názvu dne HH Hodina (1-12) HH12 Hodina vyjádřená ve 12-hodinovém formátu (1-12) HH24 Hodina vyjádřená ve 24-hodinovém formátu (0-23) MI Minuta (0-59) SS Sekunda (0-59) SSSSS Sekundy od půlnoci ( ) Databázové systémy 1 - př. 7 29

30 Konverzní funkce TO_CHAR Příklady pro práci s datem a časem: to_char(sysdate, 'yyyy/mm/dd'); '2003/07/09' to_char(sysdate, 'Month DD, YYYY'); Říjen 16, 2006' to_char(sysdate, 'Month DD, YYYY', 'NLS_DATE_LANGUAGE=American') October 16, 2006 to_char(sysdate, 'Month DD, YYYY', 'NLS_DATE_LANGUAGE=Czech') Říjen 16, 2006 Databázové systémy 1 - př. 7 30

31 Parametry formátovacího řetězce funkce TO_CHAR pro práci s čísly 9 Symbol pro číslo se stanoveným počtem číslic (je-li číslo kratší, je doplněno mezerami a před záporným je znak mínus) 0Číslo je na začátku nebo konci doplněné nulami $ Na začátku čísla je znak $ BSymbol zabrání vypsání čísla, pokud je jeho hodnota nula D Symbol pro určení oddělovače desetinných číslic G Symbol pro určení oddělovače tisíců LSymbol pro určení lokálního symbolu měny,Na příslušné pozici je čárka.Na příslušné pozici je tečka Včíslo je zobrazené v exponenciálním formátu RNčíslo je zobrazené velkými římskými číslicemi (do 3999) FMčíslo je zobrazené bez úvodních mezer EEEEčíslo ve vědeckém formátu Databázové systémy 1 - př. 7 31

32 Konverzní funkce TO_CHAR Příklady pro práci s čísly: to_char( , '9999.9') ' ' to_char( , '9,999.99') '1, ' to_char( , '$9, ') '$1, ' to_char(21, '000099') '000021' select to_char( , '999G999D999L', 'NLS_NUMERIC_CHARACTERS =,.') from dual ' ,235Kč' NLS_NUMERIC_CHARACTERS = " " Databázové systémy 1 - př. 7 32

33 Funkce zaokrouhlování data a času Round(datum, zaokrouhlení) zaokrouhlení data datumpůvodní datum zaokrouhleníYEAR na celé roky MONTH na celé měsíce DDDna celé dny DAYprvní den v týdnu HHna celé hodiny MIna celé minuty Trunc(datum, část) ořezání data (parametry stejné jako u Round) Extract(část FROM datum) vrací požadovanou část z data (YEAR, MONTH, DAY, HOUR, MINUTE, SECOND) Databázové systémy 1 - př. 7 33

34 Funkce zaokrouhlování data a času Příklady: SELECT ROUND (sysdate, 'DAY') FROM dual; SELECT TRUNC(sysdate, 'HH') FROM dual; SELECT EXTRACT(YEAR FROM sysdate) FROM dual; SELECT TO_CHAR(TRUNC(sysdate, 'HH'), 'DD. Month YYYY HH:MI') FROM dual; Databázové systémy 1 - př. 7 34

35 Jednořádkové znakové funkce Case-manipulation funkce – Funkce, které mění velikost znaků – UPPER – LOWER – INITCAP Character-manipulation funkce – Funkce, které mění řetězec – CONCAT – SUBSTR – LENGTH – LPAD Databázové systémy 1 - př. 4 35

36 Case-manipulation funkce UPPER – všechny znaky převede na velké UPPER(sloupec | výraz) SELECT UPPER(username) FROM uzivatele; LOWER – všechny znaky převede na malé LOWER(sloupec | výraz) SELECT LOWER(username) FROM uzivatele; INITCAP – všechny první znaky každého slova převede na velké, ostatní znaky na malé INITCAP(sloupec | výraz) SELECT INITCAP(mesto) FROM adresy; Databázové systémy 1 - př. 4 36

37 Case-manipulation funkce Příklady: SELECT * FROM zamestnanci WHERE UPPER(jmeno)=‘PETR‘; SELECT * FROM zamestnanci WHERE LOWER(jmeno)=‘petr‘; SELECT * FROM zamestnanci WHERE INITCAP(jmeno)=‘Petr‘; Databázové systémy 1 - př. 4 37

38 Character-manipulation funkce CONCAT – spojí dva řetězce do jednoho – Alternativou je operátor || SUBSTR – extrahuje podřetězec zadané délky – SUBSTR(retezec, pocat, delka) LENGTH – vrátí délku řetězce ve znacích – LENGTH(retezec) INSTR – nalezne pozici znaku v řetězci – INSTR(řetězec, znak) LPAD – doplní řetězec na zadanou délku zleva – LPAD(retezec, delka [, znak]) RPAD – doplní řetězec na zadanou délku zprava – RPAD(retezec, delka [, znak]) Databázové systémy 1 - př. 4 38

39 Character-manipulation funkce TRIM – odstraní z řetězce zadané znaky – TRIM([ leading | trailing | booth [znaky FROM ]] řetězec) REPLACE – zamění výskyt sekvence znaků v řetězci za zadanou sekvenci znaků – REPLACE(řetězec, co [, čím]) Databázové systémy 1 - př. 4 39

40 Akceptování hodnot NULL NVL(výraz1, výraz2) Pokud není hodnota výraz1 NULL, je vrácena hodnota výraz1, jinak výraz2. Tato funkce je vhodná pro nahrazení hodnoty null jinou hodnotou. NVL2(výraz1, výraz2, výraz3) Pokud není hodnota výraz1 NULL, je vrácena hodnota výraz2, jinak výraz3. Tato funkce rozšiřuje možnosti předchozí funkce. Použití v agregačních funkcích například: SELECT AVG(NVL(cena, 0)) as Prumerna_cena FROM produkty (interpretace – průměrná cena všech produktů produkt s neudanou cenou se pro výpočet považuje za produkt s nulovou cenou) SELECT AVG(cena) as Prumerna_cena FROM produkty (interpretace – průměrná cena všech produktů s udanou cenou) A_OBCHOD SCHÉMA Databázové systémy 1 - př. 7 40

41 DĚKUJI ZA POZORNOST Čas pro dotazy Databázové systémy 1 - př. 7 41


Stáhnout ppt "Databázové systémy I Přednáška č. 7 Ing. Jiří Zechmeister Fakulta elektrotechniky a informatiky"

Podobné prezentace


Reklamy Google