3. Jazyky relačních databázových systémů



Podobné dokumenty
3. Jazyky relačních databázových systémů

Kurz Databáze. Obsah. Dotazy. Zpracování dat. Doc. Ing. Radim Farana, CSc.

7. Integrita a bezpečnost dat v DBS

7. Integrita a bezpečnost dat v DBS

6. SQL složitější dotazy, QBE

Informační systémy 2008/2009. Radim Farana. Obsah. Jazyk SQL

Databáze SQL SELECT. David Hoksza

J. Zendulka: Databázové systémy 4 Relační model dat 1

Databáze I. Přednáška 4

SQL. strukturovaný dotazovací jazyk. Structured Query Language (SQL)

Kapitola 4: SQL. Základní struktura

Databázové systémy. Cvičení 6: SQL

Databázové systémy. - SQL * definice dat * aktualizace * pohledy. Tomáš Skopal

4. Relační model dat. J. Zendulka: Databázové systémy 4 Relační model dat 1

B0M33BDT Technologie pro velká data. Supercvičení SQL, Python, Linux

Informační systémy 2008/2009. Radim Farana. Obsah. Dotazy přes více tabulek

Databázové systémy trocha teorie

10. Architektura klient/server a třívrstvá architektura

10. Architektura klient/server a třívrstvá architektura

Databáze I. Přednáška 6

Jazyk SQL 3 - DML, DDL, TCL, DCL

Jazyk SQL slajdy k přednášce NDBI001

2. blok část B Základní syntaxe příkazů SELECT, INSERT, UPDATE, DELETE

Databázové systémy Cvičení 5.2

J. Zendulka: Databázové systémy 8 Zpracování dotazu Podstata optimalizace zpracování dotazu

8. Zpracování dotazu. J. Zendulka: Databázové systémy 8 Zpracování dotazu 1

