Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

temata:33-relacni_datovy_model_sql:main [2011/03/28 21:29]
sgs
temata:33-relacni_datovy_model_sql:main [2011/06/02 17:36] (aktuální)
vagabund
Řádek 1: Řádek 1:
-=====Relační datový model a jazyk SQL=====+~~ODT~~
  
-====Jazyk SQL====+====== Relační datový model a jazyk SQL ====== 
 + 
 +===== Relační datový model ===== 
 + 
 +==== Relační databáze ==== 
 + 
 +<box round green 90%|**Názvosloví**> 
 + 
 +  * relace = databázová tabulka 
 +  * atributy = sloupce tabulky 
 +  * hodnota atributu = hodnota n-tice 
 +  * obor hodnot atributu = doména (v praxi se doméně říká též datový typ) 
 +  * aktivní doména = aktuálně se nacházející hodnoty z domény (to, co je aktuálně v tabulce) 
 +  * n-tice = řádky 
 +  * "tabulka STUDENT se sloupci JMENO, PRIJMENI, ..." = "relace STUDENT s atributy JMENO, PRIJMENI, ..." 
 + 
 +</box> 
 + 
 +<box round blue 90%|**Příklad**> 
 + 
 +Nechť máme tabulku STUDENT(LOGIN, JMENO, PRIJMENI, ADRESA) asi takto: 
 + 
 +^LOGIN^JMENO^PRIJMENI^ADRESA^ 
 +|xcerny00|Petr|Černý|Brněnská 15 Vyškov| 
 +|xnovak00|Jan|Novák|Cejl 9 Brno| 
 +|xnovak01|Pavel|Novák|Cejl 9 Brno| 
 + 
 +**domény atributů**\\ 
 +D<sub>LOGIN</sub> = {xnovak00, xnovak01, xbanan01, xchleba11, ...}\\ 
 +D<sub>JMENO</sub> = {Petr, Pavel, Josef, ...}\\ 
 +D<sub>PRIJMENI</sub> = {Grupa, Sadlo, Zendulka, ...}\\ 
 +D<sub>ADRESA</sub> = {Brněnská 15 Vyškov, Cejl 9 Brno, ...}\\ 
 + 
 +**relace = tabulka**\\ 
 +R<sub>STUDENT</sub> <m>\subset</m> D<sub>LOGIN</sub> x D<sub>JMENO</sub> x D<sub>PRIJMENI</sub> x D<sub>ADRESA</sub>\\ 
 +\\ 
 +neboli podmnožina kartézského součinu jednotlivých domén\\ 
 + 
 +  * schéma tabulky - záhlaví tabulky 
 +  * tělo tabulky - její obsah,tj. řádky, tj. n-tice 
 +  * domény mohou obsahovat pouze atomické hodnoty (vícehodnotové se převádí na skalární redundancí zbylých sloupců) 
 + 
 +</box> 
 + 
 +<box green round 90%|**Definice**> 
 +Nechť D1, D2, ..., Dn jsou množiny atomických hodnot označované jako //domény//. //Relace// (databázová) na doménách D1, D2, ..., Dn je dvojice **R** = (R, R<sup>*</sup>), kde R = R(A1:D1, A2:D2, ..., An:Dn) je //schéma// relace, kde Ai (Ai != Aj, i != j) značí jméno atributu definovaného na doméně D<sub>i</sub> a R<sup>*</sup> \subset D<sub>1</sub> x D<sub>2</sub> x ... x D<sub>n</sub> je tělo relace.\\ 
 + 
 +Počet atributů n relace se označuje //stupeň (řád) relace//, kardinalita těla relace m = |R<sup>*</sup>| se označuje //kardinalita relace//\\ 
 + 
 +Zjednodušené se relace zapisuje R(A1, A2, ..., An), třeba STUDENT(LOGIN, JMENO, PRIJMENI, ADRESA).  
 +</box> 
 + 
 +<note tip>Neboli viz příklad</note> 
 + 
 +<note tip>Relační databáze - data jsou v tabulkách organizovány v souladu s relačním modelem (relační model - data strukturována na základě relací, tj. tabulek)</note> 
 + 
 + 
 +<box green round 90%|**Definice**> 
 +Integritní omezení = omezení kladená na data 
 +  * obecná omezení - musí platit vždy bez ohledu na aplikaci (např. PK, FK) 
 +  * specifiká omezení - závislá na aplikace (maximální délka řetězce, maximální hodnota, ...) 
 +</box> 
 + 
 +<box green round 90%|**Definice**> 
 +**Kandidátní klíč (candidate key)** 
 + 
 +Atribut CK relace R se nazývá kandidátním klíčem, když splňuje tyto dvě časově nezávislé vlastnosti: 
 +  * Hodnoty atributu CK v relaci R jsou unikátní (jednoznačné), tj. neexistují žádné dvě n-tice relace se stejnou hodnotou tohoto atributu. 
 +  * Atribut CK je vzhledem k jednoznačnosti hodnot v R minimální (neredukovatelný), tj. je-li CK složeným atributem, nelze vypustit z něho žádnou složku, aniž by přestala být splněna unikátnost hodnot. 
 +</box> 
 + 
 +<note tip>Hodnota atributu CK je unikátná, to zn., že se prvek z dané domény vyskytuje nejvýše jednou</note> 
 + 
 +<box green round 90%|**Definice**> 
 +**Primární klíč (primary key)** 
 + 
 +//Primárním// klíčem je jeden z kandidátních klíčů (vybraný), zbývající kandidátní klíče se nazývají //alternativní// (někdy také sekundární). 
 +</box> 
 + 
 +<box green round 90%|**Definice**> 
 +**Pravidlo integrity entit** 
 + 
 +U žádné složky primárního klíče nesmí chybět hodnota. 
 +</box> 
 + 
 +<box green round 90%|**Definice**> 
 +**Cizí klíč (foreign key)** 
 + 
 +Atribut FK relace R2 se nazývá cizí klíč, právě když splňuje tyto časově nezávislé vlastnosti: 
 +  * Každá hodnota FK je buď plně zadaná nebo plně nezadaná. 
 +  * Existuje relace R1 s kandidátním klíčem CK takovým, že každá zadaná hodnota FK je identická s hodnotou CK nějaké n-tice relace R1 
 +</box> 
 + 
 +<note tip>Neboli hodnota je hodnota nebo NULL, za druhé pro každou hodnota FK musí existovat příslušní PK. Jinak FK vytváří logické vazby mezi tabulkami/relacemi</note> 
 + 
 +<box green round 90%|**Definice**> 
 +**Pravidlo referenční integrity** 
 + 
 +Relační databáze nesmí obsahovat žádnou nesouhlasnou hodnotu cizího klíče. 
 +</box> 
 + 
 +<box green round 90%|**Definice**> 
 +**Schématem relační databáze** nazýváme dvojici (R, I), kde R = {R1, R2, ..., Rk,} je množina schémat relací a I = {I1, I2, ..., Il} je množina 
 +integritních omezení. Někdy jsou lokální integritní omezení rozdělena mezi jednotlivá schémata, tj. R = {(R1, I1) , (R2, I2), ..., (Rk, Ik)} 
 +</box> 
 + 
 +<note tip>Neboli každý sloupce má svoje integritní omezení, tj. omezezení kladená na data (co může obsahovat, kde musí být hodnoty, ...)</note><note important>Pokud data v relaci splňují všechny integritní omezení, potom jsou data konzistentní</note> 
 + 
 +==== Relační Algebra ==== 
 + 
 +<box green round 90%|**Definice**> 
 +**Relační algebra** 
 + 
 +Relační algebrou rozumíme dvojici RA = (R, O), kde nosičem R je množina relací a O je množina operací, která zahrnuje: 
 +  * tradiční množinové operace (sjednocení, průnik, rozdíl, součin) 
 +  * speciální relační operace, mezi které patří projekce, selekce (restrikce), spojení (přirozené). 
 +</box> 
 + 
 +<note important>Tabulka je množina n-tic, proto se každý záznam vyskytuje pouze jednou.</note> 
 + 
 +<box green round 90%|**Definice**> 
 +**Operace relační algebry** 
 + 
 +//Sjednocením// relací R1 = (R, R1*) a R2 = (R, R2*) se schématem R je relace R1 union R2 = (R, R1* ∪ R2*).\\ 
 +Analogicky pro //průnik// (R1 intersect R2) a //rozdíl// (R1 minus R2).\\ 
 +//Kartézským součinem relací// R1 = (R1, R1*) a R2 = (R2, R2*) je relace R1 times R2 = ( (R1,R2), R1* x R2*).\\ 
 + 
 +</box> 
 + 
 +<note important>Sjednocení je možné provést pouze pro tabulky se stejnými sloupci. Pokud po sjednocení dostaneme dva a více stejných řádek, bere se jenom jeden.</note> 
 + 
 +<box green round 90%|**Definice**> 
 +**Projekce** 
 +Projekce relace R = (R, R*) na atributy X, Y, ..., Z je relace R[X, Y, ..., Z] se schématem (X, Y, ..., Z) a tělem zahrnujícím všechny n-tice t = (x, y, …, z) takové, že v R* existuje n-tice t’ s hodnotou atributu X rovnou x, Y rovnou y, ... Z rovnou z. 
 +</box> 
 + 
 +<note tip>Z dané tabulky vybereme jen některé sloupce</note> 
 + 
 +<box green round 90%|**Definice**> 
 +**Selekce** 
 + 
 +Nechť θ je operátor porovnání dvou hodnot (<, >, <>, =, atd.). θ selekce (restrikce) relace R = (R, R*) na atributech X a Y je relace\\ 
 +R where X θ Y,\\ 
 +která má stejné schéma jako relace R a obsahuje všechny n-tice t ∈ R*, pro které platí x θ y, kde x je hodnota atributu X a y hodnota atributu Y v ntici t. Na místě atributu X, resp. Y může být konstanta. Pak jde o θ selekci na atributu X, resp. Y. 
 + 
 +Podle definice máme jenom jednu podmínku. Selekci lze dále rozšířit o spojky and, or, not. 
 +</box> 
 + 
 +<note tip>Vybíráme jen některé řádky z tabulky podle dané podmínky</note> 
 + 
 +<box green round 90%|**Definice**> 
 +**Přirozené spojení (natural join)** 
 + 
 +Nechť R1 = (R1, R1*) je relace se schématem R1(X1,X2,..,Xm,Y1,Y2,...,Yn) a R2 relace se schématem R2(Y1,Y2, ...,Yn, Z1,Z2,...,Zk). Uvažujme složené atributy X=(X1,X2,...,Xm), Y=(Y1,Y2,...,Yn) a Z=(Z1,Z2,...,Zk). Potom přirozené spojení relací R1 a R2 je relace 
 +R1 join R2 se schématem (X, Y, Z) a tělem zahrnujícím všechny n-tice t = (x, y, z) takové, že v R1* existuje n-tice t’ s hodnotou x atributu X a hodnotou y atributu Y a v R2* existuje n-tice t’’ s hodnotou y atributu Y a hodnotou z atributu Z. 
 +</box> 
 + 
 +<note tip>Neboli spojujeme podle sloupce se stejným názvem a podle stejné hodnoty</note> 
 + 
 +<box blue round 90%|**Příklad**> 
 +**T1** 
 + 
 +^A^B^C^ 
 +|0|a|d| 
 +|1|a|e| 
 +|2|b|f| 
 + 
 +**T2** 
 + 
 +^C^D^E^ 
 +|e|1|0| 
 +|d|1|1| 
 +|d|0|1| 
 + 
 +**T1 join T2** 
 +^A^B^C^D^E^ 
 +|0|a|d|1|1| 
 +|0|a|d|0|1| 
 +|1|a|e|1|0| 
 +</box> 
 + 
 +<note tip>minimální množina operací relační algebry - sjednocení, rozdíl, kartézský součin, projekce a selekce. Z nich lze vytvořit zbylé operace</note> 
 + 
 +<note tip>relačně úplný jazyk - lze vyjádřit alespoň totéž co relačním jazykem</note> 
 + 
 +===== Jazyk SQL =====
 **SQL = structured query language**, je standardizovaný dotazovací jazyk používaný pro práci s daty v relačních databázích **SQL = structured query language**, je standardizovaný dotazovací jazyk používaný pro práci s daty v relačních databázích
  
