1
Teorie zpracování dat
N-ticový relační kalkulSQLDoménový relační kalkulQBE
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ápisemx 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
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
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
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
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[a1,a2,...,ak] => x.a1, x.a2,..., x.ak 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
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
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
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
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
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 - 1989 (SQL89).
• Rozšíření o nové datové typy, nové typy spojení, aplikační
programování, další podpora transakcí, ... 1992 (SQL2 SQL92)
• Java 1998 (SQLJ)
• Rozšíření o objektovou orientaci pro objektově-relační databáze,
rekurzivní SELECT, triggery, procedury, ... 1999 (SQL3 SQL99)
• „Kontejner pro budoucí standardy“, temporální SQL, XML, ... > 2000
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
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éno adresa okres včel medu
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
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
Jazyk SQL příkazy jazyka pro manipulaci s daty
Včelaři
jméno adresa okres včel medu
VčelařiP
jméno adresa okres včel medu předs
Včelař Med99
jméno adresa okres jméno včel medu
Včelař Med
jméno adresa okres jméno včel medu rok
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éno adresa okres včel medu
Novotný Karel Opava, Květná 34 Opava
Novák Jiří Kravaře, Opavská 12 Opava
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
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 + 300 WHERE kat = 345;
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 sez tabulky Odměny.
DELETE FROM Odměny
WHERE jméno = ‘Jára’ OR jméno = ‘Žára’;
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 A1, A2, . . . , Ak FROM R WHERE podm
odpovídá výrazu relační algebry
(R (podm) ) [A1, A2, . . . , Ak]
nebo výrazu n-ticového relačního kalkulu
x.A1, x.A2, . . . , x.Ak WHERE R(x) AND podm
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
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
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řiWHERE 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řiWHERE jméno LIKE ‘K%’;
Příklad: Seznam včelařek (= jméno končí na -ová).
SELECT *FROM VčelařiWHERE jméno LIKE ‘%ová’;
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řiWHERE 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řiWHERE jméno LIKE ‘_A%’;
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řiWHERE BINARY jméno = ‘Karel’;
Příklad: Seznam včelařů jejichž počet včelstev není vyplněn (NULL). SELECT *
FROM VčelařiWHERE vcel IS NULL;
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řiWHERE medu>500ORDER 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
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 1994.
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
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.meduFROM VčelařiP X, VčelařiP YWHERE X.předs = Y.jmeno AND X.medu >Y.medu;
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.meduFROM Včelaři X, Med MWHERE rok = 1999 AND M.jméno = X.jméno(+);
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
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
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
Jazyk SQL
Funkce aritmetické:
POWER(číslo, mocnitel) ... mocninaROUND(čí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 řádkuLEAST(seznam_hodnot) ... minimum v řádku
35
Jazyk SQL
Funkce řetězcové:
řetězec1 || řetězec2 LENGHT(řetězec)SUBSTR(řetězec,pozice,délka) ... výběr podřetězceINSTR(řetězec,podřetězec,pozice,pořadí)UPPER(řetězec)LOWER(řetězec)TO_NUMBER(řetězec) ... konverze text -> čísloTO_CHAR(řetězec[,formát]) ... datum či číslo -> textTO_DATE(řetězec[,formát]) ... text či číslo -> datumLPAD(řetězec,délka,[,znak]) ... doplní zlevaRPAD(řetězec,délka,[,znak]) ... doplní zpravaLTRIM(řetězec,množ_znaků) ... vypustí zlevaRTRIM(řetězec,množ_znaků) ... vypustí zpravaDECODE(sl,vzor1,obraz1,...,implic) ... překlad tabulkou
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éno fce kateg
Adam Alois doc 2
Beran Bedřich topič 4
Čermák Cyril asist 1
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) odkudFROM Včelaři;
jméno odkud
Adam Alois Praha
Beran Bedřich U pošty 15, Dobřichovice
Čermák Cyril Praha
Poznámka: Funkcí DECODE je možno docílit nehomogenních sloupců.
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
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_tabulekGROUP BY seznam_sloupců
Příklad: Najděte průměrné množství medu v jednotlivých okresech.
SELECT okres, AVG(medu)FROM VčelařiGROUP BY okres;
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 ... 100 Opava 150
Gajdoš ... Opava ... 230 Bruntál 36
.. ...
Adam ... Bruntál ... 320 Ostrava 78
...
Žižka ... Ostrava ... 125
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 ZamGROUP BY kat, funkce;
kat fce COUNT(*) AVG(plat)
401 prog 3 8700
401 doc 7 7800
401 asist 12 6500
402 prof 2 8900
... ...
403 prof 1 9900
... ...
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 ZamGROUP BY kat, funkceHAVING COUNT(*) > 25;
43
Jazyk SQL
Příklad: Najděte katedry, kde jsou alespoň 2 sekretářky.
SELECT kat, COUNT(*)FROM ZamWHERE funkce = ‘sekretářka’GROUP BY katHAVING COUNT(*) >= 2;
Příklad: Najděte katedry s průměrným platem asistenta > 5000.
SELECT kat, AVG(plat)FROM ZamWHERE funkce = ‘asist’GROUP BY katHAVING AVG(plat) > 5000;
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
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
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
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řiWHERE 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 ZamWHERE funkce = ‘doc’);
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řiWHERE okres = ‘Ústí’);
SELECT jméno, adresaFROM VčelařiWHERE medu > (SELECT MIN(medu)
FROM VčelařiWHERE okres = ‘Ústí’);
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řiWHERE okres = ‘Ústí’);
SELECT jméno, adresaFROM VčelařiWHERE včel > (SELECT MAX(včel)
FROM VčelařiWHERE okres = ‘Ústí’);
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řiGROUP BY okresHAVING 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
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 je1. zapsat dotaz jako výraz relačního kalkulu včetně FORALL2. pak jej mechanicky přepsat do SQL
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
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
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
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
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řiSELECT * FROM Včelaři WHERE okres = ‘Ostrava’;
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 ZamSET plat = plat * 1.2WHERE jméno IN (SELECT jméno FROM Odměny);
Příklad: Zaměstnanci ze seznamu NoZam (jmeno) dostali výpověď.
DELETE FROM ZamWHERE jméno IN (SELECT jméno FROM NoZam);
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 ASSELECT {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
Jazyk SQL Pohledy
Příklad: Aplikace potřebuje jméno, adresu a medu včelařů z Ostravy.
CREATE VIEW Ostraváci ASSELECT jméno, adresa, meduFROM VčelařiWHERE okres = ‘Ostrava’;
Příklad: Jiná úloha potřebuje všechny údaje z obou tabulek včelaři i med.
CREATE VIEW Všichni ASSELECT *FROM Včelaři V, med MWHERE 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ě) ASSELECT jméno, plat, plat*12FROM Zam;
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
Jazyk SQL
Přidělení přístupového práva
GRANT tabulkové_právoON { 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
Jazyk SQL Odebrání přístupového práva
REVOKE tabulkové_právoON { 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
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
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énoFROM 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énoFROM ZamWHERE vzdělání CONTAINS RT(univerzita) AND jazyky CONTAINS ‘angličtina’ AND ‘němčina’
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
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
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
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
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
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
Jazyk QBE
Příklad: Relace Zam(osob, jméno, adresa, plat).
Po volbě tabulky se zobrazí prázdný řádek tabulky.
Zam osob jméno adresa plat
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
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
Zam osob jméno adresa plat
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ě.
Zam osob jméno adresa plat
P._x Opava
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ů.
Zam osob jméno adresa plat
P. P.ALL._Novák P._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é.
Zam osob jméno adresa plat
P.ALL._x P._y
Zam osob jméno adresa plat
P. P.
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ž 3500.
Zam osob jméno adresa plat
P. P. P. < 3500
5. Konjunkce více podmínek se píše do řádku vedle sebe.
Najděte zaměstnance mimo Ostravu s platem větším než 10000.
Zam osob jméno adresa plat
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
Jazyk QBE
Příklad: Najdi jména a osobní čísla zaměstnanců s platem 3000 - 4000.
6. 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é:
Zam osob jméno adresa plat
P._xP._x
P._y P._y
>3000<4000
• nebo se seznam podmínek píše na oddělený čárkou.
Zam osob jméno adresa plat plat
P. P. >3000 <4000
Zam osob jméno adresa plat
P._x P._y >3000,<4000
76
Jazyk QBE
Příklad: Najdi zaměstnance s platem pod 3000 nebo nad 30000.
7. 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.
Zam osob jméno adresa plat
P._xP._y
< 3000>30000
Zam osob jméno adresa plat
P. P.AO(2) P.DO(1)
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.
Zam osob jméno adresa plat
_x P._z
Děti jmeno_d rč osob
P._y _x
Zam kat osob jméno adresa plat
P.G. SUM._x