+ All Categories
Home > Documents > SQL Další dotazy a pohledy

SQL Další dotazy a pohledy

Date post: 10-Jan-2016
Category:
Upload: airlia
View: 48 times
Download: 3 times
Share this document with a friend
Description:
SQL Další dotazy a pohledy. Databázové systémy. 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ší. - PowerPoint PPT Presentation
25
SQL Další dotazy a pohledy Databázové systémy
Transcript
Page 1: SQL  Další dotazy a pohledy

SQL Další dotazy a

pohledy

Databázové

systémy

Page 2: SQL  Další dotazy a pohledy

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.

Vnořené dotazy - poddotazy

Page 3: SQL  Další dotazy a pohledy

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

Page 4: SQL  Další dotazy a pohledy

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):

Jednoduché vnořené dotazy

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_uctuFROM UcetWHERE stav > 47000;

Page 5: SQL  Další dotazy a pohledy

Za jednoduchý vnořený dotaz budeme považovat vnořený příkaz SELECT vracející nám jednu hodnotu.

Jednoduché vnořené dotazy

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.

SELECT r_cislo, c_uctuFROM UcetWHERE stav > (SELECT AVG(stav) FROM Ucet);

Page 6: SQL  Další dotazy a pohledy

Operátory - IN, ANY (SOME), ALLVnoř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:

Poddotazy vracející více hodnot

SELECT c_uctu,YEAR(datum) rokFROM ucetWHERE YEAR(datum) IN (2005,2006,2007,2008);

Page 7: SQL  Další dotazy a pohledy

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:

Poddotazy vracející více hodnot

SELECT prijmeni,jmenoFROM KlientWHERE r_cislo = ANY (SELECT r_cislo FROM Ucet

WHERE stav > 40000)

Je to možné zapsat taky:

To znamená, že je totožné použití IN a = ANY.

SELECT prijmeni,jmenoFROM KlientWHERE r_cislo IN (SELECT r_cislo FROM Ucet

WHERE stav > 40000)

Page 8: SQL  Další dotazy a pohledy

ALL - aplikuje relaci na všechny hodnoty vrácené poddotazem.Chceme-li rodné čísla klientů, kteří mají největší počet účtů:

Poddotazy vracející více hodnot

SELECT r_cislo,COUNT(*) pocetFROM Ucet GROUP BY r_cisloHAVING počet >= ALL(SELECT COUNT(*)FROM Ucet

GROUP BY r_cislo)

SELECT c_uctu,pobockaFROM UcetWHERE pobocka <>ALL (SELECT c_p FROM pobocka

WHERE nazev LIKE "Zarami%")

Nebo, chceme-li vypsat všechny účty vedené na jiných pobočkách než na Zarámí:

V tomto případě platí, že je totožné NOT IN a <> ALL.

Page 9: SQL  Další dotazy a pohledy

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:

Operátor EXISTS

SELECT jmeno,prijmeniFROM Klient WHERE NOT EXISTS(SELECT r_cislo FROM Ucet WHERE Klient.r_cislo=Ucet.r_cislo);

Page 10: SQL  Další dotazy a pohledy

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í

Page 11: SQL  Další dotazy a pohledy

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;

Příklad

Jmeno Prijmeni Počet_uctu Stav_celkem

Pavel Nováček 1 75000.00

Petra Nováková 3 117000.00

Page 12: SQL  Další dotazy a pohledy

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 t1WHERE (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

Page 13: SQL  Další dotazy a pohledy

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ů:

Skládání dotazů - Sjednocení dotazů

SELECT k.jmeno,k.prijmeni, p.ucetFROM Klient k, Prava_k_uctu pWHERE k.r_cislo = p.klientAND ( (jmeno = 'Petra' AND prijmeni = 'Nováková') OR (jmeno = 'Pavel' AND prijmeni = 'Nováček'));

Page 14: SQL  Další dotazy a pohledy

Skládání dotazů - Sjednocení dotazů

b) s pomocí sjednocení :

SELECT k.jmeno,k.prijmeni, p.ucetFROM Klient k, Prava_k_uctu pWHERE k.r_cislo = p.klientAND jmeno = 'Petra' AND prijmeni = 'Nováková'UNIONSELECT k.jmeno,k.prijmeni, p.ucetFROM Klient k, Prava_k_uctu pWHERE k.r_cislo = p.klientAND jmeno = 'Pavel' AND prijmeni = 'Nováček';

Page 15: SQL  Další dotazy a pohledy

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ů:

Skládání dotazů - Průnik dotazů

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...

SELECT k.jmeno,k.prijmeni, p.ucetFROM Klient k, Prava_k_uctu pWHERE k.r_cislo = p.klientAND ( (jmeno = 'Petra' AND prijmeni = 'Nováková') AND (jmeno = 'Pavel' AND prijmeni = 'Nováček'));

Page 16: SQL  Další dotazy a pohledy

Skládání dotazů - Průnik dotazů

)b) s použitím průniku dotazů :

SELECT k.jmeno,k.prijmeni, p.ucetFROM Klient k, Prava_k_uctu pWHERE k.r_cislo = p.klientAND jmeno = 'Petra' AND prijmeni = 'Nováková'INTERSECTSELECT k.jmeno,k.prijmeni, p.ucetFROM Klient k, Prava_k_uctu pWHERE k.r_cislo = p.klientAND jmeno = 'Pavel' AND prijmeni = 'Nováček';

Page 17: SQL  Další dotazy a pohledy

SELECT p.ucetFROM Pravakuctu pWHERE 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;

Skládání dotazů - Průnik dotazů

)c) tam, kde nefunguje INTERSECT:

Page 18: SQL  Další dotazy a pohledy

Další příkazy SQL

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

LOCK TABLES nazev_tabulky READ, nazev_tabulky WRITE;

CREATE TEMPORARY TABLE nazev_tabulky (nazev_sloupce datovy_typ,.. );

- takto vytvoříme dočasnou tabulku, která po uzavření spojení s databází zanikne.

Uzamčení tabulky

Page 19: SQL  Další dotazy a pohledy

Výstup do textového souboru: TO OUTFILE

SELECT * FROM Tabulka INTO OUTFILE "Soubor";

Načtení dat z textového souboru: LOAD DATA INFILE Provede načtení řádků z textového souboru do tabulky, velkou rychlostí.

Provede výpis výsledku do textového souboru "Soubor". Název souboru musí být textový řetězec (v uvozovkách).

Prioritně se načte do aktivní databáze, ale lze zadefinovat i jinou databázi - databaze.tabulka;

LOAD DATA INFILE 'data.txt' INTO TABLE tabulka;

Page 20: SQL  Další dotazy a pohledy

Uživatelské proměnné

- 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).

- 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ř.:

SET @a=hodnota;SELECT @a:=hodnota;

Index FULLTEXT

SELECT * FROM tabulkaWHERE MATCH(sloupec) AGAINST("hledana_hodnota");

Page 21: SQL  Další dotazy a pohledy

PohledyPohled - 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

Page 22: SQL  Další dotazy a pohledy

PohledyZ bázových tabulek odvozené virtuální tabulky.

CREATE VIEW jm_pohledu [(jm_sloupce, …)] AS tab_výraz [WITH CHECK OPTION]

Vytvoření pohledu

- 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

Page 23: SQL  Další dotazy a pohledy

DROP VIEW jm_pohledu [RESTRICT|CASCADE];

Odstranění pohledu

Zruší informaci o pohledu ze systémového katalogu

Př) Chceme vypsat všechny klienty ze Zlína, kteří mají účet vedený na pobočce Zarámí:

Manipulace na pohledech

SŘBD musí být schopen jednoznačně transformovat operace řádku pohledu na operace nad zdrojovými bázovými tabulkami

SELECT * FROM Zarami WHERE mesto= 'Zlín'

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'

nebo bez využití pohledu

Page 24: SQL  Další dotazy a pohledy

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í.

Selektivní pohled

CREATE VIEW Zlinsti AS SELECT * FROM Klient WHERE mesto=´Zlín´;

Agregační pohled

Page 25: SQL  Další dotazy a pohledy

Materializované pohledyPohledy, 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.


Recommended