Řádek 25: Řádek 210:
 <SELECT prikaz></code> <SELECT prikaz></code>
  
 +Vytvoření indexu
 +<code>CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED]
 +INDEX <nazev indexu> ON <nazev tabulky nebo pohledu>(<nazev sloupce> [ASC | DESC]
 +[,...n])</code>
 +
 +**ALTER** - slouží pro upravení objektů
 +
 +**DROP** - pro smazání objektů
 +
 +
 +===Příkazy pro manipulaci s daty===
 +Slouží pro manipulaci s daty.
 +
 +**DELETE** - maže data z tabulky 
 +<code>DELETE from users where (age < 13)</code>
 +
 +**UPDATE** - aktualizuje data
 +<code>UPDATE users set city = 'Brno', wtf = 'FIT' where (surname = 'Novák')</code>
 +
 +**INSERT** - vkládáme nová data
 +<code>INSERT into users (name, surname, age) values ('Jiri', 'Janda', 22)</code>
 +
 +**SELECT** - nejčastější příkaz
 +
 +  *V příkazu vybíráme s jakými sloupci v jaké tabulce (tabulkách) budeme pracovat a dale podminku která řádky mají být zpracovány.
 +  *nejkomplikovanější příkaz, má spoustu volitelných podčástí
 +
 +  * where - společný i pro ostatní kromě insertu. Obsahuje podmínky, mohou se spojovat and / or, používat závorky atd.
 +  * group by - Seskupení záznamů znamená, že shrneme informace několika záznamů do jednoho záznamu. K tomuto používáme GROUP BY, za kterým uvedeme název sloupce, podle kterého se mají záznamy seskupit (všechny záznamy, které mají stejnou hodnotu tohoto sloupce, se sloučí do jednoho záznamu).
 +  * having - je velmi podobná podmínce WHERE. Rozdíl je v tom, že podmínka WHERE omezuje ještě neseskupené záznamy a podmínka HAVING omezuje seskupené záznamy. Další rozdíl je, že podmínka HAVING se musí týkat sloupce, který má konstantní hodnotu a nebo agregační funkce. Př. (HAVING `pocet` > 5)
 +  * order by - specifikuje, podle čeho budou výstupní data seřazena - sloupec asc / desc
 +  * distinct Uvedením klíčového slova DISTINCT se eliminují duplicitní řádky „Ze kterých měst jsou klienti spořitelny?“ SELECT DISTINCT město FROM Klient
 +
 +
 +Transakce a prava jsme prakticky neprobírali.
 +
 +===Spojování tabulek - operace join===
 +Slouží ke spojování výsledku dotazu SELECT ze dvou vstupních množin (typicky tabulek relační databáze).
 +
 +**Vnitřní spojení** - Nejjednodušší variantou je tzv. INNER JOIN (pozn. INNER a OUTER není nutné používat a
 +v podstatě se ani nedoporučuje používat - zbytečně prodlužují zápis). Ten odpovídá
 +kartézskému součinu tabulek a aplikaci predikátu na tento součin.
 +  *obecné na základě podmínky (T1 JOIN T2 ON A<C)
 +  *na základě rovnosti (equijoin) (T1 JOIN T2 ON A=D)
 +  *přirozené (natural join) (T1 NATURAL JOIN T2)- Přirozené spojování (NATURAL
 +JOIN) je zvláštním případem vnitřního spojování, kde je spojovací podmínka realizována
 +automaticky dle shodnosti názvů a datových typů ve spojovaných tabulkách. Pro
 +nemožnost konkrétněji definovat ve spojovacích tabulkách, ale pouze strukturou, není
 +tento typ tolik používán.
 +
 +**Vnější spojení** - Vnější spojování (OUTER JOIN) generuje výstupní množinu omezenou o spojovací
 +podmínky podobně jako vnitřní spojování, pokud však není nalezen vhodný řádek v druhé
 +množině, je nenalezený řádek nahrazen hodnotami NULL. Dle typu vnějšího spojení mohou
 +být doplňovány řádky z jedné nebo obou vstupních množin. Výsledkem vnějšího spojování
 +jsou řádky naplněné hodnotami ze vstupních množin i částečně.
 +
 +**Částečné vnější spojování** - Pro částečné vnější spojování jsou definována klíčová slova LEFT a RIGHT, která definují, která vstupní
 +množina má zahrnuté všechny řádky v množině výstupní, tj. která vstupní množina není doplňována o
 +NULL hodnoty
 +
 +Lze použít i FULL OUTER JOIN.
 +
 +SQL umožňuje v klauzuli FROM uvádět nejen jména tabulek, ale i tabulkové výrazy, resp. výraz spojení
 +
 +====Databázové pohledy====
 +Pohled je virtuální databázová struktura, která může obsahovat data z nula až více tabulek.
 +
 +V prohlížeči máte záložky, na ploše zástupce a v databázi? V databázi jsou pohledy.
 +Z pohledů lze především vybírat data (k čemuž slouží nejčastěji), a někdy do nich lze i data vkládat.
 +Databázové systémy by se bez pohledů obešly - podobně, jako byste se na ploše obešli bez zástupců nebo
 +v prohlížeči bez záložek. Ale práce s nimi může být mnohem pohodlnější.
 +
 +  *Mohou sloužit jako jiné pojmenování tabulek
 +  *Mohou z tabulky vybrat jen určité řádky (nebo sloupce)
 +· *Pohledy mohou obsahovat výrazy (jako jsou vestavěné funkce MySQL nebo uživatelsky
 +definované funkce).
 +  *Mohou spojovat data z více tabulek
 +  *Pohledy se mohou odkazovat na další pohledy
 +
 +Pohledy s klauzulemi DISTINCT, GROUP BY, HAVING, s agregačními funkcemi a spojující několik
 +tabulek, umožňují jen čtení.
 +
 +<code>create view vwPracovnici as select * from pracovnici;</code>
 +- Od tohoto okamžiku můžete pohled použít jako tabulku, ve smyslu: 
 +<code>select * from vwPracovnici;</code>
 +<code>create view vwPrumernyVek as select avg(vek) as prumer from pracovnici;</code>
 + - Vrátí průměrný věk (výsledek bude obsahovat vždy jen jeden řádek). Neboli pohled může obsahovat agregační
 +funkci.
 +
 +Používáme pohledy, pokud
 +  *si tím subjektivně zjednodušíte práci
 +  *se stejný dotaz opakuje
 +  *potřebujete mít v dotazu SELECT nějaké výrazy
 +
 +====Procedury a triggery====
 +**Procedura** - Uložená procedura je sada příkazů SQL, které jsou:
 +  *Uložené na serveru
 +  *Zkompilované pro rychlejší použití
 +  *Sada příkazů je provedena najednou
 +  *Může se podobat filozofii maker v OpenOffice.org writeru
 +  *Jestliže chce několik databázových klientů vykonávat stejnou (nebo hodně podobnou) práci, bude pro ně příjemné zjištění, že něco takového již server "umí" díky uložené proceduře, kterou má k dispozici.
 +  *Přispívají k zabezpečení serveru. Nastaveny tak, že: 1. Smí spouštět pouze někdo, 2. Mohou samy kontrolovat počet, typ, velikost a některé jiné charakteristiky parametrů, jež jsou jim posílány
 +  *Nejdůležitější argument procedur - jsou obecně schopny běžet rychleji
 +
 +Procedury mohou dělat to, co normální příkazy:
 +  *Vybírání dat
 +  *Vkládání, aktualizace, odstraňování dat
 +  *Vytváření, používání a rušení dočasných tabulek
 +  *Matematické a statistické výpočty
 +
 +Příklad:
 +<code>create procedure sp_vratradky (od int, do int)
 +begin
 +select * from software where id between od and do;
 +end</code>
 +
 +A zavolat pomocí příkazu:
 +<code>call sp_vratradky 10, 20)</code>
 +
 +**Triggery** - Trigger je uložená procedura, která se spouští v souvislosti s provedením nějakého akčního dotazu na
 +tabulce, nebo taky pouze ten spoustec, ktery ma navazanou uálost, a poté proceduru.
 +
 +  *Česky se tomu někdy říká „spoušť“
 +  *Trigger je "uložená procedura", to znamená, že uvnitř triggeru lze provádět většinu věcí, které umí uložené procedury. V triggeru lze mít například smyčku, podmínku, lokální proměnnou, matematický výpočet a podobně.
 +  *Spouští se "v souvislosti" s akčním dotazem. Trigger se může spustit buď předtím nebo poté, co jsou změny v datech zapsány do databáze.
 +  *„Akční dotaz“ znamená, že trigger lze spustit při vkládání dat, při jejich aktualizaci nebo při odstraňování dat z databáze
 +  *Mají stejnou syntaxi jako uložené procedury, přesto se od nich v lecčems liší. Triggerům není možné předávat žádné vstupní parametry.
 +  *Triggery navíc narozdíl od uložených procedur nemohou vracet sadu záznamů
 +  *Pro MySQL platí, že se v triggeru nesmí objevit přinejmenším tyto příkazy: Příkazy ALTER, Příkazy pro řízení transakcí (START TRANSACTION, ROLLBACK, COMMIT), Volání procedur (CALL), Příkazy pro nastavování práv (GRANT, REVOKE) a některé další příkazy.
 +<code>create trigger trSaveRows
 +before delete
 +on bezpecna
 +for each row
 +begin
 +insert into bezpecna_zaloha(id, jmeno, plat, cas_odstraneni,
 +uzivatel)
 +values (old.id, old.jmeno, old.plat, now(), user());
 +end;</code>
 +
 +EMBEDED SQL / dynamic SQL??
 +
 +===== Potvrzení =====
 +
 +<doodle single|33>
 +^ OK ^ !!! ^
 +</doodle>
 +
 +{{tag>sgs vagabund IDS relacni_databaze relacni_model sql}}
  
 +~~DISCUSSION~~
temata/33-relacni_datovy_model_sql/main.1301340571.txt.gz · Poslední úprava: 2011/03/28 21:29 autor: sgs
Recent changes RSS feed Debian Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki