SQL Další dotazy a pohledy

Slides:



Advertisements
Podobné prezentace
Aplikační a programové vybavení
Advertisements

KIV/ZIS Cvičení 6 SQL - SELECT.
ŘÍDÍCÍ STRUKTURY - PODMÍNKY
Základy jazyka SQL Jan Tichava
SQL: DDL v ORACLE CREATE TABLE jméno_tabulky (atribut datový_typ [DEFAULT][attribut_constraint] [, atribut datový_typ [DEFAULT] [attribut_constraint]],...
Aplikační a programové vybavení
Jazyk SQL Ing. Zdena DOBEŠOVÁ. SQL Structured Query Language 1974 SEQUEL (Structured English Query Language) neprocedurální relační dotazovací jazyk norma.
 Informací se data a vztahy mezi nimi stávají vhodnou interpretací pro uživatele, která odhaluje uspořádání, vztahy, tendence a trendy  Existuje celá.
DB1 – 9. cvičení Optimalizace dotazu Konkurenční přístup a deadlock Indexace Transakce.
Databázové systémy SQL Výběr dat.
YDASYS1 Ing. Monika Šimková.
Fakulta elektrotechniky a informatiky
Informační systémy Nástroje pro sběr dat, návrh a realizace databáze.
Další dotazy SQL Structured Query Language. Některé SQL příkazy mohou mít v sobě obsaženy další kompletní příkazy SELECT. Využijeme je tam, kde potřebujeme.
SQL Structured Query Language
Informatika pro ekonomy II přednáška 11
Architektury a techniky DS Tvorba efektivních příkazů I Přednáška č. 3 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky
Databázové systémy 1 Cvičení č. 4 Fakulta elektrotechniky a informatiky Univerzita Pardubice.
Databázové systémy I Přednáška č. 5 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky
1 BUMI Úvod do medicínské informatiky Počítačové cvičení č. 3 Ing. Vratislav Čmiel.
Temporální databáze a TSQL
SQL Lukáš Masopust Historie  Předchůdcem databází byly papírové kartotéky  děrný štítek  1959 konference  1960 – vytvořen jazyk COBOL.
SQL Lukáš Masopust Historie  Předchůdcem databází byly papírové kartotéky  děrný štítek  1959 konference  1960 – vytvořen jazyk COBOL.
Databáze Jiří Kalousek.
SQL Přednáška DB1. Literatura CONNOLLY, T.M.-BEGG,C.E.-STRACHAN,A.D.: Database Systems – A Practial Approach to Design, Implementation and Management.
MySQL - Vytvoření nové tabulky  create table jméno_tabulky (jméno_položky typ_položky,... ) Přehled nejběžnějších datových typů Přehled nejběžnějších.
Databázové systémy II Přednáška č. 8 – Pohledy (Views)
Školení správců II. Petr Pinkas RNDr. Vít Ochozka.
Fakulta elektrotechniky a informatiky
Databázové systémy I Cvičení č. 9 Fakulta elektrotechniky a informatiky Univerzita Pardubice 2013.
Vypracoval: Ondřej Dvorský Třída: VIII.A
KIV/ZIS cvičení 6 Tomáš Potužák. Pokračování SQL Klauzule GROUP BY a dotazy nad více tabulkami Stáhnout soubor studenti_dotazy_sql.mdb.
Databázové systémy I Cvičení č. 6 Fakulta elektrotechniky a informatiky Univerzita Pardubice 2013.
Databázové systémy Přednáška č. 6.
SQL – základní pojmy Ing. Roman Danel, Ph.D.
SQL PVA Jan Hora. SQL „graficky“ Grafický vs. pravý SQL SELECT ORDED BY WHERE.
Rauer Luboš Kopic Petr Blažek Tomáš. Structured Query Language - dotazovací jazyk -> pracuje s dotazy - neprocedurální jazyk - mocný, ale přitom jednoduchý.
Databázové systémy II Přednáška č. X Ing. Tomáš Váňa, Ing. Jiří Zechmeister Fakulta elektrotechniky a informatiky
Číslo šablony: III/2 VY_32_INOVACE_P4_3.8 Tematická oblast: Aplikační software pro práci s informacemi II. Databáze – základy SQL Typ: DUM - kombinovaný.
Architektury a techniky DS Cvičení č. 9 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky
Databázové systémy II Přednáška č. 9. Transakce je logická jednotka práce sestávající z jednoho nebo více SQL příkazů, které jsou atomické z hlediska.
Obchodní akademie, Ostrava-Poruba, příspěvková organizace Vzdělávací materiál/DUM VY_32_INOVACE_01B16 Autor Ing. Jiří Kalousek Období vytvoření březen.
7. Typ soubor Souborem dat běžně rozumíme uspořádanou množinu dat, uloženou mimo operační paměť počítače (na disku). Pascalský soubor je abstrakcí skutečného.
Databázové systémy Tomáš Skopal
Databázové systémy UIN010 N-ticový (řádkový) relační kalkul Hodnoty proměnných n-tice relací (řádky) Konstanty hodnoty atributů Unární funkční.
Informatika II PAA DOTAZOVACÍ JAZYKY
Databázové systémy 2 Zkouška – 8:00. Příklad I – Procedura – 5 bodů Vytvořte proceduru P_ZK2(p_table_name VARCHAR2, p_min_nuls NUMBER, p_drop.
Aplikační a programové vybavení
Obchodní akademie, Ostrava-Poruba, příspěvková organizace Vzdělávací materiál/DUM VY_32_INOVACE_01B13 Autor Ing. Jiří Kalousek Období vytvoření březen.
Databázové systémy 2 Cvičení č. 5 Fakulta elektrotechniky a informatiky Univerzita Pardubice.
Databázové systémy SQL Výběr dat.
Použití dotazu jako zdroj dat pro pohled Vypracovala: Procházková Petra.
SQL Další dotazy a pohledy Databázové systémy. Některé SQL příkazy mohou mít v sobě obsaženy další kompletní příkazy SELECT. Využijeme je tam, kde potřebujeme.
J. Pokorný, I Halaška1 DBS: SQL92 Jaroslav Pokorný MFF UK, Praha
SQL Structured Query Language
Databázové systémy I Přednáška č. 6 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky
Příkazy jazyka SQL ve VFP a na SQL Serveru
Úvod do databází zkrácená verze.
SQL – příkaz SELECT Ing. Roman Danel, Ph.D.
Databázové systémy I Přednáška 5 Databázové systémy 1 – KIT/IDAS1
Databázové systémy I Přednáška 8 Databázové systémy 1 – KIT/IDAS1
Databázové systémy a SQL
Databázové systémy a SQL
[ START WITH podmínka ] CONNECT BY podmínka
Optimalizace SQL dotazů
Počítačová cvičení z předmětu Datové sklady
Přednáška 7 SQL – JOIN.
Přednáška 9 Triggery.
Databázové systémy a SQL
Databázové systémy a SQL
Transkript prezentace:

SQL Další dotazy a pohledy Databázové systémy SQL Další dotazy a pohledy

Vnořené dotazy - poddotazy Některé SQL příkazy mohou mít v sobě obsaženy další kompletní příkazy SELECT. Využijeme je tam, kde potřebujeme nejprve zjistit nějakou informaci a v závislosti na ní pak informace další. Mohou se vyskytovat (SQL 86): - v příkazech SELECT, INSERT, UPDATE, DELETE - v klauzulích WHERE a HAVING vnějšího příkazu . Pravidla: Vnořený dotaz je vždy uzavřen mezi závorkami. Vnořený dotaz je ve výrazu vždy na pravé straně. Vnořený dotaz musí vracet vždy pouze jeden sloupec (výraz). V případě, že používáme srovnávací operátory, musí vnořený dotaz vracet právě jeden řádek. Výjimkou jsou množinové operátory.

Množinové operátory (kvantifikátory) predikát příslušnosti do množiny vyraz1 IN (dotaz) jednoduchý existenční kvantifikátor EXISTS (dotaz) - testující prázdnost rozšířené kvantifikátory existenční vyraz1 = | <> | < | > | <= | >= ANY (dotaz) platí, že alespoň jeden prvek/řádek z dotaz-u splňuje daný srovnávací predikát aplikovaný na vyraz1 všeobecný vyraz1 = | <> | < | > | <= | >= ALL (dotaz) platí, že všechny prvky/řádky z dotaz-u splňují daný srovnávací predikát aplikovaný na vyraz1

Jednoduché vnořené dotazy Příklad: Vypište seznam rodných čísel všech klientů, kteří mají nadprůměrný stav na účtu. Pomocí jednoduchých SQL dotazů, tento výsledek obdržíme ve dvou krocích. Nejprve si zjistíme, jaký je průměrný stav na účtech (použijeme agregační funkci AVG): SELECT AVG(stav) FROM Ucet; Tento dotaz nám vrátí např. číslo 47000. Toto číslo si zapamatujeme a použijeme jej v konstrukci následujícího dotazu: SELECT r_cislo, c_uctu FROM Ucet WHERE stav > 47000;

Jednoduché vnořené dotazy Za jednoduchý vnořený dotaz budeme považovat vnořený příkaz SELECT vracející nám jednu hodnotu. SELECT r_cislo, c_uctu FROM Ucet WHERE stav > (SELECT AVG(stav) FROM Ucet); Vnořeným SELECT-em se nám vyhodnotí Vypočtená_hodnota na jednu hodnotu a máme tedy podmínku zapsanou v pořádku. Vnořený SELECT se vyhodnotí pouze jednou, hodnotu si SQL server "zapamatuje" a s ní pak porovnává všechny ostatní hodnoty v tabulce. V jednoduchých vnořených dotazech – poddotazech, budou obdobným způsobem fungovat i další agregační funkce.

Poddotazy vracející více hodnot Operátory - IN, ANY (SOME), ALL Vnořování dotazů nám rozšiřuje klasickou množinu relačních operátorů o operátory další, které se aplikují z levé strany na sloupec a z pravé strany na vnořený dotaz vracející více hodnot. IN - slouží pro jednoduché porovnání, zdali se hodnota sloupce vlevo vyskytuje mezi hodnotami vrácenými vnořeným dotazem. Kdybychom např. chtěli čísla účtů,na kterých proběhly transakce v letech 2005 až 2008, mohli bychom takový dotaz pomocí operátoru IN zapsat takto: SELECT c_uctu,YEAR(datum) rok FROM ucet WHERE YEAR(datum) IN (2005,2006,2007,2008);

Poddotazy vracející více hodnot ANY (nebo SOME) - určují, že relace se vztahuje na alespoň jednu z hodnot, kterou vrátí vnořený dotaz. Chceme-li seznam klientů, kteří mají na účtu víc než 40000: SELECT prijmeni,jmeno FROM Klient WHERE r_cislo = ANY (SELECT r_cislo FROM Ucet WHERE stav > 40000) Je to možné zapsat taky: SELECT prijmeni,jmeno FROM Klient WHERE r_cislo IN (SELECT r_cislo FROM Ucet WHERE stav > 40000) To znamená, že je totožné použití IN a = ANY.

Poddotazy vracející více hodnot ALL - aplikuje relaci na všechny hodnoty vrácené poddotazem. Chceme-li rodné čísla klientů, kteří mají největší počet účtů: SELECT r_cislo,COUNT(*) pocet FROM Ucet GROUP BY r_cislo HAVING počet >= ALL(SELECT COUNT(*)FROM Ucet GROUP BY r_cislo) Nebo, chceme-li vypsat všechny účty vedené na jiných pobočkách než na Zarámí: SELECT c_uctu,pobocka FROM Ucet WHERE pobocka <>ALL (SELECT c_p FROM pobocka WHERE nazev LIKE "Zarami%") V tomto případě platí, že je totožné NOT IN a <> ALL.

Operátor EXISTS Tento operátor vrací pravdivostní hodnotu TRUE nebo FALSE na základě toho, zda vnořený SQL dotaz vrací nějakou hodnotu. EXISTS ( vnořený SQL dotaz ); Jestli vnořený SQL dotaz vrátí alespoň jeden řádek, operátor EXISTS nám vrátí TRUE. Poznámka: Vnořený SQL dotaz v argumentu operátoru EXISTS se vyhodnocuje zvlášť pro každý řádek. Chceme zkontrolovat, zdali každý klient vlastní nějaký účet tj. chceme seznam klientů, u kterých nemáme zadaný žádný účet: SELECT jmeno,prijmeni FROM Klient WHERE NOT EXISTS(SELECT r_cislo FROM Ucet WHERE Klient.r_cislo=Ucet.r_cislo);

Vnořené dotazy v SQL 86 bylo dovoleno jejich užití pouze v predikátech IN, ANY, ALL, EXISTS standard SQL92 rozšiřuje možnost použití vnořených dotazů také v klauzuli FROM Dva druhy použití: SELECT ... FROM (dotaz) AS d1 WHERE ... umožňuje výběr přímo z výsledku jiného dotazu (místo tabulky) poddotaz je pojmenován d1 a s tímto identifikátorem se pracuje v dalších klauzulích jako s identifikátorem tabulky SELECT ... FROM ((dotaz) AS d1 CROSS | NATURAL | INNER | OUTER | LEFT | RIGHT JOIN (dotaz) AS d2 ON (vyraz) použití v libovolném spojení

Příklad Pro klienty vlastnící účet vrať počet všech účtů a jejich celkový stav. SELECT k.prijmeni,k.jmeno, d1.Pocet_uctu, d1.Stav_celkem FROM Klient k, (SELECT r_cislo, COUNT(*) Pocet_uctu, SUM(stav) Stav_celkem FROM ucet GROUP BY r_cislo) AS d1 WHERE k.r_cislo = d1.r_cislo; Jmeno Prijmeni Počet_uctu Stav_celkem Pavel Nováček 1 75000.00 Petra Nováková 3 117000.00

Dotazy s omezením výpisu často chceme vrátit prvních n výsledků (podle uspořádání v ORDER BY) pomalá verze (SQL 92) SELECT … FROM tabulka AS t1 WHERE (SELECT COUNT(*) FROM tabulka AS t2    WHERE t1.<třídící pole> < t2.<třídící pole>) < n; rychlá verze (SQL 99 - Oracle, DB2) SELECT … FROM ( SELECT ROW_NUMBER() OVER (ORDER BY <třídící pole> ASC | DESC) AS rownumber FROM tablename) WHERE rownumber <= n další implementace SELECT ... FROM ... ORDER BY <třídící pole> ASC | DESC LIMIT n MySQL, PostgreSQL SELECT TOP n ... FROM ... ORDER BY <třídící pole> ASC | DESC MS SQL Server

Skládání dotazů - Sjednocení dotazů Pro sjednocení výsledků dotazů slouží klíčové slovo UNION, za kterým následuje další příkaz SELECT. Chceme seznam všech účtů, ke kterým mají práva Petra Nováková, nebo Pavel Nováček. a) bez použití skládání dotazů: SELECT k.jmeno,k.prijmeni, p.ucet FROM Klient k, Prava_k_uctu p WHERE k.r_cislo = p.klient AND ( (jmeno = 'Petra' AND prijmeni = 'Nováková') OR (jmeno = 'Pavel' AND prijmeni = 'Nováček'));

Skládání dotazů - Sjednocení dotazů b) s pomocí sjednocení : SELECT k.jmeno,k.prijmeni, p.ucet FROM Klient k, Prava_k_uctu p WHERE k.r_cislo = p.klient AND jmeno = 'Petra' AND prijmeni = 'Nováková' UNION AND jmeno = 'Pavel' AND prijmeni = 'Nováček';

Skládání dotazů - Průnik dotazů Pro průnik se používá klíčové slovo INTERSECT. Chceme názvy všech předmětů, které navštěvuje Petra Nováková a zároveň Pavel Nováček (a možná také někdo další). a) bez použití průniku dotazů: SELECT k.jmeno,k.prijmeni, p.ucet FROM Klient k, Prava_k_uctu p WHERE k.r_cislo = p.klient AND ( (jmeno = 'Petra' AND prijmeni = 'Nováková') AND (jmeno = 'Pavel' AND prijmeni = 'Nováček')); Takový dotaz je samozřejmě chybný. V žádném řádku pseudotabulky, která vznikne spojením uvedených tří tabulek, nemůže nastat situace, že by jméno bylo Petra a zároveň Pavel...