Dotazy v SQL. Výraz relační algebry R1( )[A1,A2,...,Aj] lze zapsat takto: SELECT A1,A2,...,Aj FROM R1 WHERE. Výraz (R1, R2... Rk)( )[A1,A2,...

Úvod do databází. Modelování v řízení. Ing. Petr Kalčev

PL/SQL. Jazyk SQL je jazykem deklarativním, který neobsahuje procedurální příkazy jako jsou cykly, podmínky, procedury, funkce, atd.

- sloupcové integritní omezení

Stručný obsah. část III Aktualizace dat Kapitola 10: Aktualizace databáze 257 Kapitola 11: Integrita dat 275 Kapitola 12: Zpracování transakcí 307

XMW4 / IW4 Pokročilé SELECT dotazy. Štefan Pataky

Databázové systémy I

Jazyk SQL 1. Michal Valenta. Katedra softwarového inženýrství FIT České vysoké učení technické v Praze c Michal Valenta, 2012 BI-DBS, ZS 2011/12

KIV/ZIS cvičení 5. Tomáš Potužák

Databázové systémy. Doc.Ing.Miloš Koch,CSc.

Úvod do databázových systémů

Databázové systémy Cvičení 5.3

Databáze I. 5. přednáška. Helena Palovská

Databázové systémy. Datová integrita + základy relační algebry. 4.přednáška

Návrh a tvorba WWW stránek 1/14. PHP a databáze

Kapitola 6: Omezení integrity. Omezení domény

Co bude výsledkem mého SELECTu? RNDr. David Gešvindr MVP: Data Platform MCSE: Data Platform MCSD: Windows Store MCT

Úvod do databázových systémů

RELAČNÍ DATABÁZOVÉ SYSTÉMY

Úvod do databázových systémů

Databázové systémy Cvičení 5

Jaký je rozdíl v definicicíh VARCHAR2(20 BYTE) a VARCHAR2(20 CHAR):

1. Relační databázový model

Úvod do databázových systémů

Jazyk SQL databáze SQLite. připravil ing. petr polách

1 Úvod. J. Zendulka: Databázové systémy - 1 Úvod 1

Fakulta elektrotechniky a informatiky Databázové systémy 2. Leden 2010 souhrn. Červené dobře (nejspíš), modré možná

5. Formalizace návrhu databáze

Obchodní akademie a Jazyková škola s právem státní jazykové zkoušky Jihlava

Databáze I. Přednáška 7

J. Zendulka: Databázové systémy - 1 Úvod Intuitivní vymezení pojmu databáze

Structured Query Language SQL

Transformace konceptuálního modelu na relační

PG 9.5 novinky ve vývoji aplikací

Operátory ROLLUP a CUBE

KIV/ZIS cvičení 6. Tomáš Potužák

5. Formalizace návrhu databáze

DJ2 rekurze v SQL. slajdy k přednášce NDBI001. Jaroslav Pokorný

Text úlohy. Systémový katalog (DICTIONARY):

Databáze 2011/2012 SQL DDL (CREATE/ALTER/DROP TABLE), DML (INSERT/UPDATE/DELETE) RNDr.David Hoksza, Ph.D.

8.2 Používání a tvorba databází

InnoDB transakce, cizí klíče, neumí fulltext (a nebo už ano?) CSV v textovém souboru ve formátu hodnot oddělených čárkou

Informační systémy ve zdravotnictví. 8. cvičení

Databázové systémy I

Dotazování v relačním modelu a SQL

Embedded SQL v C/C++ úvod. Administrace Oracle Kateřina Opočenská

Základní přehled SQL příkazů

Konceptuální modelování a SQL

Jazyk S Q L základy, příkazy pro práci s daty

Materiál ke cvičením - SQL

Základy informatiky. 08 Databázové systémy. Daniela Szturcová

Západočeská univerzita v Plzni Katedra informatiky a výpočetní techniky. 9. června krovacek@students.zcu.cz

Jazyk SQL 2. Michal Valenta. Katedra softwarového inženýrství FIT České vysoké učení technické v Praze c M.Valenta, 2011 BI-DBS, ZS 2011/12

Primární klíč (Primary Key - PK) Je právě jedna množina atributů patřící jednomu z kandidátů primárního klíče.

Materializované pohledy

Embedded SQL Dotazovací Jazyky I. Bc. CHOMUT Miroslav Bc. VODOLÁN Miroslav

Databázové systémy II. KIV/DB2 LS 2007/2008. Zadání semestrální práce

Databázové systémy. Dotazovací jazyk SQL - II

Optimalizace dotazů a databázové transakce v Oracle

Jazyk SQL. Jaroslav Pokorný MFF UK, Praha J. Pokorný 1

6. Fyzická (interní) úroveň databázového systému

Inovace a zkvalitnění výuky prostřednictvím ICT Databázové systémy MySQL základní pojmy, motivace Ing. Kotásek Jaroslav

Databáze I. 1. přednáška. Helena Palovská

Obsah. Kapitola 1. Kapitola 2. Kapitola 3. Kapitola 4. Úvod 11. Stručný úvod do relačních databází 13. Platforma 10g 23

Marian Kamenický. Syntea software group a.s. marian.kamenicky. MFFUK Praha 2012/13

Databázové systémy a SQL

Inovace a zkvalitnění výuky prostřednictvím ICT. Základní seznámení s MySQL Ing. Kotásek Jaroslav

Jazyk PL/SQL Úvod, blok

Databázové systémy Tomáš Skopal

PRŮBĚHOVÝ TEST Z PŘEDNÁŠEK

Úvod do databázových systémů

Databázové systémy BIK-DBS

Osnova je orientační pro FIT, u FEKTu se dá předpokládat, že budou zohledněny předchozí znalosti studentů, kde většina s databází nikdy přímo

4IT218 Databáze. 4IT218 Databáze

Transkript:

3. Jazyky relačních databázových systémů 3.1. Tabulky ilustračního příkladu - Spořitelna... 3 3.2. Jazyk SQL... 5 3.2.1. Úvod... 5 3.2.2. Definice dat... 7 3.2.3. Manipulace s daty... 14 3.2.4. Pohledy... 29 3.2.5. Přístup k systémovému katalogu (slovníku dat)... 36 3.2.6. Práce s chybějící informací... 37 3.2.7. Další příkazy SQL... 39 3.3. Programování s SQL... 40 3.3.1. Jazyk modulů... 40 3.3.2. Hostitelská verze SQL (embedded SQL)... 43 3.3.3. Dynamický SQL... 48 3.4. Další relační jazyky... 50 3.4.1. Jazyk QBE (Query By Example)... 50 3.4.2. Jazyk Datalog... 56 J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 1 Literatura... 57 J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 2

3.1. Tabulky ilustračního příkladu - Spořitelna - relační DB je vnímána uživatelem jako kolekce tabulek Klient r_číslo jméno ulice město 440726/0672 Jan Novák Cejl 8 Brno 530610/4532 Petr Veselý Podzimní 28 Brno 601001/2218 Ivan Zeman Cejl 8 Brno 510230/048 Pavel Tomek Tomkova 34 Brno 580807/9638 Josef Mádr Svatoplukova 15 Brno 625622/6249 Jana Malá Brněnská 56 Vyškov Účet č_účtu stav r_číslo pobočka Pobočka název jmění 4320286 52000 440726/0672 Jánská 1182648 10853 530610/4532 Palackého 2075752 126350 440726/0672 Palackého Jánská 10000000 Palackého 5000000 J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 3 Transakce č_účtu č_transakce datum Částka 4320286 1 10.10.1998 3000 4320286 2 12.10.1998-5000 2075752 1 14.10.1998-2000 2075752 2 14.10.1998 10000 J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 4

3.2. Jazyk SQL 3.2.1. Úvod Historie jazyka - 1975 - Sequel v System R - 1986 - standard ANSI, 1986 - standard ISO- SQL/86, dominantní úloha dialektu SQL firmy IBM (DB2) - 1989 - integritní dodatek (Integrity Addendum) - SQL/89, - 1992 - SQL/92, tři úrovně souladu (Entry/Intermediate/Full) - další standardy X_OPEN SQL (Unix), SAA-SQL (standard firmy IBM) - 1996 - dodatek týkající se uložených modulů (PSM/96) - 1999 - poslední sada dokumentů SQL/99 (SQL3) - řada dialektů SQL, základem SQL/92 (minimálně úroveň Entry) + vlastní rozšíření J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 5 Tři možné kontexty použití jazyka SQL (binding styles): přímý (direct) SQL hostitelská verze (embedded) SQL jazyk modulů Hlavní kategorie příkazů definice dat a pohledů (DDL Data Definition Language) manipulace s daty (DML Data Manipulation Language) pro přímý SQL pro hostitelskou verzi autorizace (řízení přístupových práv) integrita dat řízení transakcí J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 6

3.2.2. Definice dat Základní příkazy: CREATE - vytvoření DROP - zrušení databázového objektu ALTER - změna vlastností databázového objektu Definice bázové (skutečně existující) tabulky CREATE TABLE jm_bázové_tabulky (def_sloupce, [definice_integritních_omezení_tabulky] ) vytvoří novou, prázdnou tabulka + popis uloží do katalogu Definice sloupce jméno_sloupce typ [impl_hodnota] [seznam_io_sloupce] Definice integritních omezení (io) Integritní omezení jsou omezení kladená na hodnoty ve sloupcích tabulky, aby nedošlo k porušení integrity dat. J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 7 Neformální definice pojmů důležitých pro integritní omezení tabulky: Kandidátní klíč - sloupec, resp. sloupce tabulky (pro složený kandidátní klíč), jehož hodnota, resp. kombinace hodnot je v rámci tabulky unikátní. Primární klíč jeden z kandidátních klíčů, který bude sloužit k adresaci řádků tabulky. Musí splňovat vlastnosti kandidátního klíče, navíc nesmí být hodnota prázdná. Alternativní klíč kandidátní klíč, který není primárním klíčem. Cizí klíč sloupec, resp. sloupce tabulky (pro složený cizí klíč), jehož hodnota, resp. kombinace hodnot se musí rovnat hodnotě kandidátního klíče v nějaké tabulce. Slouží k vytváření vazeb mezi tabulkami. Soulad hodnot cizího klíče a odkazovaného kandidátního klíče se nazývá referenční integrita. J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 8

Integritní omezení sloupce NULL, resp NOT NULL CHECK (podmíněný_výraz) PRIMARY KEY UNIQUE FOREIGN KEY REFERENCES tabulka [(jm_sloupce)] [událost ref_akce] Integritní omezení celé tabulky PRIMARY KEY (jm_sloupce, ) UNIQUE (jm_sloupce, ) FOREIGN KEY (jm_sloupce, ) REFERENCES tabulka [(jm_sloupce, )] [událost ref_akce] CHECK (podmíněný_výraz) J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 9 Př) Klient Pobocka r_cislo jmeno ulice mesto nazev jmeni Ucet c_uctu stav r_cislo pobocka Transakce c_transakce c_uctu datum castka CREATE TABLE Ucet (c_uctu DECIMAL(7,0) NOT NULL, stav DECIMAL(10,2), r_císlo CHAR(11) NOT NULL, pobocka CHAR(20) NOT NULL, PRIMARY KEY (c_uctu), FOREIGN KEY (r_cislo) REFERENCES Klient ON DELETE CASCADE, FOREIGN KEY (pobocka) REFERENCES Pobocka ) J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 10

