Tma 10 Relan model dat a jazyk SQL

  • Slides: 53
Download presentation
Téma 10 – Relační model dat a jazyk SQL Obsah 1. 2. 3. 4.

Téma 10 – Relační model dat a jazyk SQL Obsah 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Relační algebra Operace relační algebry Rozšíření relační algebry Hodnoty null Úpravy relací Stručný úvod do SQL a relace Základní příkazy SQL Hodnoty null a tříhodnotová logika v SQL Příkazy SQL pro modifikaci obsahu databází A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 1

K čemu relace? • Viděli jsme tabulky. Proč potřebujeme něco jiného? • Je k

K čemu relace? • Viděli jsme tabulky. Proč potřebujeme něco jiného? • Je k tomu řada důvodů: – Potřeba rigorózního matematického modelu – Model umožní formalizaci databázových operací – Přesný model je potřebný k tvorbě deklarativně formulovaných dotazů a k optimalizaci jejich provádění • Hlavní myšlenkou je popsat databázi jako souhrn logických predikátů nad konečnou množinou predikátových proměnných a definovat tak omezení na přípustné hodnoty a kombinace hodnot A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 2

Co to je relace? • Matematicky: Jsou dány množiny D 1, D 2, …,

Co to je relace? • Matematicky: Jsou dány množiny D 1, D 2, …, Dn, pak relací R rozumíme podmnožinu kartézského součinu D 1 x D 2 x … x Dn. Relace tedy je množina n-tic (a 1, a 2, …, an), kde ai Di • Příklad: – klient_jmeno = – klient_ulice ulic*/ – klient_mesto měst */ – pak r = = {Novák, Mates, Braun, Novotný …} /* množna jmen klientů */ {Spálená, Hlavní, Horní, …} /* množina jmen = {Praha, Brno, Nymburk, …} /* množina jmen { (Novák, Spálená, Praha), (Mates, Horní, Brno), (Braun, Hlavní, Brno), (Novotný, Horní, Nymburk) } je relace, tj. podmnožina klient_jmeno x klient_ulice x klient_mesto • Vzhledem k tomu, že jde vždy o konečné množiny, lze je vyjádřit výčtem, tedy tabulkami A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 3

Relace je podmnožina kartézského součinu • V množinách neexistuje duplicita Bush – Velmi důležité

Relace je podmnožina kartézského součinu • V množinách neexistuje duplicita Bush – Velmi důležité pro databázové aplikace Clinton Příjmení • Prvky množiny mohou být v jakémkoliv pořadí Carter – neexistuje uspořádání Jefferson Kenedy Lincoln Obama Roosevelt Thomas Theodore John Jimmy George Franklin Bill Barac Abraham Washington Jména Vybraní američtí prezidenti A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 4

Typy atributů • Každý atribut v relaci má své jméno • Množina přípustných hodnot

Typy atributů • Každý atribut v relaci má své jméno • Množina přípustných hodnot atributu je definiční doménou atributu • Hodnoty atributu jsou (téměř vždy) atomické, tj. dále nedělitelné – Např. hodnotou atributu „číslo_účtu“ smí být číslo jednoho účtu, nikoliv množina čísel účtů • Speciální hodnota null patří do každé domény – prázdná (nezadaná) hodnota – null značně komplikuje definici mnoha množinových operací, a proto zpočátku tuto hodnotu budeme ignorovat • důsledky uvedeme později A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 5

Relační schéma a instance • Relační schéma – A 1, A 2, …, An

Relační schéma a instance • Relační schéma – A 1, A 2, …, An jsou atributy – R = (A 1, A 2, …, An ) je relační schéma Příklad: Klient_schema = (klient_jmeno, klient_ulice, klient_mesto) – r(R) značí relaci r nad relačním schématem R Příklad: klient (Klient_schema) • Instance relace (relační instance) – Skutečné hodnoty (relační instance) jsou definovány výčtem, tj. tabulkou – Prvek t relace r je n-tice, reprezentovaná řádkem tabulky atributy (tj. sloupce) klient_jmeno Novák Novotný Braun Mates A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 klient_ulice Spálená Horní Hlavní Horní klient_mesto Praha Nymburk Brno n-tice (řádky) Relační model dat a jazyk SQL 6

Klíče (znovu) • Nechť K R. K je superklíč schématu R, když hodnoty K

Klíče (znovu) • Nechť K R. K je superklíč schématu R, když hodnoty K stačí k jednoznačné identifikaci r(R) – Např. {klient_jmeno, klient_mesto} je superklíčem pro schéma Klient_schema. Superklíčem je však i {klient_jmeno} • K je kandidát na klíč jestliže K je minimální superklíč – Např. {klient_jmeno} je kandidátem na klíč pro schéma Klient_schema, neboť je to superklíč a žádná „podmnožina“ již superklíčem není • Primární klíč je vybrán mezi kandidátními klíči tak, aby se během „života“ příslušné relace neměnil – Např. {klient_jmeno} může sloužit jako primární klíč pro naši instanci relace, avšak když přijde další Novák, všechno bude špatně • e-mailová adresa může být primárním klíčem, avšak lidé svůj e-mail občas mění (což je jiný typ komplikace) A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 7

Cizí klíče • Relační schéma může obsahovat atribut, který koresponduje s primárním klíčem v

Cizí klíče • Relační schéma může obsahovat atribut, který koresponduje s primárním klíčem v jiné relaci. Takový atribut se nazývá cizí klíč – Např. atributy customer_name a account_number relačního schématu depositor jsou cizí klíče do customer a account – Hodnotami cizího klíče v referencující (odkazující) relaci smí být jen ty hodnoty, které se vyskytují jako primární klíč v relaci referencované (odkazované) • Důležitý typ omezení – referenční integrita branch account depositor customer branch_name account_number customer_name branch_city assets branch_name balance customer_name account_number loan borrower loan_number customer_name loan_number branch_name amount A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 customer_street customer_city Relační model dat a jazyk SQL 8

Relační algebra • Relační algebra je vlastně procedurální jazyk • Šest základních operátorů –

Relační algebra • Relační algebra je vlastně procedurální jazyk • Šest základních operátorů – Selekce (restrikce) • Výběr jen některých prvků relace – Projekce: • Výběr jen určitých atributů – Sjednocení: • Spojení několika relací v jednu (spojované relace musí mít stejné schéma) – Rozdíl (množin): – • Výběr těch prvků první relace, které nejsou obsaženy v druhé relaci – Kartézský součin: x • Klasická množinová operace – Přejmenování: • Změna jména jednoho či více atributů • Všechny tyto operátory pracují s jednou nebo dvěma relacemi a vytváří relaci novou A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 9

Selekce • Zápis p(r) – p je selekční predikát • Definice p(r) = {t

Selekce • Zápis p(r) – p je selekční predikát • Definice p(r) = {t | t r p(t)} Selekční predikát p je výroková formule složená z termů propojených logickými operátory: (and), (or), (not) Každý term má tvar: atribut op atribut nebo konstanta , kde op je jeden z =, , >, , <, • Příklad selekce: klient_mesto=“Praha” (klient) A B C D r A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 1 5 12 23 7 7 3 10 A B C D A=B D > 5 (r) 1 7 23 10 Relační model dat a jazyk SQL 10

Projekce • Zápis: kde A 1, A 2 jsou jména atributů a r je

Projekce • Zápis: kde A 1, A 2 jsou jména atributů a r je jméno relace • Výsledek je definován jako relace s k atributy („sloupci“) vytvořená z relace r výběrem pouze vyjmenovaných atributů – Tedy vynecháním zbývajících (neuvedených) atributů – Duplicitní „řádky“ jsou odstraněny – relace jsou množiny! • Příklad: V relaci klient nás nezajímá atribut klient_ulice klient_jmeno, klient_mesto (klient) r A B C A C 1 1 1 2 A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 10 20 30 40 1 1 1 2 A, C (r) = A C 1 1 2 Relační model dat a jazyk SQL 11

Sjednocení • Zápis: r s • Definice: r s = {t | t r

Sjednocení • Zápis: r s • Definice: r s = {t | t r t s} • Relace r a s musí být kompatibilní, tj 1. r a s musí mít stejnou aritu (počet atributů) 2. Domény atributů musí být po řadě shodné • Např. druhý atribut relace r a druhý atribut relace s musí mít shodný datový typ • Příklad: – najít všechny zákazníky banky, kteří mají vklad nebo půjčku customer_name (depositor) customer_name (borrower) Relace r, s: A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 A B 1 2 1 2 3 r s r s: A B 1 2 1 3 Relační model dat a jazyk SQL 12

Rozdíl • Zápis: r – s • Definice: r – s = {t |

Rozdíl • Zápis: r – s • Definice: r – s = {t | t r t s} • Relace vstupující do množinového rozdílu musí opět být vzájemně kompatibilní Relace r, s: A B 1 2 1 2 3 r A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 s r – s: A B 1 1 Relační model dat a jazyk SQL 13

Kartézský součin • Zápis: r x s • Definice: r x s = {t

Kartézský součin • Zápis: r x s • Definice: r x s = {t q | t r q s} Předpokládejme, že atributy r(R) a s(S) jsou disjunktní tj. , R S = . – Lze použít i na více než dvě relace – Nejsou-li atributy disjunktní, tzn. některé atributy r(R) mají stejné jméno jako jména atributů v s(S), musí se použít operace přejmenování A Relace r, s: B 1 2 r C D E 10 10 20 10 a a b b s • POZOR: Mohou vznikat tabulky gigantické velikosti A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 r x s: A B C D E 1 1 2 2 10 10 20 10 a a b b Relační model dat a jazyk SQL 14

Operace přejmenování • Pomocná operace – Fakticky nejde o pravou operaci relační algebry, zavádí

Operace přejmenování • Pomocná operace – Fakticky nejde o pravou operaci relační algebry, zavádí se z pragmatických důvodů – Umožňuje nově pojmenovat (a tím i referencovat) výsledek jiné relační operace – Umožňuje též pojmenovat relaci více jmény • Příklad: vrátí výsledek výrazu E pod jménem X – Jestliže relační výraz E má aritu n, pak vrátí výsledek výrazu E pod jménem X s atributy přejmenovanými na A 1 , A 2 , …. , An. A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 15

Skládání operací • Skutečně užitečné relační operace vzniknou skládáním operací základních r x s:

Skládání operací • Skutečně užitečné relační operace vzniknou skládáním operací základních r x s: A=C(r x s): A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 A B C D E 1 1 2 2 10 10 20 10 a a b b A B C D E 1 2 2 10 10 20 a a b Relační model dat a jazyk SQL 16

Příklad bankovní databáze • Relace – – – branch(branch_name, branch_city, assets) customer(customer_name, customer_street, customer_city)

Příklad bankovní databáze • Relace – – – branch(branch_name, branch_city, assets) customer(customer_name, customer_street, customer_city) account(account_number, branch_name, balance) loan(loan_number, branch_name, amount) depositor(customer_name, account_number) borrower(customer_name, loan_number) • Příklady dotazů – Najdi všechny půjčky (loan) přes 1200 – Najdi čísla půjček vyšších než 1200 – Najdi jména zákazníků majících vkladový účet v pobočce Nymburk A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 17

Příklad bankovní databáze (2) • Další příklady dotazů – Najdi jména zákazníků majících půjčku

Příklad bankovní databáze (2) • Další příklady dotazů – Najdi jména zákazníků majících půjčku v pobočce ‘Nymburk’ a při tom nemají vkladový účet v žádné pobočce – Najdi jména zákazníků, kteří mají půjčku vedenou v pobočce Nymburk • 1. možnost • 2. možnost A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 18

Příklad bankovní databáze (3) • Příklady dotazu (použití operace přejmenování) – Najdi největší zůstatek

Příklad bankovní databáze (3) • Příklady dotazu (použití operace přejmenování) – Najdi největší zůstatek vkladového účtu – Strategie: • Najdi zůstatky, které nejsou největší • K tomu účelu přejmenuj relaci account na temp, abychom mohli porovnávat jednotlivé zůstatky se všemi ostatními • Použij množinový rozdíl k nalezení těch zůstatků, které nejsou mezi těmi, které jsme určili v předchozím kroku – Dotaz pak vypadá takto: Пbalance(account) – Пaccount. balance (σaccount. balance < temp. balance (account x ρtemp(account) ) ) A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 19

Doplňkové operace, průnik • Z praktických důvodů se definují další operátory, které umožňují zjednodušení

Doplňkové operace, průnik • Z praktických důvodů se definují další operátory, které umožňují zjednodušení častých dotazů do databáze – – Průnik Přirozené spojení (spojení přes rovnost) Dělení Přiřazení • Průnik – Zápis: r s – Definice: r s={t|t r t s} – Předpoklad: Relace r a s jsou vzájemně kompatibilní – Poznámka: r s = r – (r – s) A B Relace r, s: 1 2 1 2 3 r A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 r s: A B 2 s Relační model dat a jazyk SQL 20

Přirozené spojení • Zápis: r ⋈ s • Nechť r a s jsou relace

Přirozené spojení • Zápis: r ⋈ s • Nechť r a s jsou relace podle schémat R a S. r ⋈ s je pak relace podle schématu R S vytvořená jako: – Uvažme všechny páry n-tic tr z r a ts z s – Jestliže tr a ts mají stejné hodnoty všech atributů z R S, pak n-tice t se objeví ve výsledku, přičemž t má stejné hodnoty atributů jako tr na r a t má stejné hodnoty atributů jako ts na s • Výsledek přirozeného spojení je tedy množina všech kombinací „řádků“ z R a S, které mají shodné hodnoty stejnojmenných atributů • Příklad: R = (A, B, C, D) S = (E, B, D) – Výsledné schéma = (A, B, C, D, E) – r ⋈ s pak je: A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 21

Přirozené spojení – příklad • Relace r, s: A B C D B D

Přirozené spojení – příklad • Relace r, s: A B C D B D E 1 2 4 1 2 a a b 1 3 1 2 3 a a a b b r • Praktický příklad A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 r⋈s: A B C D E 1 1 2 a a b s Relační model dat a jazyk SQL 22

 • Zápis: r s Operace dělení • Určeno pro dotazy obsahující frázi „pro

• Zápis: r s Operace dělení • Určeno pro dotazy obsahující frázi „pro všechny“ – Nechť r a s jsou relace podle schémat R a S, kde R = (A 1, …, Am , B 1, …, Bn ) a S = (B 1, …, Bn) – Výsledkem r s je relace dle schématu R – S = (A 1, …, Am) r s = { t | t R-S (r) u s (tu r) }, kde tu značí zřetězení „řádků“ t a u chápané jako jediná n-tice • Vlastnost – Nechť q = r s, pak q je největší relace splňující q x s r • Definice pomocí základních operací relační algebry – Nechť r(R) a s(S) jsou relace a nechť S R r s = R-S (r) – R-S (( R-S (r) x s) – R-S, S(r)) • R-S, S (r) přeuspořádá atributy r • R-S (r) x s ) – R-S, S(r)) dá ty n-tice t z R-S (r), pro které platí, že některá n-tice u s je taková, že tu r A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 23

Operace dělení – příklad • Relace r, s: A B 1 2 3 1

Operace dělení – příklad • Relace r, s: A B 1 2 3 1 1 1 3 4 6 1 2 ε ε r s: B A 1 2 s r • Praktický příklad A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 24

Přiřazovací operace • Přiřazovací operace ( ) umožňuje pohodlný zápis složitých výrazů – Dovoluje

Přiřazovací operace • Přiřazovací operace ( ) umožňuje pohodlný zápis složitých výrazů – Dovoluje zapisovat „dotazy“ ve formě sekvence programových příkazů tvaru série přiřazení následovaných snáze čitelnými výrazy – Přiřazuje se vždy vhodné pracovní „proměnné typu relace“ – Pracovní proměnné jsou pak dostupné v dalších výrazech • Příklad: Operaci dělení r s lze zapsat jako temp 1 R-S (r) temp 2 R-S ((temp 1 x s) – R-S, S (r)) vysledek = temp 1 – temp 2 A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 25

Příklad bankovní databáze – další dotazy • Najdi jména všech zákazníků, kteří mají současně

Příklad bankovní databáze – další dotazy • Najdi jména všech zákazníků, kteří mají současně vkladový účet a půjčku customer_name (borrower) customer_name (depositor) • Najdi jména zákazníků, kteří mají půjčku, a výši této půjčky customer_name, loan_number, amount (borrower ⋈ loan) • Najdi jména všech zákazníků, kteří mají vkladový účet v pobočce Nymburk nebo Benešov – Možnost 1 customer_name ( branch_name = “Nymburk” (depositor ⋈ account)) customer_name ( branch_name = “Benešov” (depositor ⋈ account)) – Možnost 2 customer_name, branch_name (depositor ⋈ account) temp(branch_name) ({ (“Nymburk”), (“Benešov”)}) • Všimněme si, že Možnost 2 používá „konstantní relaci“ temp ve funkci dělitele při dělení – ptáme se totiž „pro všechny uvedené pobočky“ A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 26

Pragmatická rozšíření relačních operátorů • Pro často kladené dotazy se zavádějí rozšířené operace –

Pragmatická rozšíření relačních operátorů • Pro často kladené dotazy se zavádějí rozšířené operace – Zobecněná projekce – Agregátní funkce – Vnější spojení (Outer Join) • Zobecněná projekce zavádí aritmetické funkce do seznamu možných výstupních atributů – E je relační výraz a F 1, F 2, …, Fn jsou aritmetické výrazy zahrnující atributy ze schématu výrazu E a konstanty – Takto se získají odvozené (počítané) atributy • Příklad: – Relace credit_info(customer_name, limit, credit_balance), – Urči, kolik může každá osoba ještě utratit: customer_name, limit – credit_balance (credit_info) A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 27

Agregátní funkce a operace • Agregátní funkce pracují s kolekcí hodnot a vrací jedinou

Agregátní funkce a operace • Agregátní funkce pracují s kolekcí hodnot a vrací jedinou výslednou hodnotu avg: průměrná hodnota min: minimum max: maximum sum: součet hodnot count: počet hodnot • Agregátní operace relační algebry vytvářejí relaci se „syntetickými“ atributy a případným seskupováním prvků – E je relační výraz – G 1, G 2, …, Gm je seznam atributů, podle nich se má seskupovat (může být i prázdný) – Fi jsou agregátní funkce – Ai jsou jména atributů ze schématu, podle něhož je tvořen E A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 28

Příklad agregátních operací a funkcí • Relace r: A B C 7 7 3

Příklad agregátních operací a funkcí • Relace r: A B C 7 7 3 10 sum(C)(r): sum(C) 27 • Relace account seskupená podle branch_name: branch_name account_number balance Nymburk Praha 1 Benešov branch_name sum(balance)(account): A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 A-102 A-201 A-217 A-215 A-222 400 900 750 700 branch_name sum(balance) Nymburk Praha 1 Benešov 1300 1500 700 Relační model dat a jazyk SQL 29

Vnější spojení • Vnější spojení je operace, která rozšiřuje přirozené spojení a zamezuje „ztrátě

Vnější spojení • Vnější spojení je operace, která rozšiřuje přirozené spojení a zamezuje „ztrátě informace“ – Určí se přirozené spojení a pak se přidají prvky z jedné ze spojovaných relací, které nesplňují požadavky na rovnost stejnojmenných atributů – Podle toho, ze které relace se přidávají prvky, rozlišuje se levé vnější spojení a pravé vnější spojení – Lze též přidat prvky z obou spojovaných relací a pak jde o plné vnější spojení – Při doplňování mohou vznikat prvky s neznámými nebo nedefinovanými hodnotami, jejichž reprezentaci se zavádí hodnota null A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 30

Typy a příklady vnějšího spojení přirozené spojení ⋈ levé vnější spojení pravé vnější spojení

Typy a příklady vnějšího spojení přirozené spojení ⋈ levé vnější spojení pravé vnější spojení plné vnější spojení A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 31

Hodnoty Null • null se užívá pro neznámou hodnotu nebo pro označení situace, že

Hodnoty Null • null se užívá pro neznámou hodnotu nebo pro označení situace, že hodnota neexistuje – Aritmetický výraz obsahující null dává výsledek null – Agregátní funkce ignorují hodnoty null – Pro eliminaci duplikátů a seskupování se null uvažuje jako jakákoliv jiná hodnota; dvě null hodnoty se považují za identické • Predikáty zahrnující null vyžadují tříúrovňovou logiku s doplňkovou hodnotou unknown – Logika s pravdivostní hodnotou unknown: • OR: (unknown or true) (unknown or false) (unknown or unknown) • AND: (true and unknown) (false and unknown) (unknown and unknown) • NOT: (not unknown) = true, = unknown, = false, = unknown – Selekční predikát vyhodnocený jako unknown se považuje za false A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 32

Modifikace relací v databázi • K modifikaci obsahu databáze potřebujeme operace – Deletion (výmaz

Modifikace relací v databázi • K modifikaci obsahu databáze potřebujeme operace – Deletion (výmaz = odstranění prvku z relace) – Insertion (vložení prvku do relace) – Updating (aktualizace – změna prvku v relaci) • Vše se realizuje operátorem přiřazení • Výmaz (deletion) r r–E kde r je relace a E je relační výraz určující mazané prvky – Příklady • Vymaž všechny záznamy v pobočce Benešov account – branch_name = “Benešov”(account ) • Vymaž všechny záznamy o půjčkách se zůstatkem 0 až 50 loan – amount 0 and amount 50(loan) A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 33

Vložení • Vložení v relační algebře je opět přiřazení r r E kde r

Vložení • Vložení v relační algebře je opět přiřazení r r E kde r je relace, do níž vkládáme a E je relační výraz – Vložení jediného prvku se realizuje tak, že E bude konstantní výraz popisující prvek – Vložit lze najednou i více prvků, pokud E bude relační výraz kompatibilní s r • Příklad – Vlož do databáze informaci, že zákazník Kovář má účet A-973 se zůstatkem 1200 v pobočce Benešov account {(“A-973”, “Benešov”, 1200)} depositor {(“Kovář”, “A-973”)} A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 34

Aktualizace • Mechanismus pro změnu hodnoty zvolených atributů, aniž by se měnily hodnoty všech

Aktualizace • Mechanismus pro změnu hodnoty zvolených atributů, aniž by se měnily hodnoty všech atributů – Použije se zobecněná projekce – Fi je buď • i-tý atribut r, pokud i-tý atribut nemá být změněn, nebo • Fi je výraz sestavěný z konstant a atributů r, který dává novou hodnotu atributu • Příklady – Připočti úrok 5% account_number, branch_name, balance * 1. 05 (account) – Přičti úrok 6% k účtům se zůstatkem přes 10. 000 a 5% ke všem ostatním account_number, branch_name, balance * 1. 06 ( balance 10000 (account )) account_number, branch_name, balance * 1. 05 ( balance 10000 (account)) A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 35

Strukturovaný dotazovací jazyk SQL • Structured Query Language (SQL) – jazyk pro kladení dotazů

Strukturovaný dotazovací jazyk SQL • Structured Query Language (SQL) – jazyk pro kladení dotazů do databáze – obsahuje jak příkazy DML (manipulace s daty), tak i pro definici dat (DDL) • Svojí syntaxí připomíná přirozenou angličtinu • SQL se opírá o výrazy relační algebry • Existuje mnoho dialektů SQL – liší se různými rozšířeními či speciálními agregátními funkcemi – skladba vestavěných predikátů se rovněž může lišit • Probereme jen základní konstrukty jazyka – konkrétní varianty vždy závisí na příslušném dialektu použitého databázového systému • Poznámka k syntaxi – SQL identifikátory a jména atributů NEROZLIŠUJÍ malá a velká písmena (tj. Branch_Name ≡ BRANCH_NAME ≡ branch_name A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 36

Konstrukce create table • Relace v SQL je definována příkazem create table r (A

Konstrukce create table • Relace v SQL je definována příkazem create table r (A 1 D 1, A 2 D 2, . . . , An Dn, (integritní-omezení 1), . . . , (integritní-omezeník)) – r je jméno vytvářené relace – Ai jsou jména atributů schématu relace r – Di jsou příslušné datové typy hodnot domén atributů Ai • Integritní omezení jsou standardně tvaru – not null – primary key(A 1, . . . , AL ) • Příklad create table branch ( branch_name char(15) not null, branch_city char(30), assets integer, primary key(branch_name) ) A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 37

Základní struktura SQL dotazu • Typický SQL dotaz má tvar: select A 1, A

Základní struktura SQL dotazu • Typický SQL dotaz má tvar: select A 1, A 2, . . . , An from R 1, R 2, . . . , Rm where p – Ai jsou atributy, Ri jsou relace a p je predikát • Tento dotaz je ekvivalentní relačnímu výrazu – Výsledek dotazu je relace • Důležité poznatky – SQL je deklarativní (dotazovací) jazyk, zatímco relační algebra je procedurální – Zobrazení SQL dotazů na relační výrazy převádí deklarativní dotazy na procedury – Provedení („výpočet výsledku“) dotazu bude implementovat procedury operací relační algebry A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 38

Klauzule select • Klauzule select uvádí atributy výsledné relace dotazu – odpovídá relační operaci

Klauzule select • Klauzule select uvádí atributy výsledné relace dotazu – odpovídá relační operaci projekce • Příklady: – Získej jména poboček z relace (tabulky) loan: select branch_name from loan – V relační algebře branch_name (loan) • Na rozdíl od relací SQL připouští duplikáty v relacích i ve výsledcích dotazů – To narušuje relační model, avšak může výrazně zrychlit zpracování • Eliminaci duplikátů lze vynutit použitím klíčového slova distinct ¨za select. – Získej jména poboček z relace (tabulky) loan a odstraň duplikáty select distinct branch_name from loan – Naopak klíčové slovo all explictině říká, aby se duplikáty ponechaly select all branch_name from loan A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 39

Klauzule select (pokr. ) • Hvězdička v klauzuli select značí “všechny atributy” select from

Klauzule select (pokr. ) • Hvězdička v klauzuli select značí “všechny atributy” select from loan • Klauzule select může obsahovat aritmetické výrazy obsahující operace +, –, , / a konstanty nebo atributy • Dotaz select loan_number, branch_name, amount 100 from loan vrátí relaci shodnou s loan až na to, hodnota atributu amount bude vynásobena 100 – Jde vlastně o zobecněnou projekci loan_number, branch_name, amount 100(loan) A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 40

Klauzule where • Klauzule where určuje podmínky, které musí splňovat výsledek – Odpovídá selekčnímu

Klauzule where • Klauzule where určuje podmínky, které musí splňovat výsledek – Odpovídá selekčnímu predikátu relační algebry • Příklad – Najdi čísla půjček z pobočky Benešov vyšší než 1200 select loan_number from loan where branch_name="Benešov" and amount>1200 • Porovnání – Výsledky mohou být kombinovány logickými spojkami and, or a not – Porovnání lze aplikovat i na výsledky aritmetických výrazů – SQL zahrnuje i porovnávací operátor between • Např. : Najdi čísla půjček se zůstatky mezi 90. 000 a 100. 000 (tj. 90. 000 a 100. 000) select loan_number from loan where amount between 90000 and 100000 což odpovídá relačnímu výrazu loan_number( (amount ≥ 90000) (amount ≤ 100000)(loan)) A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 41

Klauzule from • Klauzule from uvádí seznam relací, kterých se dotaz týká – Odpovídá

Klauzule from • Klauzule from uvádí seznam relací, kterých se dotaz týká – Odpovídá kartézskému součinu relací – Příkaz select from borrower, loan vrátí kartézský součin relací borrower x loan – Najdi jména, čísla půjček a výši dluhů všech zákazníků majících půjčku v pobočce Nymburk select customer_name, borrower. loan_number, amount from borrower, loan where borrower. loan_number = loan_number and branch_name = "Nymburk" odpovídá relačnímu výrazu customer_name, borrower. loan_number, amount ( borrower. loan_number = loan_number branch_name="Nymburk" (borrower x A 3 B 33 OSD loan)) (J. Lažanský) 42 verze: Jaro 2013 Relační model dat a jazyk SQL

Operace přejmenování • SQL umožňuje relace a atributy pomocí klauzule as old-name as new-name

Operace přejmenování • SQL umožňuje relace a atributy pomocí klauzule as old-name as new-name – Najdi jména, čísla půjček a dlužné částky všech zákazníků a pojmenuj sloupec loan_number jako loan_id select customer_name, borrower. loan_number as loan_id, amount from borrower, loan where borrower. loan_number = loan_number • Domácí úkol: – Přepište tento dotaz do formy relačního výrazu A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 43

n-tice jako proměnné • Proměnné ve tvaru n-tic se definují jako proměnné v klauzuli

n-tice jako proměnné • Proměnné ve tvaru n-tic se definují jako proměnné v klauzuli from s použitím klauzule as • Příklad – Najdi jména zákazníků, čísla jejich půjček a výši dluhů přes všechny pobočky select customer_name, T. loan_number, S. amount from borrower as T, loan as S where T. loan_number = S. loan_number – Najdi jména poboček, které mají součet vkladů (assets) větší některá z poboček v Praze 1 select distinct T. branch_name from branch as T, branch as S where T. assets > S. assets and S. branch_city = "Praha 1" A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 44

SQL připouští duplikáty • Pro zajištění dobré analogie SQL a množinového modelu potřebujeme tzv.

SQL připouští duplikáty • Pro zajištění dobré analogie SQL a množinového modelu potřebujeme tzv. multisety – Multiset je množina s opakujícími se prvky • Potřebujeme multisetové verze relačních operátorů mezi relacemi r 1 a r 2 – (r 1): Je-li c 1 kopií n-tice t 1 v r 1, a t 1 splňuje selekční predikát , , pak bude c 1 kopií t 1 v (r 1). – A (r ): Pro každou kopii t 1 v r 1 bude kopie A (t 1) i v A (r 1) – r 1 x r 2: Je-li c 1 kopií t 1 v r 1 a c 2 kopií t 2 v r 2, pak bude c 1 c 2 kopií n-tice t 1 t 2 v r 1 x r 2 • Příklad: – Multisetové relace r 1 (A, B) a r 2 (C) jsou r 1 = {(1, a) (2, a)} r 2 = {(2), (3)} – Pak B(r 1) bude {(a), (a)}, a B(r 1) x r 2 dá {(a, 2), (a, 3), (a, 3)} • SQL sémantika příkazu select A 1, , A 2, . . . , An from r 1, r 2, . . . , rm where P je ekvivalentní multisetové verzi výrazu A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 45

Množinové operace v SQL • Množinové operátory union, intersect a except jsou SQL ekvivalentem

Množinové operace v SQL • Množinové operátory union, intersect a except jsou SQL ekvivalentem relačních (množinových) operací a – Najdi zákazníky mající vkladový účet nebo půjčku (nebo oboje) (select customer_name from depositor) union (select customer_name from borrower) – Najdi zákazníky mající jak vkladový účet tak půjčku (select customer_name from depositor) intersect (select customer_name from borrower) – Najdi zákazníky mající vkladový účet a nemající půjčku (select customer_name from depositor) except (select customer_name from borrower) • SQL má dále operátor in, který testuje příslušnost či členství v množině – ekvivalent ∈ A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 46

Agregátní funkce v SQL • Tyto funkce pracují s multisety hodnot a vrací hodnotu

Agregátní funkce v SQL • Tyto funkce pracují s multisety hodnot a vrací hodnotu jedinou – jinak jsou shodné s dříve uvedenými agregátními funkcemi avg, min, max, sum a count • Najdi průměrný vklad v pobočce Benešov select avg(balance) from account where branch_name = "Benešov" • Urči počet vkladatelů select count (distinct customer_name) from depositor A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 47

Hodnoty null v SQL • Predikát is null slouží k testu null hodnot –

Hodnoty null v SQL • Predikát is null slouží k testu null hodnot – Např. : V relaci loan vyhledej čísla půjček s null hodnotou atributu amount select loan_number from loan where amount is null • Aritmetické operace zahrnující null dávají null – Např. : 5 + null vrací null • Agregátní funkce null hodnoty ignorují • Je zavedena tříhodnotová logika s unknown – Např. : 5 < null, null <> null nebo null = null se vždy vyhodnotí jako unknown • Konstrukt p is unknown se vyhodnotí jako pravdivý, pokud predikát p má hodnotu unknown A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 48

Vnořené dotazy • SQL má mechanismus pro vnořování dotazů (subquery) – někdy zvané pod-dotazy

Vnořené dotazy • SQL má mechanismus pro vnořování dotazů (subquery) – někdy zvané pod-dotazy • Vnořený dotaz má obvyklý tvar select-from-where, je však zanořen do jiného dotazu – Nejčastěji se používá k realizaci testu členství v relaci, porovnávání množin a určování kardinality relací • Příklad: – Najdi zákazníky mající jak vkladový účet tak i půjčku select distict customer_name from borrower where customer_name in (select customer_name from depositor) Vnořený dotaz A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 49

Pohledy • Často je nevhodné poskytovat uživateli všechna data – tedy celý logický model

Pohledy • Často je nevhodné poskytovat uživateli všechna data – tedy celý logický model databáze a všechny uložené relace – Bankovní úředník na jisté pozici potřebuje znát jméno zákazníka a pobočku, kde má půjčku, ne však výši půjčky. (select customer_name, branch_name from borrower, loan where borrower. loan_number = loan_number ) • Mechanismus pohledů (view) umožňuje skrýt určitá data – Lze tak vytvořit jakoukoliv relaci, která není součástí konceptuálního modelu a zpřístupnit ji uživateli jako "virtuální relaci". Taková "virtuální relace" se nazývá pohled. • Zavede se příkazem create view ve tvaru create view v as <formulace dotazu> kde v je jméno pohledu – Jakmile je pohled definován, jeho jméno lze používat jako zkratku celého definičního dotazu A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 50

SQL příkazy pro modifikaci databáze • Výmaz (deletion) – Příkaz má strukturu delete-from-where s

SQL příkazy pro modifikaci databáze • Výmaz (deletion) – Příkaz má strukturu delete-from-where s argumenty analogickými konstruktu select-from-where – Vymaž všechny vkladové účty v pobočce Nymburk delete from account where branch_name = ‘Nymburk‘ • Vložení (insertion) – insert into relace values <kompatibilní_relace> – Přidej záznam do tabulky account insert into account (branch_name, balance, account_number) values ('Beroun', 1200, 'A-9732') • Aktualizace (update) – update relace set atribut = výraz where podmínka – Přidej 6% prémie ke vkladovým účtům přes 1000 update account set balance = balance 1. 06 where balance > 1000 A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 51

Spojení relací v SQL • Základní syntaxe je r 1 <Typ> join r 2

Spojení relací v SQL • Základní syntaxe je r 1 <Typ> join r 2 on <podmínka> using (A 1, . . . ) – Úplná SQL syntaxe je popsána v příslušných dialektech a standardizace je jen částečná – Typicky se používá jako součást pod-dotazu v klauzuli from. • Typ spojení – "přívlastek" klíčového slova join – Jde o úplnou ekvivalenci se spojeními z relační algebry – Typy: inner join, left outer join, right outer join, full outer join • Spojovací podmínka – určuje, na základě čeho má dojít ke spojení a které atributy budou ve výsledném spojení • Příklad – Najdi všechny zákazníky, kteří mají buď půjčku nebo vkladový účet, ale ne oboje select customer_name from (depositor full outer join borrower ) where account_number is null or loan_number is null A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 52

Dotazy A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat

Dotazy A 3 B 33 OSD (J. Lažanský) verze: Jaro 2013 Relační model dat a jazyk SQL 53