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

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

1 Teorie zpracování dat N-ticový relační kalkul SQL Doménový relační kalkul QBE.

Podobné prezentace


Prezentace na téma: "1 Teorie zpracování dat N-ticový relační kalkul SQL Doménový relační kalkul QBE."— Transkript prezentace:

1 1 Teorie zpracování dat N-ticový relační kalkul SQL Doménový relační kalkul QBE

2 2 N-ticový relační kalkul Dr. Codd definoval n-ticový relační kalkul pro RDM jazyk matematické logiky - predikátový počet je využit pro výběr informací z relační databáze název odvozen z oboru hodnot jeho proměnných - relace je množina prvků = n-tic je základem pro jazyk typu SQL Syntaxe je přizpůsobena programovacímu jazyku matematické vyjádření { x | F(x) } nahradíme zápisem x WHERE F(x) kde x je proměnná pro hledané n-tice (struktura relace), F(x) je podmínka, kterou má x splňovat (výběr prvků relace)

3 3 N-ticový relační kalkul Definice Abecedu tvoří konstanty atomické (hodnoty atributů), př. 8, ‘Kovář‘ predikátové (jména relací), př. Zam, Student proměnné n-ticové (proměnné, jejichž oborem hodnot jsou n-tice); označujeme je identifikátory; n-ticové proměnné představují prvky = n-tice relací; př. x, xZam, yStudent komponenty proměnných (indexové konstanty), odvolávky na atributy relací; označíme je odkazem na relaci (prefixem) a jménem atributu, př. xZam.jmeno, yStudent.rodcis operátory predikátové binární >= = <>, obecně * logické kvantifikátory NOT AND OR EXIST FORALL oddělovače ( )

4 4 N-ticový relační kalkul Definice Formulí n-ticového relačního kalkulu je atomická formule R(r), kde R jméno relace, r je n-ticová proměnná; formule znamená, že r je prvkem relace R; př: Zam(x), Student(y) atomické formule r.a * s.b, r.a* 'k', 'k' * s.b, kde r, s jsou n-ticové proměnné, a, b jsou komponenty proměnných (atributy), 'k' je atomická konstanta, * je binární operátor, r.a je atribut a n-tice r, s.b atribut b n-tice s; př: x.plat > 3000, y.jmeno = x.jmeno jsou-li F1 a F2 formule, pak také F1 OR F2, F1 AND F2, NOT F1 jsou formule; je-li F formule, pak také EXIST r(F(r)), FORALL r(F(r)) jsou formule; nic jiného není formule. Formule relačního kalkulu reprezentuje vyhledávací podmínku.

5 5 N-ticový relační kalkul Definice Výraz n-ticového relačního kalkulu je výraz tvaru x WHERE F(x) kde x je jediná volná proměnná ve formuli F. Jako v predikátovém počtu platí, že proměnné vázané kvantifikátory EXIST a FORALL nazývány vázanými proměnnými, ostatní n-ticové proměnné jsou volné. Výraz n-ticového relačního kalkulu určuje relaci tvořenou všemi možnými hodnotami proměnné x, které splňují formuli F(x). x definuje seznam komponent proměnných, které definují schéma výstupní relace. Je to buď již dříve definovaná entita, množina entit nebo seznam komponent volných proměnných.

6 6 N-ticový relační kalkul Základní operace relační algebry se dají vyjádřit pomocí výrazů n-ticového relačního kalkulu, tedy n-ticový relační kalkul je relačně úplný. Platí:R  S =>x WHERE R(x) OR S(x) R  S => x WHERE R(x) AND S(x) R - S =>x WHERE R(x) AND NOT S(x) R x S =>x, y WHERE R(x) AND S(y) R[a 1,a 2,...,a k ] =>x.a 1, x.a 2,..., x.a k WHERE R(x) R(P) =>x WHERE R(x) AND P R[A*B]S => x, y WHERE R(x) AND S(y) AND x.A * y.B

7 7 N-ticový relační kalkul Příklad: Mějme relace Učitel(ČU, jméno, fce, plat), Úvazek(ČU, ČP, hodin). Pak Učitel(x)... je atomická formule (podmínka), která nabývá hodnoty TRUE, je-li x (= prvek, entita, řádek) v tabulce Učitel – tzv. příslušnost proměnné x k relaci Učitel x.hodin>4... je atomická formule (= podmínka selekce) Úvazek(x) AND x.hodin>4... je formule (podmínka) nabývající TRUE, pokud v tabulce Úvazek je x s hodnotou hodin>4 xUčitel... je proměnná (= n-tice) typu (struktury) Učitel xUčitel.jméno, xUčitel.plat... je n-tice (zde projekce ze struktury Učitel) x.jméno, x.plat... totéž v jednodušším zápise

8 8 N-ticový relační kalkul Příklad – pokr. Dáno: Učitel(ČU, jméno, fce, plat) Úvazek(ČU, ČP, hodin) Jako výraz n-ticového relačního kalkulu zapište: Jmenný seznam učitelů (projekce) x.jméno WHERE Učitel(x) Seznam čísel učitelů, kteří učí předmět P2 (selekce a projekce) x.ČU WHERE Úvazek(x) AND Úvazek.ČP='P2' Seznam čísel učitelů a jejich počtu hodin v jednotlivých předmětech x.ČU, x.hodin WHERE Úvazek(x) Jmenný seznam učitelů a jejich úvazků v hodinách (přirozené spojení) y.jméno, x.hodin WHERE Učitel(y) AND Úvazek(x) AND y.ČU=x.ČU

9 9 N-ticový relační kalkul Relační kalkul, jak byl zatím definován, umožňuje zapsat i nekonečné relace, např. x WHERE NOT R(x) Výrazy relačního kalkulu se proto omezují jen na tzv. bezpečné výrazy, které definování relací nekonečných nedovolují.

10 10 Jazyk SQL navržen u IBM jako dotazovací jazyk (původní název Sequel) základem je n-ticový relační kalkul obsahuje i příkazy pro vytvoření a modifikace tabulek, pro ukládání, modifikaci a rušení dat v databázi a řadu dalších příkazů

11 11 Jazyk SQL Vývoj a standardy Vznik jazyka - jen dotazovací část, prototyp u IBM, Dr.Codd 1974 (Sequel) Zprvu implementován živelně v různých SŘBD. První standardizace organizací ANSI - průnik existujících implementací 1986 (SQL86). Rozšíření definičního jazyka o definice IO (SQL89). Rozšíření o nové datové typy, nové typy spojení, aplikační programování, další podpora transakcí, (SQL2  SQL92) Java 1998 (SQLJ) Rozšíření o objektovou orientaci pro objektově-relační databáze, rekurzivní SELECT, triggery, procedury, (SQL3  SQL99) „Kontejner pro budoucí standardy“, temporální SQL, XML,... > 2000

12 12 Jazyk SQL Vývoj a standardy Současné implementace SQL v SŘBD jsou na úrovni SQL92 nebo SQL99. Některé implementace mají rozšíření i o prvky navíc proti standardům. Význam definování a dodržování standardů přenositelnost aplikací v různých prostředích životnost aplikací v různých prostředích možnost společného přístupu v heterogenním prostředí jednodušší zaškolování

13 13 Jazyk SQL příkazy jazyka pro definici dat Vytvoření definice tabulky: CREATE TABLE Tab (ident1 {NUMBER | CHAR | DATE }(délka) [, ident2..., ident3...] ) Příklad: CREATE TABLE Včelaři (jméno CHAR(20), adresa CHAR(30), okres CHAR(15), včel NUMBER(4), medu NUMBER(4)); jménoadresaokresvčelmedu

14 14 Jazyk SQL příkazy jazyka pro definici dat Modifikace struktury tabulky ALTER TABLE tab {MODIFY (ident dat_typ (nový rozměr)) | ADD (ident dat_typ (rozměr)) | DROP ident} Příklad: Sloupec pro plat NUMBER(6, 2) už nestačí, je třeba přidat 2 cifry. ALTER TABLE zam MODIFY (plat NUMBER (8,2) ); Příklad: Do tabulky včelaři je nutno přidat sloupec o tom, jestli se u včelstev vyskytuje nemoc varoáza. ALTER TABLE včelaři ADD (varoáza NUMBER (1) );

15 15 Jazyk SQL příkazy jazyka pro definici dat Přejmenování tabulky nebo sloupce tabulky RENAME TABLE tab_stará TO tab_nová RENAME COLUMN tab.sloupec_starý TO tab.sloupec_nový Zrušení tabulky včetně definice DROP TABLE tab Vytvoření a rušení indexu CREATE [UNIQUE] INDEX index ON tab (seznam_klíčů) DROP INDEX index Klauzule UNIQUE znamená požadavek jednoznačnosti indexu Příklad: CREATE UNIQUE INDEX ind_včel ON včelaři (jméno); CREATE INDEX ind_fakul ON fakulta (kat, jméno);

16 16 Jazyk SQL příkazy jazyka pro manipulaci s daty Včelaři jménoadresaokresvčelmedu VčelařiP jménoadresaokresvčelmedupředs Včelař Med99 jménoadresaokresjménovčelmedu Včelař Med jménoadresaokresjménovčelmedurok

17 17 Jazyk SQL příkazy jazyka pro manipulaci s daty Vkládání nových řádků INSERT INTO tab [seznam_sloupců] VALUES(seznam_hodnot) Příklad: Nový včelař se přihlásil do organizace, dosud nemá výnosy. INSERT INTO Včelaři jméno, adresa, okres VALUES (‘Novotný Karel’,’Opava, Květná 34’,’Opava’); Bez specifikace sloupců bychom museli uvést všechny hodnoty: INSERT INTO Včelaři VALUES (‘Novák Jiří’,’Kravaře, Opavská 12’, ’Opava’, NULL, NULL); jménoadresaokresvčelmedu Novotný KarelOpava, Květná 34Opava Novák JiříKravaře, Opavská 12Opava

18 18 Jazyk SQL příkazy jazyka pro manipulaci s daty Pomocí příkazu INSERT je možno také naplňovat řádky tabulky hodnotami z jiné tabulky tak, že místo klauzule VALUES použijeme SELECT, v němž budou zadány řádky i sloupce jiných tabulek, které se do naší tabulky mají přenést.

19 19 Jazyk SQL příkazy jazyka pro manipulaci s daty Modifikace hodnot v řádcích tabulky UPDATE tab SET ident1=výraz1 [, ident2=výraz2,...] [WHERE podm] Příklad: Včelař Beran Alois se přestěhoval do Benešova a má nyní 92 včelstev. UPDATE Včelaři SET adresa = ‘Benešov, Šeříková 55’, včelstev = 92 WHERE jméno = ‘Beran Alois’; Příklad: Všichni zaměstnanci katedry 345 dostali přidáno 300 Kč. UPDATE Zam SET plat = plat WHERE kat = 345;

20 20 Jazyk SQL příkazy jazyka pro manipulaci s daty Rušení řádků tabulky DELETE FROM tab WHERE podm Příklad: Zaměstnanci Jára a Žára nedostanou žádné prémie, vymažou se z tabulky Odměny. DELETE FROM Odměny WHERE jméno = ‘Jára’ OR jméno = ‘Žára’;

21 21 Jazyk SQL příkazy jazyka pro manipulaci s daty Vyhledání informací z tabulky Příkaz SELECT reprezentuje vlastní dotazovací jazyk. Jeho použitím je možno nejen vyhledávat údaje v databázi obsažené, ale i údaje odvozené, případně vhodně setříděné. Základní nejjednodušší tvar příkazu je SELECT {seznam_sloupců | *} FROM tab [WHERE podm] znak * místo seznamu sloupců znamená výpis všech sloupců tabulky Poznámka: Příkaz SELECT A 1, A 2,..., A k FROM R WHERE podm odpovídá výrazu relační algebry (R (podm) ) [A 1, A 2,..., A k ] nebo výrazu n-ticového relačního kalkulu x.A 1, x.A 2,..., x.A k WHERE R(x) AND podm