Skládání dotazů - Průnik dotazů )b) s použitím průniku dotazů : SELECT k.jmeno,k.prijmeni, p.ucet FROM Klient k, Prava_k_uctu p WHERE k.r_cislo = p.klient AND jmeno = 'Petra' AND prijmeni = 'Nováková' INTERSECT AND jmeno = 'Pavel' AND prijmeni = 'Nováček';

Skládání dotazů - Průnik dotazů )c) tam, kde nefunguje INTERSECT: SELECT p.ucet FROM Pravakuctu p WHERE p.klient IN (SELECT k.r_cislo FROM Klient k WHERE (k.jmeno = 'Petra' AND k.prijmeni = 'Nováková') OR(jmeno = 'Pavel' AND prijmeni = 'Nováček')) GROUP BY p.ucet HAVING COUNT(*)>1;

Další příkazy SQL Uzamčení tabulky Vytvoření dočasné tabulky LOCK TABLES nazev_tabulky READ, nazev_tabulky WRITE; uzamkne jmenované tabulky pro čtení (READ), nebo zápis (WRITE) - po uzamknutí mají právo čtení, nebo zápisu v tabulce pouze ty příkazy, které se nachází mezi LOCK ... UNLOCK. UNLOCK TABLES; - odemčení všech zamčených tabulek. Vytvoření dočasné tabulky CREATE TEMPORARY TABLE nazev_tabulky (nazev_sloupce datovy_typ,.. ); - takto vytvoříme dočasnou tabulku, která po uzavření spojení s databází zanikne.