Typy dat skalární: CHAR(n), VARCHAR(n), BIT(n), BIT VARYING(n),NUMERIC(p, q), DECIMAL(p, q), INTEGER, SMALLINT, FLOAT(p) datum a čas: DATE, TIME, TIMESTAMP, INTERVAL SQL/99 zavádí další datové typy, včetně typů označovaných jako BLOB (binary large objects). Referenční událost - aktualizace ( ON UPDATE), rušení (ON DELETE) Referenční akce - NO ACTION, CASCADE, SET DEFAULT, SET NULL Poznámka: Uvedením klauzule PRIMARY KEY, UNIQUE nebo FOREIGN KEY omezuje možné hodnoty v příslušném sloupci, resp. sloupcích, tj. říkáme, že daný sloupec je primárním, kandidátním, či cizím klíčem a požadujeme po SŘBD, aby kontroloval, že jsou odpovídající omezení dodržena. J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 11 Př) Klient Pobocka r_cislo jmeno ulice mesto nazev jmeni Ucet c_uctu stav r_cislo datum nazev SELECT INSERT DELETE UPDATE Klient - PK, CK, NULL RI Ucet.r_cislo PK, CK, NULL RI Ucet.r_cislo Ucet - PK, AK, NULL, RI Klient, Pobocka - PK, AK, NULL, RI Klient, Pobocka Změna bázové tabulky ALTER TABLE jm_bázové_tabulky akce - akce - přidání (ADD), zrušení (DROP) sloupce, změna implicitní hodnoty (ALTER); přidání (ADD), zrušení (DROP) io pro tabulku modifikuje tabulku a změní informace v katalogu J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 12

Zrušení tabulky DROP TABLE jm_bázové_tabulky zruší tabulku a informace o ní v katalogu Pohledy (viz dále) Domény (viz dále) Další typické databázové objekty (nejsou součástí SQL/92) Index CREATE [UNIQUE]INDEX jm_indexu ON jm_bázové_tabulky (jm_sloupce [ASC DESC], ) Synonymum CREATE SYNONYM jm_synonyma FOR jm_tabulky Generátory posloupností čísel (sekvence, čítače) J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 13 3.2.3. Manipulace s daty - příkazy: SELECT, UPDATE, DELETE, INSERT - operandem jsou bázové tabulky nebo pohledy, výsledkem tabulka Příkaz SELECT SELECT [ALL DISTINCT] položka [[AS] nové_jméno], FROM tabulkový výraz [[AS] [nové_jméno]], [WHERE podmínka] [GROUP BY jm_sloupcez číslo, ] [HAVING podmínka] [ORDER BY jm_sloupcev číslo [ASC DESC]], FROM WHERE ORDER BY spojení selekce seskupení projekce seřazení GROUP BY HAVING SELECT J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 14

Jednoduché dotazy (nad jednou tabulkou) Kteří klienti mají účet u spořitelny? SELECT r_číslo, jméno FROM Klient V klauzuli SELECT lze použít zástupný symbol * ve významu všechny sloupce SELECT * FROM Klient 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 Klauzule WHERE určuje podmínku pro výběr řádků Které účty jsou u pobočky Jánská? SELECT * FROM Ucet WHERE pobocka='jánská' J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 15 Přejmenování - Lze zavádět nová jména pro sloupce výsledné tabulky (v klauzuli SELECT) - Lze zavádět nová jména tabulek v klauzuli FROM (tzv. n- ticové proměnné) staré jméno [AS] nové_jméno - Nová jména sloupců z klauzule SELECT lze používat pouze v klauzuli ORDER BY, nová jména tabulek ve všech klauzulích příkazu V klauzuli SELECT mohou být výrazy Kolik činí jmění poboček v USD pri kursu 30 Kč/$? SELECT nazev, jmeni/30 jmeni_v_usd FROM Pobocka Výslednou tabulku lze uspořádat - klauzule ORDER BY SELECT nazev, jmeni/30 jmeni_v_usd FROM Pobocka ORDER BY jmeni_v_usd nebo 2 J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 16

Spojení informací z více tabulek (operace JOIN) Kteří klienti mají účet v pobočce Jánská? SELECT DISTINCT K.* FROM Klient K, Ucet U WHERE K.r_cislo=U.r_cislo AND U.pobocka='Jánská' Kteří klienti prováděli transakce v pobočce Jánská 12.10.1998? SELECT DISTINCT K.jmeno, T.c_uctu, T.castka FROM Klient K, Ucet U, Transakce T WHERE K.r_cislo=U.r_cislo AND U.c_uctu=T.c_uctu AND U.pobocka='Jánská' AND T.datum='1998-10-12' Typy spojení: o vnitřní (inner) obecné na základě podminky(θjoin) na základě rovnosti (equijoin) přirozené (natural join) o vnější (outer) Př) T1 T2 Výsledek? A B X X C D T1 JOIN T2 ON A<C 0 a x x 1 0 T1 JOIN T2 ON A=D 1 a x x 2 0 T1 NATURAL JOIN T2 3 c z y 3 1 T1 NATURAL LEFT JOIN T2 J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 17 Lze spojit dvě stejné tabulky Bydlí někteří klienti na stejné adrese?" SELECT K1.jmeno,K1.r_cislo, K2.jmeno, K2.r_cislo, K1.ulice, K1.mesto FROM Klient K1, Klient K2 WHERE K1.mesto=K2.mesto AND K1.ulice=K2.ulice AND K1.r_cislo>K2.r_cislo V klauzuli FROM lze uvádět i tabulkové výrazy, resp. výraz spojení (join expression) tvaru: tabulka CROSS JOIN tabulka tabulka [NATURAL] [typ_spojení] JOIN tabulka ON podmínka USING (sloupec, )] - typ spojení: INNER (LEFT RIGHT FULL)[OUTER] UNION Kteří klienti mají účet v pobočce Jánská? SELECT DISTINCT r_cislo, jmeno, ulice, mesto FROM Klient NATURAL JOIN Ucet U WHERE U.pobocka='Jánská' J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 18

Agregační funkce COUNT (*) AVG MAX MIN SUM COUNT ([ALL DISTINCT] jm_sloupce) Kolik klientů má spořitelna?" SELECT COUNT(*) pocet FROM Klient - agregační funkce nelze zanořovat Klauzule GROUP BY Jaká částka je na účtech v jednotlivých pobočkách? SELECT pobocka, SUM(stav) celkem_na_uctech FROM Ucet GROUP BY pobocka - omezení pro výrazy v klauzuli SELECT (agregační funkce, prvky seznamu v GROUP BY, konstanty) J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 19 Kolik mají na svých účtech jednotliví klienti?" SELECT K.jmeno, K.r_cislo, COUNT(*) pocet, SUM(stav) celkem FROM Klient K, Ucet U WHERE K.r_cislo=U.r_cislo GROUP BY K.jmeno,K.r_cislo Klauzule HAVING - Analogie WHERE, ale aplikované na celé skupiny Kteří klienti mají na účtech více než 100000Kč?" SELECT K.jmeno, K.r_cislo, SUM(stav) celkem FROM Klient K, Ucet U WHERE K.r_cislo=U.r_cislo GROUP BY K.jmeno,K.r_cislo HAVING SUM(stav)>50000 J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 20

Klauzule WHERE (podmíněný výraz) - Může obsahovat tyto predikáty (případně s operátorem NOT a spojené logickými spojkami AND, OR): Porovnání konstruktor_řádku rel_op konstruktor_řádku konstruktor_řádku rel_op {ANY SOME ALL} (tabulkový výraz) Kteří mimobrněnští klienti mají uloženo více než brněnští?" SELECT K.jmeno, K.r_cislo, SUM(stav) celkem FROM Klient K, Ucet U WHERE K.r_cislo=U.r_cislo AND K.mesto<>'Brno' GROUP BY K.jmeno,K.r_cislo HAVING SUM(stav)>ALL (SELECT SUM(stav) FROM Klient K, Ucet U WHERE K.r_cislo=U.r_cislo AND K.mesto='Brno' GROUP BY K.r_cislo) J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 21 Test na chybějící informaci jm_sloupce IS [NOT] NULL Má některý klient neúplně zadanou adresu? SELECT * FROM Klient WHERE ulice IS NULL OR mesto IS NULL Predikát BETWEEN výraz [NOT] BETWEEN výraz AND výraz - e BETWEEN c1 AND c2 je ekvivalentní: e c1 AND e c2 Které transakce proběhly v říjnu 1998?" SELECT K.jmeno, K.r_cislo, U.c_uctu, T.datum,T.castka FROM Klient K, Ucet U, Transakce T WHERE K.r_cislo=U.r_cislo AND U.c_uctu=T.c_uctu AND T.datum BETWEEN '1998-10-01' AND '1998-10-31' J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 22

Predikát EXISTS [NOT] EXISTS (tabulkový_výraz) - Test na neprázdnost tabulky Kteří klienti mají účet jen u pobočky Jánská? SELECT DISTINCT K.* FROM Klient K, Ucet U WHERE K.r_cislo=U.r_cislo AND U.pobocka= Jánská AND NOT EXISTS(SELECT * FROM Ucet U WHERE K.r_cislo=U.r_cislo AND U.pobocka<> Jánská ) - Typicky poddotaz s * v klauzuli SELECT Predikát UNIQUE [NOT] UNIQUE (tabulkový_výraz) - Test na neexistenci duplicitních řádků v tabulce poddotazu. Kteří klienti mají u pobočky Jánská jen jeden účet? J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 23 Predikát LIKE výraz_řetězec [NOT] LIKE vzor [ESCAPE esc_znak] - Vzor je řetězcový výraz, může obsahovat zástupné znaky: o _ - libovolný znak, o % - libovolný počet libovolných znaků (i žádný) - esc_znak je znak rušící ve vzoru význam zástupného znaku Př) řetězec LIKE \_% ESCAPE '\ Kteří klienti mají křestní jméno Jan? SELECT * FROM Klient WHERE jmeno LIKE 'Jan %' Predikát IN konstruktor_řádku [NOT] IN (tabulkový_výraz) skalární_výraz [NOT] IN (seznam_skalárních_výrazů) Kteří klienti jsou z Brna nebo Prahy? SELECT * FROM Klient WHERE mesto IN ('Praha', 'Brno') J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 24

Kteří klienti prováděli transakce v říjnu 1998? SELECT * FROM Klient WHERE r_cislo IN (SELECT r_cislo FROM Ucet WHERE c_uctu IN (SELECT c_uctu FROM Transakce WHERE datum BETWEEN '1998-10-01' AND '1998-10-31')) Predikát MATCH - Obdoba IN s možností testu na shodu s právě jediným řádkem J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 25 Operátory pro sjednocení, rozdíl a průnik tabulek tabulkový_výraz UNION EXCEPT INTERSECT [ALL] tabulkový_výraz[klauzule_order_by] Př) Předpokládejme další tabulku Pujcka c_pujcky r_císlo pobocka castka splaceno Kteří klienti mají u pobočky Jánská účet nebo půjčku?" SELECT K.jmeno, K.r_cislo FROM Klient K, Ucet U WHERE K.r_cislo=U.r_cislo AND U.pobocka='Jánská' UNION SELECT K.jmeno, K.r_cislo FROM Klient K, Pujcka P WHERE K.r_cislo=P.r_cislo AND P.pobocka='Jánská' - Při provedení příkazu se implicitně odstraňují duplicity. J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 26

Příkaz INSERT INSERT INTO jm_tabulky [(jm_sloupce, )] zdroj Vloží jeden nebo více řádků tabulky Zdroje pro vkládání: Řádek implicitních hodnot (z příkazu CREATE TABLE) DEFAULT_VALUES Řádek zadaných hodnot VALUES(skalární_výraz NULL DEFAULT, ) INSERT INTO Klient VALUES('440726/0672','Jan Novák','Cejl 8','Brno') Výsledek poddotazu tabulkový_výraz Vlož do tabulky ZJ informace o klientech s účtem na Jánské. INSERT INTO ZJ SELECT DISTINCT K.* FROM Klient K, Ucet U WHERE K.r_cislo=U.r_cislo AND U.pobocka='Jánská' J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 27 Příkaz DELETE (prohledávací) DELETE FROM jm_tabulky [WHERE podmínka] zruší jeden nebo několik řádků tabulky splňující podmínku Zruš informace o klientech bez účtu." DELETE FROM Klient WHERE r_cislo NOT IN (SELECT r_cislo FROM Ucet) - Rozdíl příkazů DELETE FROM T a DROP TABLE T. Příkaz UPDATE (prohledávací) UPDATE jm_tabulky SET jm_sloupce = výraz NULL DEFAULT, [WHERE podmínka] změní hodnoty specifikovaných sloupců v řádcích splňujících podmínku Poznač vklad 1000 Kč na účet číslo 100. UPDATE Ucet SET stav=stav+1000 WHERE c_uctu=100 J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 28

3.2.4. Pohledy Pojmenované virtuální tabulky odvozené z bázových. T1 V1 T2 Vytvoření pohledu CREATE VIEW jm_pohledu [(jm_sloupce, )] AS tab_výraz [WITH CHECK OPTION] uloží definici pohledu do systémového katalogu - Sloupce musí mít jednoznačná jména (případně přejmenovaná). J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 29 Př) Pohled pro klienty pobočky Jánská. CREATE VIEW Janska AS SELECT K.* FROM Klient K, Ucet U WHERE K.r_číslo=U.r_cislo AND U.pobočka='Jánská' WITH CHECK OPTION Zrušení pohledu DROP VIEW jm_pohledu [RESTRICT CASCADE] zruší informaci o pohledu ze systémového katalogu Manipulace na pohledech Při dotazu se provede transformace na operace nad bázovými tabulkami. J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 30

Př) SELECT * FROM Janska WHERE mesto = 'Brno' SELECT K.* FROM Klient K,Ucet U WHERE K.mesto = 'Brno' AND K.r_cislo=Ú.r_cislo AND U.pobocka='Jánská'; Aktualizovatelnost pohledů SŘBD musí být schopen jednoznačně transformovat operace vložení řádku, zrušení řádku a modifikace řádku pohledu na operace nad zdrojovými bázovými tabulkami pohledu. Př) CREATE VIEW pocty (nazev,pocet) AS SELECT pobocka, COUNT(*) FROM Ucet GROUP BY pobocka; Pohledy s klauzulemi DISTINCT, GROUP BY, HAVING, s agregačními funkcemi a spojující několik tabulek umožňují jen čtení. J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 31 Př) Aktualizovatelnost pohledů nad jednou bázovou tabulkou Selektivní Projektivní Agregační Selektivní pohled CREATE VIEW Brnensti AS SELECT* FROM Klient WHERE mesto='brno' Projektivní pohled bez PK CREATE VIEW Brnensti1 AS SELECT jmeno, ulice FROM Klient WHERE mesto='brno' INSERT INTO Brnensti1 VALUES ('Josef Vlk','Koliště 55') J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 32

Projektivní pohled s PK, sloupce mimo pohled dovolují NULL CREATE VIEW Brnensti2 AS SELECT r_cislo,jmeno FROM Klient WHERE mesto='brno' INSERT INTO Brnensti2 VALUES ('112233/4444','Josef Vlk') Agregační CREATE VIEW Pocty (nazev, pocet) AS SELECT pobocka, COUNT(*) FROM Ucet GROUP BY pobocka; INSERT INTO Pocty VALUES ('Panská',20) J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 33 Význam klauzule WITH CHECK OPTION - Kontrola, že při aktualizaci nedochází k porušení definice pohledu. CREATE VIEW Brněnští AS SELECT * FROM Klient WHERE město= Brno WITH CHECK OPTION UPDATE Brnensti SET mesto= Praha WHERE r_číslo= Materializované pohledy Pohledy, u nichž je výsledek dotazu definujícího pohled skutečně fyzicky uložen v databázi a je zajištěna aktualizace obsahu. Důvod - Zvýšení efektivnosti, resp. omezený přístup k datům. Hlavní oblasti použití: o Datové sklady sumarizační pohledy. o Distribuované databáze replikace dat v uzlech. o Mobilní databáze materializace pohledů používaných mobilními klienty. J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 34

Použití pohledů Mezi hlavní důvody použití pohledů patří: Omezení přístupu, skrytí logické struktury (bezpečnost) Skrytí složitosti dotazu (zjednodušení) Skrytí způsobu získání dat (nezávislosti na případné změně dotazu) J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 35 3.2.5. Přístup k systémovému katalogu (slovníku dat) U relačních systémů má katalog stejné rozhraní jako uživatelská DB s určitými omezeními, tj.tabulky (nejčastěji pohledy). Př) Oracle: pohledy: ALL_, DBA_, USER_ USER_TABLES(TABLE_NAME,TABLESPACE_NAME,...), USER_TAB_COLUMNS (TABLE_NAME,COLUMN_NAME,DATA_TYPE,...) Které sloupce má tabulka Klient?" SELECT column_name FROM User_tab_columns WHERE table_name = KLIENT SQLBase: SYSTABLES(NAME, CREATOR, COLCOUNT,...), SYSCOLUMNS(NAME, TBNAME, COLTYPE,...) - Údaje z katalogu lze přímo pouze číst, ostatní manipulace se dějí zprostředkovaně (CREATE, ALTER, DROP). J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 36

3.2.6. Práce s chybějící informací - potřeba v praxi - řešení: - jedna vybraná hodnota oboru - speciální hodnota (NULL v SQL ) - vliv na operace (A+B, A>B) tříhodnotová logika (3VL) - {true, false, unknown} Pravidla skalární výrazy - výsledek NULL, je-li některý z operandů NULL porovnání - výsledek je unknown, je-li některý z operandů NULL agregační funkce - jako neutrální hodnota vůči prováděné operaci klauzule WHERE - vybírají se řádky s hodnotou podmínky true porovnání řádků a NULL c a NULL c ani r1 = r2, ani r1 <> r2, DISTINCT true J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 37 Testování chybějící informace jm_sloupce IS [NOT] NULL Vnější spojení (OUTER JOIN - pravé, levé, úplné), vnější sjednocení Př) T1 T2 Výsledek? A B X X C D T1 NATURAL LEFT JOIN T2 0 a x x 1 0 T1 NATURAL RIGHT JOIN T2 1 a x x 2 0 T1 NATURAL FULL JOIN T2 3 c z y 3 1 T1 UNION JOIN T2 " Kolik mají jednotliví klienti účtů a peněz na nich?" SELECT K.jmeno, K.r_cislo, COUNT(c_uctu) pocet, SUM(stav) celkem FROM Klient K LEFT JOIN Ucet U GROUP BY K.jmeno,K.r_cislo ORDER BY celkem DESC J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 38