22 22 Jazyk SQL příkazy jazyka pro manipulaci s daty Vyhledání informací z tabulky Jednoznačnost prvků výsledné relace nezajišťuje jazyk SQL automaticky, ale musí se zadat v příkazu klauzulí UNIQUE (nebo DISTINCT) Příklad: Celá tabulka SELECT * FROM včelaři; Příklad: Jmenný seznam a adresy všech včelařů (projekce) SELECT jméno, adresa FROM včelaři; Příklad: Seznam okresů, v nichž jsou organizováni včelaři SELECT UNIQUE okres FROM včelaři;

23 23 Jazyk SQL příkazy jazyka pro manipulaci s daty Vyhledání informací z tabulky Podmínka selekce se zapisuje za klauzulí WHERE. Ve výběrové podmínce je možno používat: konstanty, identifikátory sloupců, relační operátory : = <> >= logické operátory: NOT AND OR další operátory: BETWEEN dolní mez AND horní mez IN(seznam_prvků_množiny) IS NULL LIKE vzor... porovnání řetězců %... odpovídá skupině znaků _... podtržítko zastupuje 1 znak

24 24 Jazyk SQL příkazy jazyka pro manipulaci s daty Vyhledání informací z tabulky Příklad: Seznam včelařů z okresů Praha, Ústí a Ostrava, kteří mají mezi 50 a 100 včelstvy. SELECT * FROM Včelaři WHERE okres IN (‘Praha’,’Ústí’,’Ostrava’) AND včel BETWEEN 50 AND 100; Příklad: Seznam včelařů se jménem začínajícím písmenem K. SELECT * FROM Včelaři WHERE jméno LIKE ‘K%’; Příklad: Seznam včelařek (= jméno končí na -ová). SELECT * FROM Včelaři WHERE jméno LIKE ‘%ová’;

25 25 Jazyk SQL příkazy jazyka pro manipulaci s daty Vyhledání informací z tabulky Příklad: seznam včelařů jejichž jméno obsahuje X. SELECT * FROM Včelaři WHERE jméno LIKE ‘%X%’; Příklad: Seznam včelařů, kde jejich jméno obsahuje jako druhé písmeno v pořadí A. SELECT * FROM Včelaři WHERE jméno LIKE ‘_A%’;

26 26 Jazyk SQL příkazy jazyka pro manipulaci s daty Vyhledání informací z tabulky Příklad: Seznam včelařů jmenujících se Karel, rozlišujících velká a malá písmena tzv. binární porovnání. (Jinak SQL velká a malá písmena nerozlišuje). SELECT * FROM Včelaři WHERE BINARY jméno = ‘Karel’; Příklad: Seznam včelařů jejichž počet včelstev není vyplněn (NULL). SELECT * FROM Včelaři WHERE vcel IS NULL;

27 27 Jazyk SQL Setřídění výsledných řádků podle třídicího klíče, ne podle pořadí uložení v souboru: SELECT {seznam_sloupců | *} FROM tab [WHERE podm] [ORDER BY třídicí_klíč [DESC]] Příklad: Seznam včelařů v pořadí podle získaného medu od 500 kg výše. SELECT * FROM Včelaři WHERE medu>500 ORDER BY medu DESC; Pokud jsou v třídicím klíči prázdné hodnoty, uvádí se tyto řádky vždy na začátku tabulky při sestupném i vzestupném třídění.

28 28 Jazyk SQL Spojení více tabulek (vazba) se provede uvedením všech tabulek za FROM a podmínka spojení se uvede jako součást výběrové podmínky za WHERE. Bez této podmínky by se provedl prostý kartézský součin všech tabulek za FROM. Rozlišení stejnojmenných sloupců se rozliší pomocí prefixu - jméno tabulky před jménem sloupce a oddělené tečkou. SELECT {seznam_sloupců | *} FROM seznam_tabulek [WHERE podm_spojení] Příklad: Jmenný seznam včelařů s adresami je v tabulce Včelaři a záznamy o každoročních sklizních v tabulce Med. Zajímá nás adresa včelaře Žáry a kolik získal medu v roce SELECT Včelaři.jméno, adresa, medu FROM Včelaři, Med WHERE rok=1994 AND Včelaři.jméno=‘Žára’ AND... selekce Včelaři.jméno = Med.jméno;... podm. spojení

29 29 Jazyk SQL Pokud je název tabulky jako prefix nepohodlně dlouhý, nebo pokud potřebujeme jednu tabulku označit dvakrát pokaždé jinak (např. pro realizaci unární vazby), můžeme za klauzulí FROM každé tabulce zadat vlastní prefix. SELECT {seznam_sloupců | *} FROM tab1 P1, tab2 P2,... Příklad: V tabulce včelaři je také jméno předsedy místní organizace - u každého včelaře. Zajímá nás seznam včelařů, kteří získali více medu, než jejich předseda. SELECT X.jméno, X.medu, Y.medu FROM VčelařiP X, VčelařiP Y WHERE X.předs = Y.jmeno AND X.medu >Y.medu;

30 30 Jazyk SQL Pokud se při spojování tabulek nenajde v jedné tabulce odpovídající řádek ze druhé tabulky, ve výsledku spojení se odpovídající hodnota spojovacího klíče neobjeví. Může však nastat situace, že požadujeme ve výsledné tabulce i tento řádek (odpovídající hodnoty ze druhé tabulky zůstanou prázdné), zadáme to příznakem (+) u podmínky spojení. Podmínka spojení může být nejen na rovnost hodnot. Příklad: V tabulce včelaři mohou být členové, kteří v roce 1999 ještě včely nepěstovali, ale ve výsledném seznamu jejich jména požadujeme s nulovou snůškou medu. SELECT X.jméno, M.medu FROM Včelaři X, Med M WHERE rok = 1999 AND M.jméno = X.jméno(+);