Výstup do textového souboru: TO OUTFILE SELECT * FROM Tabulka INTO OUTFILE "Soubor"; Provede výpis výsledku do textového souboru "Soubor". Název souboru musí být textový řetězec (v uvozovkách). Načtení dat z textového souboru: LOAD DATA INFILE Provede načtení řádků z textového souboru do tabulky, velkou rychlostí. LOAD DATA INFILE 'data.txt' INTO TABLE tabulka; Prioritně se načte do aktivní databáze, ale lze zadefinovat i jinou databázi - databaze.tabulka;

Uživatelské proměnné Index FULLTEXT SET @a=hodnota; SELECT @a:=hodnota; - do proměnné "a" se uloží nějaká "hodnota", kterou si MySQL pamatuje do konce aktuálního spojení - (proměnnou nelze zatím použít úplně ve všech dotazech MySQL). Index FULLTEXT - platí pro sloupce typu CHAR, VARCHAR a TEXT - fulltextový index slouží k rychlejšímu hledání dat v textových polích hledání v takovýchto polích provádíme pomocí příkazů MATCH a AGAINST. př.: SELECT * FROM tabulka WHERE MATCH(sloupec) AGAINST("hledana_hodnota");

Pohledy Pohled - VIEW- pojmenovaný dotaz, který lze využít jako tabulku generuje se dynamicky, podle dat vypočtených v okamžiku použití lze do něj vkládat, mazat data CHECK OPTION zajistí, že po vložení/změně záznamu do pohledu bude tato změna „vidět“ alespoň v tomto pohledu ve všech závislých pohledech