3.2.7. Další příkazy SQL Integritní omezení (viz kap. 8) NOT NULL, CHECK, UNIQUE, ASSERTION, Řízení přístupových práv (viz kap. 7) GRANT, REVOKE Řízení sezení (viz kap. 9) CONNECT, DISCONNECT, SET CONNECTION, Transakční zpracování (viz kap. 9) COMMIT, ROLLBACK, SET TRANSACTION (izolační úroveň, ), Další J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 39 3.3. Programování s SQL Tři možné kontexty použití jazyka SQL (binding styles): přímý (direct) SQL hostitelská verze (embedded) SQL jazyk modulů - SQL/92 není výpočetně úplný - Hostitelská verze SQL je obecně mocnější než přímý SQL. 3.3.1. Jazyk modulů Kompilační jednotka hostitelského jazyka 1 * tvoří * SQL modul * volaná procedura * SQL procedura 1 Příkaz SQL J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 40

MODULE [jméno_modulu] LANGUAGE programovací_jazyk [SCHEMA schéma][authorization uživatel [definice_přechodných_tabulek] definice_kurzorů_a_procedur Definice procedury: PROCEDURE jméno (seznam_parametrů); příkaz_sql; Parametry procedury - SQLCODE (0-OK, 100-NO ROWS, <0-ERROR) nebo SQLSTATE, další parametry J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 41 Př) PROCEDURE ZrusKlienta (SQLSTATE, :rc CHAR(11)); DELETE FROM Klient WHERE r_cislo = :rc; Použití:... char SQLSTATE[6]; char rodnecislo[12];... ZrusKlienta(SQLSTATE, rodnecislo);... J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 42

3.3.2. Hostitelská verze SQL (embedded SQL) Zásady: Příkazy mají tvar EXEC SQL SQL_příkaz a jsou ukončeny dle zvyklosti jazyka (např. ; pro C). Libovolný příkaz přímého SQL lze použít v hostitelském prostředí. Odkazy na proměnné host.jazyka (vázané - bind ) začínají :. Referované host.proměnné musí být definovány v deklarační sekci: EXEC SQL BEGIN DECLARE SECTION... END DECLARE SECTION Každý program s vloženým SQL musí obsahovat hostitelskou proměnnou SQLCODE nebo SQLSTATE, jejíž hodnoty nastavuje SŘBD po provedení každého příkazu SQL. Hostitelské proměnné musí být vhodného typu s ohledem na použití. Proměnné i sloupce mohou mít stejná jména. J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 43 Za každým příkazem SQL by měl následovat test SQLCODE nebo SQLSTATE, příkaz WHENEVER zjednodušuje: EXEC SQL WHENEVER podmínka akce - podmínkou je SQLERROR nebo NOT FOUND, akci CONTINUE nebo GO TO návěští. Pojem kurzor SELECT set-at-a-time record-at-a-time hostitelský jazyk? kurzor J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 44

Příkazy nevyžadující kurzor Jednořádkový SELECT SELECT INTO host_pr[indicator indik], FROM INSERT, prohledávací UPDATE a DELETE Příkazy související s kurzorem: Deklarace kurzoru DECLARE [INTENSIVE SCROLL] jm_kurzoru CURSOR FOR př_select_příp_s_order_by [FOR READONLY UPDATE[OF sloupce]] - zásady pro aktualizovatelnost podobné pohledům Př) DECLARE Janska CURSOR FOR SELECT K.r_cislo, K.jmeno, K.ulice, K.mesto FROM Klient K, Ucet U WHERE K.r_cislo=U.r_cislo AND pobocka='jánská' J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 45 Provedení dotazu OPEN jm_kurzoru Př) OPEN Janska Výběr řádku tabulky FETCH [[NEXT PRIOR FIRST ] FROM] jm_kurzoru INTO seznam_proměnných Př) FETCH Janska INTO :rc, :jm, :ul, :mesto Uzavření (deaktivace) kurzoru CLOSE jm_kurzoru Př) CLOSE Janska Poziční varianty příkazu UPDATE a DELETE WHERE CURRENT OF jm_kurzoru J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 46

Př) Práce s kurzorem v PL/SQL (Oracle) DECLARE CURSOR z IS SELECT r_cislo, jmeno FROM Klient WHERE mesto = Brno ; BEGIN OPEN z; LOOP FETCH z INTO rc, jm; EXIT WHEN z%notfound; END LOOP; CLOSE z; END; J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 47 3.3.3. Dynamický SQL Poskytuje možnost vytváření příkazů SQL jako textových řetězců za běhu Vytvoření příkazu PREPARE jméno_příkazu FROM řetězec proměnná - připravitelný příkaz - jednořádkový SELECT bez INTO, INSERT, prohledávací UPDATE a DELETE, specifikační část deklarace kurzoru - náhrady -? Vykonání příkazu EXECUTE jm_příkazu [INTO ][ USING vstupní_hodnoty] Uvolnění prostoru DEALOCATE PREPARE jm_příkazu Vytvoření příkazu a bezprostřední provedení EXECUTE IMMEDIATE řetězec proměnná J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 48