31 31 Jazyk SQL Spojení více tabulek pomocí příkazu JOIN, levé a pravé spojení (LEFT/RIGHT JOIN). Pro levé spojení se vyberou všechny řádky z tabulky uvedené „vlevo“ a k nim pokud existují se přiřadí řádky z tabulky „vpravo“. SELECT {seznam_sloupců | *} FROM Tab1 [LEFT,RIGHT] JOIN Tab 2 ON podm_spojení Příklad: Jmenný seznam včelařů s adresami je v tabulce Včelaři a záznamy o každoročních sklizních v tabulce Med. SELECT Včelaři.jméno, adresa, medu FROM Včelaři JOIN Med ON Včelaři.jméno = Med.jméno;... podm. Spojení Příklad: Jmenný seznam VŠECH včelařů a jejich případné sklizeň medu v roce 99. SELECT Včelaři.jméno, adresa, medu FROM Včelaři LEFT JOIN Med99 ON Včelaři.jméno = Med99.jméno;

32 32 Jazyk SQL Výrazy a funkce Pro vytváření výrazů používá SQL aritmetických operátorů a závorek v obvyklých významech. Místo jména sloupce můžeme použít výraz, a to v seznamu za SELECT či v podmínce za WHERE. Pokud je výraz použit jako prvek seznamu za SELECT a chceme příslušnému sloupci na výstupu přiřadit sloupcový nadpis vlastní, zapíšeme ho po mezeře za výrazem. Pokud se nadpis skládá z více slov, uzavírá se do závorek. Příklad: SELECT jméno, medu/včel FROM Včelaři; SELECT jméno, medu/včel (průměr medu) FROM Včelaři;

33 33 Jazyk SQL Výrazy, funkce a NULL Pokud je ve výrazu proměnná, která má hodnotu NULL, má celý výraz hodnotu NULL. Někdy se takový výstup nehodí a chceme nahradit hodnotu NULL konkrétní náhradní hodnotou (např. nulou pro číslo nebo mezerou pro text). K tomu slouží funkce NVL( prom, náhr_hodn ) Příklad: SELECT jmeno, NVL(medu,0)/NVL(včel,1) průměr FROM Včelaři;

34 34 Jazyk SQL Funkce aritmetické: POWER(číslo, mocnitel)... mocnina ROUND(číslo, poč_des_míst) TRUNC(číslo, poč_des_míst) ABS(číslo) SIGN(číslo) MOD(číslo1, číslo2) SQRT(číslo) GREATEST(seznam_hodnot)... maximum v řádku LEAST(seznam_hodnot)... minimum v řádku

35 35 Jazyk SQL Funkce řetězcové: řetězec1 || řetězec2 LENGHT(řetězec) SUBSTR(řetězec,pozice,délka)... výběr podřetězce INSTR(řetězec,podřetězec,pozice,pořadí) UPPER(řetězec) LOWER(řetězec) TO_NUMBER(řetězec)... konverze text -> číslo TO_CHAR(řetězec[,formát])... datum či číslo -> text TO_DATE(řetězec[,formát])... text či číslo -> datum LPAD(řetězec,délka,[,znak])... doplní zleva RPAD(řetězec,délka,[,znak])... doplní zprava LTRIM(řetězec,množ_znaků)... vypustí zleva RTRIM(řetězec,množ_znaků)... vypustí zprava DECODE(sl,vzor1,obraz1,...,implic)... překlad tabulkou

36 36 Jazyk SQL Ve funkci DECODE obraz může být konstanta nebo jméno sloupce; může sloužit i jako přepínač, když ve sloupci nechceme homogenní hodnoty. Příklad: V tabulce Zam ke každé funkci přidáme kategorii funkce 1-4 podle pravidla prof=3, doc=2, asist=1, ostatní=4. SELECT jméno, funkce, DECODE(funkce, ’asist’, 1, ’doc’, 2, ’prof’, 3, 4) kateg FROM Zam; jménofcekateg Adam Aloisdoc2 Beran Bedřichtopič4 Čermák Cyrilasist1

37 37 Jazyk SQL Příklad: U mimopražských včelařů budeme tisknout adresy, u pražských jen Praha (=okres). SELECT jméno, DECODE(okres, ’Praha ’, okres, adresa) odkud FROM Včelaři; jménoodkud Adam AloisPraha Beran BedřichU pošty 15, Dobřichovice Čermák CyrilPraha Poznámka: Funkcí DECODE je možno docílit nehomogenních sloupců.

38 38 Jazyk SQL Funkce agregované jsou nerelační funkce nad sloupci, vyžádané praxí. AVG ({[DISTINCT] sez_výr|*})... průměr SUM ({[DISTINCT] sez_výr|*})... součet MIN ({[DISTINCT] sez_výr|*})... minimum MAX ({[DISTINCT] sez_výr|*})... maximum COUNT({[DISTINCT] sez_výr|*})... počet Příklad: Určete prům, minim a maxim počet včelstev v okrese Karviná. SELECT AVG(včel), MIN(včel), MAX(včel) FROM Včelaři WHERE okres = ‘Karviná’; Příklad: Kolik je v okrese Praha včelařů ? SELECT COUNT(*) FROM Včelaři WHERE okres = ‘Praha’; Příklad: V kolika okresech včelaři pracují ? SELECT COUNT (UNIQUE okres) FROM Včelaři;

39 39 Jazyk SQL Grupování a podmínka na grupy Tabulku můžeme uspořádat tak, že vzniknou skupiny řádků se stejnou hodnotou třídicího klíče. Pro skupiny můžeme provádět operace (částečné počty, součty ap.). SELECT {seznam_výrazů | *} FROM seznam_tabulek GROUP BY seznam_sloupců Příklad: Najděte průměrné množství medu v jednotlivých okresech. SELECT okres, AVG(medu) FROM Včelaři GROUP BY okres;