Pohledy Vytvoření pohledu Z bázových tabulek odvozené virtuální tabulky. 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ř) Pohled pro klienty z pobočky Zarámí. CREATE VIEW Zarami AS SELECT K.* FROM Klient k, Ucet u, Pobocka p WHERE k.r_cislo=u.r_cislo AND u.pobocka=p.c_p AND p.nazev LIKE 'Zarámí%' WITH CHECK OPTION

Manipulace na pohledech Odstranění pohledu DROP VIEW jm_pohledu [RESTRICT|CASCADE]; Zruší informaci o pohledu ze systémového katalogu Manipulace na pohledech Př) Chceme vypsat všechny klienty ze Zlína, kteří mají účet vedený na pobočce Zarámí: SELECT * FROM Zarami WHERE mesto= 'Zlín' nebo bez využití pohledu SELECT K.* FROM Klient k, Ucet u, Pobocka p WHERE k.r_cislo=u.r_cislo AND u.pobocka=p.c_p AND p.nazev LIKE 'Zarámí% AND mesto= 'Zlín' SŘBD musí být schopen jednoznačně transformovat operace řádku pohledu na operace nad zdrojovými bázovými tabulkami

Selektivní pohled Agregační pohled CREATE VIEW Zlinsti AS SELECT * FROM Klient WHERE mesto=´Zlín´; Agregační pohled CREATE VIEW pocty (nazev,pocet) AS SELECT p.nazev,COUNT(*) FROM Ucet u JOIN Pobocka p ON u.pobocka=p.c_p 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í.

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í: Datové sklady – sumarizační pohledy. Distribuované databáze – replikace dat v uzlech. Mobilní databáze – materializace pohledů používaných mobilními klienty.