Použití v definici kurzoru DECLARE jméno_kurzoru CURSOR FOR jméno_příkazu Př) Oracle Pro*C sprintf(s1, %s, UPDATE Klient SET jmeno=? WHERE r_cislo=? ); EXEC SQL PREPARE prikaz FROM :s1; EXEC SQL EXECUTE prikaz USING :nove_jmeno,:rc; Gupta (jazyk SAL) Call SqlPrepare(hSql, "UPDATE zákazník SET jméno = :nove_jmeno WHERE r_cislo = :r_cislo") Call SqlExecute(hSql) Call SqlImmediate("... ") Pružnost vs. efektivnost - možnost sestavení příkazu až za běhu programu - kompilace až v době běhu kontroly, pozdní vazba J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 49 3.4. Další relační jazyky 3.4.1. Jazyk QBE (Query By Example) - vyvinutý firmou IBM v 70.letech - původně DBS i jazyk - k dispozici podpora pro dokazování příkladem na úrovni vývojových prostředí (generátory formulářů) a dotazovacích nástrojů pro koncové uživatele - původně založen na použití tabulek, dnes zpravidla použití formulářů Vypiš klienty spořitelny. KLIENT R_CISLO JMENO ULICE MESTO P. - lze používat proměnné - _jméno - P. které sloupce ve výsledku (tvar výsledné tabulky) - výsledek lze uspořádat, např, P.AO(1) Vypiš účty pobočky Jánská s částkou větší než 100000. UCET C_UCTU R_CISLO STAV POBOCKA P._u P._r P.>100000 Jánská J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 50

- logické spojky Najdi všechny zákazníky z Brna a Kuřimi. KLIENT JMENO MESTO P. Brno Kuřim - lze se dotazovat na několik tabulek (spojovat informace) Kteří zákazníci mají účet v pobočce Jánská? KLIENT R_CISLO JMENO ULICE MESTO P. _x UCET C_UCTU R_CISLO STAV POBOCKA _x Jánská - agregační funkce - CNT, SUM, AVG, MAX, MIN, povinně s ALL. Kolik zákazníků má účet u pobočky Jánská? UCET C_UCTU STAV R_CISLO POBOCKA P.CNT.UNQ.ALL. Jánská J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 51 - operátor G. (group by) Jaký je průměrný stav účtu u jednotlivých poboček? UCET C_UCTU STAV R_CISLO POBOCKA - okno podmínky P.AVG.ALL. P.G. Ve kterých pobočkách je průměrný stav vyšší než 100000? UCET C_UCTU STAV R_CISLO POBOCKA P.AVG.ALL._x P.G. Conditions AVG.ALL._x>100000 - je-li použit jako manipulační jazyk, pak umožňuje i rušení a vkládání Ulož na účet 286549 1000 Kč. UCET C_UCTU STAV R_CISLO POBOCKA U. 286549 _x+1000 _x J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 52

Dotazování příkladem v systémech s GUI - Někdy označované jako GQBE (Graphical Query By Example) Př) Microsoft Access J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 53 Vygenerovaný dotaz: SELECT TOP 5 PERCENT VYPUJCKY.JMENO, VYPUJCKY.TELEFON, Count(KNIHY.TITUL) AS CountOfTITUL FROM VYPUJCKY LEFT JOIN KNIHY ON VYPUJCKY.JMENO = KNIHY.VYPUJCKA WHERE (((KNIHY.VYPUJCKA)<>"ztráta" And (KNIHY.VYPUJCKA)<>"vyřazeno")) GROUP BY VYPUJCKY.JMENO, VYPUJCKY.TELEFON HAVING (((VYPUJCKY.JMENO)<>"nikdo")) ORDER BY Count(KNIHY.TITUL) DESC; J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 54

Výsledek dotazu: J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 55 3.4.2. Jazyk Datalog Neprocedurální dotazovací jazyk vycházející z jazyka pro logické programování Prolog. Program je tvořen množinou pravidel, která definují pohledy. Př) Účty u pobočky Jánská uctyjanska(cu, S, V) :- ucet(cu, S, V, "Jánská") Kolik je na účtu číslo 100 a kdo je vlastníkem?? uctyjanska(100, S, V) - Existují implementace Datalogu, které umožňují rekurzivní dotazy. Př) Najdi zaměstnance přímo či nepřímo řízené panem Novákem. podnovakem(x) :- vedouci(x, "Novák") podnovakem(x) :- vedouci(x, Y), podnovakem(y) J. Zendulka: Databázové systémy - 3 Jazyky relačních databázových systémů 56

Literatura 1. Date, C., J., Darwen, H.: A Guide to the SQL Standard. Fourth Edition. Addison-Wesley, 1997. 2. Silberschatz, A., Korth H.F, Sudarshan, S.:Database System Concepts. Fourth Edition. McGRAW-HILL. 2001, str. 135 225. 3. Pokorný, J.: Dotazovaci jazyky. Science, Veletiny, 1994, str. 47-134. 4. Pokorný, J.: Databazová abeceda. Science, Veletiny, 1998, str. 97 103. J. Zendulka: Databá zové systémy - 3 Jazyky relačních databázových systémů 57