40 40 Jazyk SQL Atributy zdrojové relace tvoří 3 skupiny... ve výsledné relaci (1) definující grupu... 1 řádek = grupa (2) agregovatelné... agregovaná hodnota grupy (3) ostatní... nemají význam nebo 1.řádek grupy (3) jméno (3) adresa (1) okres (2) včel (2) medu (1) okres AVG(2) AVG(medu) Beneš...Opava...100Opava150 Gajdoš...Opava...230Bruntál Adam...Bruntál...320Ostrava78... Žižka...Ostrava...125

41 41 Jazyk SQL Příklad: Rozdělte zaměstnance fakulty podle kateder a funkcí, pro každou tuto skupinu určete jejich počet a průměrný plat. SELECT kat, funkce, COUNT(*), AVG(plat) FROM Zam GROUP BY kat, funkce; katfceCOUNT(*)AVG(plat) 401prog doc asist prof prof

42 42 Jazyk SQL Pokud pracujeme se skupinami a chceme formulovat podmínku pro celou skupinu, nejen pro jednotlivé řádky původních tabulek, nedává se tato podmínka za WHERE, ale za HAVING: SELECT {seznam_výrazů | *} FROM seznam_tabulek [WHERE podm_pro_řádek] [GROUP BY seznam-klíčů [HAVING podm_pro_skupinu] ] Příklad: Najděte průměrný plat skupin na fakultě s více než 25 členy. SELECT kat, funkce, COUNT(*), AVG(plat) FROM Zam GROUP BY kat, funkce HAVING COUNT(*) > 25;

43 43 Jazyk SQL Příklad: Najděte katedry, kde jsou alespoň 2 sekretářky. SELECT kat, COUNT(*) FROM Zam WHERE funkce = ‘sekretářka’ GROUP BY kat HAVING COUNT(*) >= 2; Příklad: Najděte katedry s průměrným platem asistenta > SELECT kat, AVG(plat) FROM Zam WHERE funkce = ‘asist’ GROUP BY kat HAVING AVG(plat) > 5000;

44 44 Jazyk SQL Úplná syntaxe příkazu SELECT SELECT {ALL | DISTINCT }{seznam_výrazů | *} FROM tab[ tabnázev] [,...] [ WHERE podm ] [ GROUP BY seznam_sloupců [ HAVING podm ] ] [ ORDER BY atr1 [ASC|DESC] [, atr2...] ]

45 45 Jazyk SQL Podotázky Dotazy je možno řetězit, pro formulaci hlavního dotazu je možno použít výsledků dotazu jiného (poddotazu) v podmínce za WHERE v příkazech SELECT, UPDATE a DELETE. 1.pokud je výsledkem poddotazu jediná hodnota (relace o 1 řádku a 1 sloupci), pak kdekoliv místo hodnoty: výraz rel_oper (příkaz SELECT) (2.) pokud je výsledkem poddotazu n-tice hodnot (relace o 1 řádku), pak s relačními operátory = a <> místo n-tice hodnot: výraz rel_oper (příkaz SELECT) 3. je-li výsledkem poddotazu množina hodnot (relace o 1 sloupci): výraz [NOT] IN (příkaz SELECT) výraz rel_oper {[ANY | ALL]} (příkaz SELECT) ANY je minimální a ANY maximální prvek výsledné množiny

46 46 Jazyk SQL Podotázky Příklad: Hledáme včelaře patřící do organizace jako Kovář Karel (mají stejného předsedu). 1.buď dvěma dotazy s „ručním“ přenesením mezivýsledku SELECT předs FROM Včelaři WHERE jmeno = ‘Kovář Karel’; SELECT jméno, adresa FROM Včelaři WHERE předs = ‘...’; kde ‘...’ je výsledek 1. dotazu. 2. nebo zřetězeně s poddotazem SELECT jméno, adresa FROM Včelaři WHERE předs = (SELECT předs FROM Včelaři WHERE jméno=‘Kovář Karel’);

47 47 Jazyk SQL Podotázky Příklad: Najděte včelaře, kteří mají stejné množství včelstev a získali stejné množství medu jako včelař Kovář Karel. SELECT jméno, adresa, včel, medu FROM Včelaři WHERE (včel, medu) = (SELECT včel, medu FROM Včelaři WHERE jméno = ‘Kovář Karel’); Příklad: Najděte funkce, které mají vyšší průměrný plat, než je průměrný plat docenta. SELECT funkce, AVG(plat) FROM Zam GROUP BY funkce HAVING AVG(plat) > (SELECT AVG(plat) FROM Zam WHERE funkce = ‘doc’);

48 48 Jazyk SQL Podotázky Příklad: Najděte včelaře, kteří získali více medu než alespoň jeden včelař okresu Ústí (= víc než ten, co získal nejméně). SELECT jméno, adresa FROM Včelaři WHERE medu > ANY (SELECT medu FROM Včelaři WHERE okres = ‘Ústí’); SELECT jméno, adresa FROM Včelaři WHERE medu > (SELECT MIN(medu) FROM Včelaři WHERE okres = ‘Ústí’);

49 49 Jazyk SQL Podotázky Příklad: Najděte včelaře, kteří mají více včelstev než kterýkoliv včelař okresu Ústí (= víc než ten, co má nejvíc) SELECT jméno, adresa FROM Včelaři WHERE včel > ALL (SELECT včel FROM Včelaři WHERE okres = ‘Ústí’); SELECT jméno, adresa FROM Včelaři WHERE včel > (SELECT MAX(včel) FROM Včelaři WHERE okres = ‘Ústí’);

50 50 Jazyk SQL Podotázky Příklad: Vypište seznam včelařů a snůšku medu z okresů, jejichž průměrná snůška medu je větší než 100. SELECT jméno, adresa, medu FROM Včelaři WHERE okres IN (SELECT okres FROM Včelaři GROUP BY okres HAVING AVG(medu) > 100); Příklad: Vypište seznam včelařů a snůšku medu z okresů Ostrava, Opava. SELECT jméno, adresa, medu FROM Včelaři WHERE okres IN (‘Ostrava’, ‘Opava’);

51 51 Jazyk SQL Logické kvantifikátory Některé složitější dotazy v relačním kalkulu vyžadují použití logických kvantifikátorů EXISTS a FORALL. Existenční kvantifikátor v SQL je definován SELECT... FROM... [WHERE [NOT] EXISTS (SELECT... FROM... [...]) ] kde EXISTS(SELECT... ) = TRUE, je-li množina daná výrazem v závorkách neprázdná, jinak je FALSE; totéž lze formulovat pomocí IN. Všeobecný kvantifikátor v SQL neexistuje, využívá se vztahu: FORALL x (P(x)) = NOT EXISTS x (NOT P(x)) Doporučený postup je 1. zapsat dotaz jako výraz relačního kalkulu včetně FORALL 2. pak jej mechanicky přepsat do SQL

52 52 Jazyk SQL Příklad: Mějme relace Čtenář(id_čt, jméno,adresa), Kniha (prir, ISBN, autor, název) a Rezer (id_čt, prir, datod). Hledáme čtenáře, kteří mají nějakou knihu rezervovanou (= existuje záznam s jejich id_čt v Rezer) SELECT jméno FROM Čtenář WHERE EXIST (SELECT C.* FROM Rezer R, Čtenář C WHERE R.id_čt = C.id_čt) nebo SELECT jméno FROM Čtenář WHERE id_čt IN (SELECT UNIQUE id_čt FROM Rezer R)

53 53 Jazyk SQL Množinové operace Z množinových operací dosud známe IN a NOT IN, případně ALL, ANY. Sjednocení SELECT... FROM... [WHERE... GROUP BY... HAVING... ] UNION (SELECT... FROM... [...]) [ORDER BY...] Průnik SELECT... FROM... [...] INTERSECT (SELECT... FROM... [...]) [...] Rozdíl SELECT... FROM... [...] EXCEPT (SELECT... FROM... [...]) [...]

54 54 Jazyk SQL Množinové operace Příklad: Abecední jmenný seznam zaměstnanců i studentů. SELECT jmeno FROM Student UNION (SELECT jmeno FROM Zam) ORDER BY jmeno Pozor na častou chybu, není možno použít: FROM Student, Zam... Příklad: Jmenný seznam zaměstnaných studentů na VŠB. SELECT jmeno FROM Student INTERSECT (SELECT jmeno FROM Zam) Snadno se nahradí projekcí a selekcí nad kartézským součinem.

55 55 Jazyk SQL Množinové operace Příklad: Jmenný seznam studentů nezaměstnaných na VŠB. SELECT jmeno FROM Student EXCEPT (SELECT jmeno FROM Zam)

56 56 Jazyk SQL Doplnění INSERT, UPDATE, DELETE Pomocí příkazu INSERT je možno také naplňovat řádky tabulky hodnotami z jiné tabulky tak, že místo klauzule VALUES použijeme SELECT, v němž budou zadány řádky i sloupce jiných tabulek, které se do naší tabulky mají přenést. INSERT INTO Tab [seznam_sloupců] SELECT seznam_hodnot FROM tab2 WHERE podm... Příklad: Do definované prázdné tabulky ostravských včelařů se opíší včelaři z celostátní evidence: INSERT INTO Ostr_včelaři SELECT * FROM Včelaři WHERE okres = ‘Ostrava’;

57 57 Jazyk SQL Doplnění INSERT, UPDATE, DELETE Také u příkazů UPDATE a DELETE je možno za klauzulí WHERE používat všechny funkce, operátory, konstrukty, poddotazy jako u příkazu SELECT. Příklad: Prémii ve výši 20% platu dostali všichni zaměstnanci uvedení v seznamu Odměny (jmeno). UPDATE Zam SET plat = plat * 1.2 WHERE jméno IN (SELECT jméno FROM Odměny); Příklad: Zaměstnanci ze seznamu NoZam (jmeno) dostali výpověď. DELETE FROM Zam WHERE jméno IN (SELECT jméno FROM NoZam);

58 58 Jazyk SQL Pohledy Pohled je virtuální tabulka přímo v databázi neexistující, ale definovatelná příkazem SELECT. Definuje se příkazem: CREATE VIEW pohled AS SELECT {seznam_výrazů | *} FROM tab [WHERE podm] [GROUP BY seznam_sloupců [HAVING podm] ] [ORDER BY seznam_sloupců] Práce s pohledem jako s tabulkou, změny v pohledu změní i hodnoty v tabulce, z níž je pohled odvozen a naopak. Problémem změny ve virtuálních sloupcích, v pohledech setříděných ap., implementace práci s pohledy omezují. Při vytváření virtuálních sloupců zadáme jména nově vzniklých sloupců za názvem pohledu.

59 59 Jazyk SQL Pohledy Příklad: Aplikace potřebuje jméno, adresu a medu včelařů z Ostravy. CREATE VIEW Ostraváci AS SELECT jméno, adresa, medu FROM Včelaři WHERE okres = ‘Ostrava’; Příklad: Jiná úloha potřebuje všechny údaje z obou tabulek včelaři i med. CREATE VIEW Všichni AS SELECT * FROM Včelaři V, med M WHERE V.jméno = M.jméno; Příklad:Potřebujeme tabulku ročních příjmů zaměstnanců. CREATE VIEW Roční_příjem (jméno, měsíčně, ročně) AS SELECT jméno, plat, plat*12 FROM Zam;

60 60 Jazyk SQL Příkazy pro sdílení a ochranu dat SQL obsahuje i příkazy podporující správu databáze - příkazy pro přidělování a odebírání přístupových práv na různých úrovních různým uživatelům databáze. V implementacích v SŘBD platí: k tabulce vytvořené uživatelem má přístup jen on sám, pokud nezpřístupní svou tabulku jinému uživateli příkazem GRANT. Odebrat toto právo může příkazem REVOKE. Některé SŘBD rozšiřují GRANT i REVOKE i na celou databázi.

