====== Relační datový model a jazyk SQL ======
===== Relační databázový model =====
{{ http://upload.wikimedia.org/wikipedia/commons/8/8d/Relational_model_concepts.png?400}}
[[wp>Relational database]], [[wp>Relational model]]
To důležité ukazuje obrázek napravo. Relaci tvoří domény (sloupce), tělo relace pak tvoří řádky.
* Neexistují duplicitní řádky((řeší klíče))
* Nezáleží na pořadí řádků a sloupců
* Hodnoty jsou atomické
Každý řádek relace má tzv. **primární klíč**((Bývá to celý sloupec, nejčastěji pojmenovaný ''id'', typu co nejdelší celé číslo bez znaménka a automaticky rostoucí.)). Je to hodnota která ho v tabulce jednoznačně identifikuje. Musí tedy být jednoznačný a minimální (neredukovatelný). Primární klíč je jedním z **kandidátních klíčů**, což jsou prostě sloupce které musí být unikátní.
FIXME Chtělo by to asi ještě něco dopsat, ale ta teorie je taková... //meh// :-?
===== Jazyk SQL =====
[[wp>SQL]]
FIXME Úvodni kecy
==== Příkazy ====
=== SELECT ===
[[wp>Select (SQL)]]
Slouží k získání dat z databáze.
SELECT jmeno, prijmeni FROM telefonni_seznam WHERE mesto = "Brno" ORDER BY prijmeni;
Pomocí ''SELECT''u lze vytvářet tzv. **pohled**y -- jakoby virtuální tabulky.
Výběr z více tabulek se provádí parametrem [[wp>Join (SQL)|JOIN]]. FIXME Dost lamersky napsaný
=== INSERT ===
[[wp>Insert (SQL)]]
Slouží k vkládání nových dat.
INSERT INTO telefonn_seznam (jmeno, prijmeni, mesto, number) VALUES ('Karel', 'Vomacka', 'Brno', 123456);
=== UPDATE ===
[[wp>Update (SQL)]]
Slouží k změně již existujících dat.
UPDATE telefonni_seznam SET jmeno = 'Lojza' WHERE cislo = 123456;
=== DELETE ===
[[wp>Delete (SQL)]]
Slouží k mazání dat.
DELETE FROM telefonni_seznam WHERE mesto = 'Praha';
=== Transakce ===
[[wp>ACID|Atomicity, consistency, isolation, durability]]
Všechny SQL příkazy se provádějí atomicky((čili v jednom kroku, a buď se provedou celé nebo vůbec)). Pokud ale chceme atomicky provést posloupnost příkazů (nejčastěji takovou, která by při svém přerušení způsobila nekonzistenci databáze) musíme příkazy uzavřít do transakce. Provedení transakce pák můžeme potvrdit příkazem ''COMMIT'' nebo vrátit databázi do stavu před transakcí příkazem ''ROLLBACK''.
START TRANSACTION;
UPDATE Account SET amount=amount-200 WHERE account_number=1234;
UPDATE Account SET amount=amount+200 WHERE account_number=2345;
IF ERRORS=0 COMMIT;
IF ERRORS<>0 ROLLBACK;
=== CREATE, ALTER, DROP ===
[[wp>Data Definition Language]]
Tyto příkazy slouží k manipulaci s tabulkami a indexy.
CREATE TABLE telefonni_seznam (jmeno VARCHAR(50) NOT NULL, cislo INT PRIMARY KEY);
ALTER TABLE telefonni_seznam ADD prijmeni INT NOT NULL;
DROP TABLE telefonni_seznam;
===== Shrnutí =====
* relační databáze: matematický model, množiny a relace
* relace je tabulka, definují ji domény (sloupce), tělo relace pak n-tice (řádky), jeden řádek je pak konkrétní prvek těla relace
* neexistují duplicitní n-tice, atributy a n-tice jsou neuspořádané, hodnoty jednoduchých atributů jsou atomické
* kandidátní klíč: unikátní a neredukovatelný
* primární klíč: nejjednodušší z kandidátních klíčů relace
* integritní omezení obecná: pravidla kandidátních klíčů, existence primárního klíče
* integritní omezení specifická: vzdálené klíče, referenční integrita
* relační algebra: množina n-tic, množinové operace (sjednocení, průnik, ...) + relační operace
* relační operace: selekce (výběr řádků, where), projekce (výběr sloupců, select X, Y, Z), spojování (více tabulek podle podmínek)
* relační kalkul: alternativa pro manipulaci s daty, jazyk podle kalkulu je pak například SQL jazyk
* SQL definice dat: create, alter, drop (table, index, view, procedure)
* SQL operace s daty: insert, update, delete, select
* join: inner (kartézský součin a následná aplikace podmínek), natural, outer (podobně jako inner, ale když není podle podmínky nalezeno, tak doplňuje NULL), left a right outer (směr přístupu ke spojování)
* where: určování podmínek - filtrování po vyhledání
* group by: seskupení podle sloupce (při 1:N), například při agregačních funkcích
* having: filtrování až po group by
* pohledy, procedury, triggery