61 61 Jazyk SQL Přidělení přístupového práva GRANT tabulkové_právo ON { tab | pohled } TO { PUBLIC | sez_jmen_uživatelů } jméno uživatele je příslušný login_name, PUBLIC znamená zveřejnění tabulky všem uživatelům. Tabulková práva rozlišují vymezení přístupu uživatelů k různým datům: SELECT [(seznam_sloupců)]... čtení příslušných sloupců INSERT... vkládání řádků do tabulky UPDATE [(seznam_sloupců)]... modifikace sloupců tabulky DELETE... rušení řádků tabulky ALTER... modifikace struktury tabulky INDEX... vytváření indexů ALL... všechna výše uvedená práva

62 62 Jazyk SQL Odebrání přístupového práva REVOKE tabulkové_právo ON { tab | pohled } FROM { PUBLIC | sez_jmen_uživatelů } Příklad: Pro definovanou tabulku Zam(RČ,jméno,adresa,plat,fce) povolte záznam zaměstnance - RČ, jméno, adresa perzonalistce s loginem ABC20, plat, fce vedoucímu katedry login DEF30, ostatním jen prohlížení jména, adresy, fce, správci databáze GHI40 všechna práva. REVOKE ALL ON Zam FROM PUBLIC GRANT INSERT ON Zam TO ABC20 GRANT UPDATE(RČ, jméno, adresa) ON Zam TO ABC20 GRANT SELECT(RČ, jméno, adresa) ON Zam TO ABC20 GRANT UPDATE(plat, fce) ON Zam TO DEF30 GRANT SELECT(plat, fce) ON Zam TO DEF30 GRANT SELECT(jméno, adresa, fce) ON Zam TO PUBLIC GRANT ALL ON Zam TO GHI40

63 63 Jazyk SQL Další možnosti SQL SQL není jen dotazovací jazyk, ale obsahuje i příkazy další. Již známe příkazy JDD, definuje, modifikuje a ruší tabulky, indexy, pohledy příkazy JMD, ukládá data do databáze, modifikuje je a ruší dotazovací jazyk reprezentuje mohutný příkaz SELECT příkazy pro přidělování přístupových práv Ale to není všechno, současný SQL obsahuje i pro záznam některých integritních omezení pro vytváření hierarchických struktur dat pro definici a manipulaci s neatomickými atributy (pole, množiny, seznamy, BLOB, hnízděné relace, dokumenty, video, audio, mapy, časové řady, prostorové objekty,...) pro řízení transakcí pro práci se systémovým katalogem a další

64 64 Jazyk SQL Další možnosti SQL Příklad: neatomické atributy – pole, odhnízdění, poziční přístup CREATE TABLE Články (id NUMBER(4), autoři CHAR(15) ARRAY [20], titul CHAR(100), abstrakt FULLTEXT ) SELECT Z.id, A.jméno FROM Zprávy Z, UNNEST (Z.autoři) AS A(jméno)... SELECT id, autoři[1],autoři[2] FROM Články WHERE... Příklad: Zam(jméno,..., vzdělání, jazyky), hledáme vysokoškoláka se znalostí angličtiny a němčiny. SELECT jméno FROM Zam WHERE vzdělání CONTAINS RT(univerzita) AND jazyky CONTAINS ‘angličtina’ AND ‘němčina’

65 65 Doménový relační kalkul Oborem hodnot proměnných jsou prvky domén. Abeceda doménového kalkulu konstanty atomické, př. 3, ¨Novák¨ predikátové; příslušnost k relaci, n-ární, př. Zam, Student proměnné doménové, př. x, y, xjmeno, xplat operátory predikátové binární >= = <>, obecně * logické a kvantifikátory OR AND NOT EXIST FORALL oddělovače ( )

66 66 Doménový relační kalkul Atomické formule doménového kalkulu jsou: R(x1,x2,...,xn), kde R je jméno relace stupně n, xi jsou buď doménové proměnné nebo atomické konstanty; vyjadřuje, že n-tice hodnot x1,..., xn je prvkem relace R; Aby v této formuli nebyl seznam proměnných závislý na pořadí atributů, zapisuje se obvykle pro schéma relace R(a,b,c,...) formule příslušnosti n- tice k relaci R(a:x1,b:x2,c:x3,...); x * y, kde x, y jsou doménové proměnné nebo atomické konstanty, * je binární predikátový operátor >= = <> Formule doménového kalkulu se vytváří stejně, jako u n-ticového kalkulu (NOT F1, F1 OR F2,...)

67 67 Doménový relační kalkul Výraz doménového relačního kalkulu je výraz tvaru x1, x2, …, xn WHERE F(x1, x2,..., xn) kde x1,..., xn jsou jediné navzájem různé volné doménové proměnné ve formuli doménového relačního kalkulu F. Výraz určuje relaci tvořenou všemi možnými n-ticemi hodnot proměnných x1, x2,..., xn, které splňují formuli F.

68 68 Doménový relační kalkul Příklad: Učitel (ČU, jméno, kat, plat), Úvazek (ČU, ČP, hodin). 1: Seznam čísel učitelů a jejich počtu hodin v jednotlivých předmětech (= úplný výpis relace Úvazek) xČU, xČP, xhodin WHERE Úvazek(ČU: xČU, ČP:xČP, hodin: xhodin) 2: Určete jmenný seznam učitelů, jejich kateder a platů (projekce) xjméno, xkat, xplat WHERE EXIST z (Učitel(ČU:z, jméno: xjméno, kat: xkat, plat: xplat)) 3: Seznam čísel učitelů, kteří učí předmět P2 (selekce a projekce) xČU WHERE EXIST z (Úvazek (ČU: xČU,ČP: z, hodin: z)) AND ČP='P2' 4: seznam učitelů a jejich úvazků v hodinách (přirozené spojení) xču, xjm, xkat, xpl, xčp, xhod WHERE (Učitel (ČU: xČU, jméno: xjm, kat: xkat, plat: xpl) AND Úvazek(ČU: xČU, ČP: xČP, hodin: xhod))

69 69 Doménový relační kalkul Poznámka: Pomocí existenčního kvantifikátoru doplňujeme do n-tice ty proměnné, které se nevyskytují v seznamu na levé straně; zavedením jiné notace můžeme existenční kvantifikátor vynechat: do formule znamenající příslušnost prvku k relaci zapíšeme jen volné proměnné, ostatní proměnné vázané existenčním kvantifikátorem vynecháme a chápeme existenční kvantifikaci implicitně. Místo xjméno WHERE EXIST z (Učitel(ČU:z, jméno: xjméno, kat: z, plat: z)) píšeme xjméno WHERE (Učitel(jméno: xjméno)) Příklad: Učitel (ČU, jméno, kat, plat), Úvazek (ČU, ČP, hodin). 3. xČU WHERE Úvazek(ČU: xČU) AND ČP='P2'

70 70 Jazyk QBE (Query By Example) Původně vytvořen u firmy IBM, popsán Zloofem, 1975, pro pohodlné zadávání výběrových podmínek pro naivní uživatele. Postupně se z něj vytvořil standard, implementovaný u řady SŘBD, podobně jako jazyk SQL. Svými schopnostmi formulovat výběrové podmínky je stejně silným prostředkem, jako je jazyk SQL. Také již není jen dotazovacím jazykem, ale obsahuje prostředky pro definici a manipulaci s daty, pro práci s pohledy, se systémovým katalogem ap. Dotazy jsou vyjadřovány interaktivně pomocí příkladů. Tabulky se formou prázdných tabulkových schémat zobrazují na obrazovce. Dotaz se zapíše do příslušných sloupců prázdné tabulky - vypíší se hodnoty, které se ve sloupcích hledají.

71 71 Jazyk QBE Příklad: Relace Zam(osob, jméno, adresa, plat). Po volbě tabulky se zobrazí prázdný řádek tabulky. Zamosobjménoadresaplat Do řádků se zapisují příkazy QBE, proměnné a výběrové podmínky. Příkazy jazyka uvedeme na příkladech Proměnná začíná podtržítkem: _jmeno, _plat, _novak, _x, _y Výběrové podmínky se zapisují standardně, AND, OR dle implementace Na rozdíl od SQL jazyk QBE podporuje odstranění duplicitních řádků výsledné relace. Zajištění všech řádků se naopak zajistí klauzulí ALL.

72 72 Jazyk QBE Příklad: Relace Zam(osob, jméno, adresa, plat). 1. Výpis celé tabulky se zadá znakem P. (= print) pod jméno relace Zamosobjménoadresaplat P. 2. Selekce se zapíše hledanými hodnotami ve sloupcích s případným použitím relačního operátoru. Vypište jména zaměstnanců bydlících v Opavě. Zamosobjménoadresaplat P._xOpava

73 73 Jazyk QBE Příklad: 3. Projekce se zapíše znakem P. do příslušného sloupce a vyjádřením proměnné: P._Novák Vypište jména a adresy všech zaměstnanců. Zamosobjménoadresaplat P.P.ALL._NovákP._Opava _Novák je proměnná, tedy stačí _x, užíváme různé proměnné v různých sloupcích. Prostou projekci můžeme někdy zapsat i bez proměnné. Zamosobjménoadresaplat P.ALL._xP._y Zamosobjménoadresaplat P.

74 74 Jazyk QBE Příklad: 4. Selekce a projekce současně. Vypište osobní čísla a jména zaměstnanců s platem menším než Zamosobjménoadresaplat P. < Konjunkce více podmínek se píše do řádku vedle sebe. Najděte zaměstnance mimo Ostravu s platem větším než Zamosobjménoadresaplat P.<>Ostrava>10000 Složitější podmínky, jako více podmínek na jeden sloupec, disjunkce podmínek a další implementují různé SŘBD různě.

75 75 Jazyk QBE Příklad: Najdi jména a osobní čísla zaměstnanců s platem Konjunkce dvou a více podmínek na jeden sloupec se buď píše do speciálního okna na obrazovce (CONDITION BOX), nebo existuje možnost rozšířit tabulku o duplicitní sloupce: nebo podmínky do dvou řádků a současně stejné proměnné: Zamosobjménoadresaplat P._x P._y >3000 <4000 nebo se seznam podmínek píše na oddělený čárkou. Zamosobjménoadresaplat P. >3000<4000 Zamosobjménoadresaplat P._xP._y>3000,<4000

76 76 Jazyk QBE Příklad: Najdi zaměstnance s platem pod 3000 nebo nad Disjunkce podmínek se píše do dvou a více řádků tabulky s použitím různých proměnných. 8. Vzestupné setřídění výstupní relace se předepíše AO(n), sestupné DO(n) a v závorce zapsané číslo n znamená pořadí třídicího klíče. Vypište zaměstnance dle výše platu - od nejvyššího k nejnižšímu, při stejném platu dle abecedy. Zamosobjménoadresaplat P._x P._y < 3000 >30000 Zamosobjménoadresaplat P.P.AO(2)P.DO(1)

77 77 Jazyk QBE Příklad: 9. Pro dotaz vyžadující spojení dvou tabulek se vyvolají formuláře obou tabulek a podmínka spojení se vyjádří použitím stejné proměnné v obou tabulkách. Je dána další relace Děti (jméno_d, rodcis, osob). Osob je cizí klíč ze Zam. Vypište adresy všech dětí (= adresy rodičů). 10. Agregace používají funkcí CNT, SUM, AVG, MIN, MAX, grupování pomocí G. Zamosobjménoadresaplat _xP._z Dětijmeno_drčosob P._y_x Zamkatosobjménoadresaplat P.G.SUM._x


Stáhnout ppt "1 Teorie zpracování dat N-ticový relační kalkul SQL Doménový relační kalkul QBE."

Podobné prezentace


Reklamy Google