Databázové systémy. Agregace, sumarizace, vnořené dotazy. Vilém Vychodil



Podobné dokumenty
Databázové systémy. Přirozené spojení. Vilém Vychodil. V. Vychodil (KMI/DATA1, Přednáška 4) Přirozené spojení Databázové systémy 1 / 41

Databázové systémy. Integritní omezení. Vilém Vychodil. V. Vychodil (KMI/DATA1, Přednáška 9) Integritní omezení Databázové systémy 1 / 33

Databázové systémy. Vilém Vychodil. V. Vychodil (KMI/DATA1, Přednáška 3) Základní relační operace Databázové systémy 1 / 37

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

Databázové systémy. Úvod do teorie normalizace. Vilém Vychodil

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

PG 9.5 novinky ve vývoji aplikací

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

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

Databáze SQL SELECT. David Hoksza

Kapitola 4: SQL. Základní struktura

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

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

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

Databázové systémy. Relační model dat. Vilém Vychodil. V. Vychodil (KMI/DATA1, Přednáška 2) Relační model dat Databázové systémy 1 / 43

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

Databázové systémy I

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

PostgreSQL. Podpora dědičnosti Rozšiřitelnost vlastní datové typy. Univerzální nasazení ve vědecké sféře

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

6. blok část B Vnořené dotazy

DATA CUBE. Mgr. Jiří Helmich

Databázové systémy. Ostatní typy spojení. Vilém Vychodil. V. Vychodil (KMI/DATA1, Přednáška 5) Ostatní typy spojení Databázové systémy 1 / 34

SQL SQL-SELECT. Informační a znalostní systémy. Informační a znalostní systémy SQL- SELECT

Operátory ROLLUP a CUBE

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

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ů

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

Čteme EXPLAIN. CSPUG, Praha. Tomáš Vondra Czech and Slovak PostgreSQL Users Group

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

Databázové systémy. * relační kalkuly. Tomáš Skopal. - relační model

Multi-dimensional expressions

INDEXY JSOU GRUNT. Pavel Stěhule

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

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

KIV/ZIS - SQL dotazy. stáhnout soubor ZIS- 04_TestovaciDatabaze accdb. SQL dotazy. budeme probírat pouze SELECT

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

Paralelní dotazy v PostgreSQL 9.6 (a 10.0)

6. blok část C Množinové operátory

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

KIV/ZIS - SELECT, opakování

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

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

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

MySQL sežere vaše data

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

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

- sloupcové integritní omezení

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

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

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

FAKULTA STAVEBNÍ STUDIJNÍ PROGRAM: GEODÉZIE A KARTOGRAFIE TYP PROGRAMU: MAGISTERSKÝ STUDIJNÍ OBOR: GEOMATIKA ÚVOD DO ZPRACOVÁNÍ PROSTOROVÝCH DAT

5. blok Souhrnné a skupinové dotazy

MS Access Dotazy SQL

IDS optimalizátor. Ing. Jan Musil, IBM ČR Community of Practice for

Materializované pohledy

Databázové systémy Tomáš Skopal

Vkládání poddotazů do dotazů

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

Dotazovací jazyky I. Datová krychle. Soběslav Benda

Database systems. Normal forms

1. Relační databázový model

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

Formální sémantika SQL dotazování

Úvod do databázových systémů 3. cvičení

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

Novinky v PostgreSQL 9.4. Tomáš Vondra, 2ndQuadrant

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

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

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

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

Vzorové příklady SQL. Tabulka: Kniha CREATE TABLE kniha (id INTEGER, název VARCHAR(50), PRIMARY KEY (id))

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

Optimalizace dotazů a databázové transakce v Oracle

Analýza a modelování dat. Přednáška 9

Materiál ke cvičením - SQL

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

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4.

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

OQL. (Object Query Language) Michal Bartoš Filip Bureš

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

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

Kapitola 3: Relační model. Základní struktura. Relační schéma. Instance relace

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

TimescaleDB. Pavel Stěhule 2018

Databáze 2011/2012 SQL SELECT II. RNDr.David Hoksza, Ph.D.

Ukládání a vyhledávání XML dat

Databáze. Velmi stručný a zjednodušený úvod do problematiky databází pro programátory v Pythonu. Bedřich Košata

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

RELAČNÍ DATABÁZOVÉ SYSTÉMY

Zpracování informací

Analýza a modelování dat. Přednáška 8

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

Téma 9 Relační algebra a jazyk SQL

SQL injection princip a ochrana

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

Stored Procedures & Database Triggers, Tiskové sestavy v Oracle Reports

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

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

Transkript:

Databázové systémy Agregace, sumarizace, vnořené dotazy Vilém Vychodil KMI/DATA1, Přednáška 7 Databázové systémy V. Vychodil (KMI/DATA1, Přednáška 7) Agregace, sumarizace, vnořené dotazy Databázové systémy 1 / 32

Přednáška 7: Přehled 1 Agregace: obecné agregační funkce, agregace hodnot relací v Tutorial D. 2 Sumarizace: sumarizace v Tutorial D a SQL, sumarizace jako odvozená operace, agregace vs. sumarizace. 3 Vnořené dotazy a kvantifikace: syntax vnořených dotazů, typy vnořených dotazů: skalární, řádkové, tabulkové, korelované vnořené dotazy a otázky efektivity. 4 Okrajová témata: nerelační modifikace výpisu dotazu. V. Vychodil (KMI/DATA1, Přednáška 7) Agregace, sumarizace, vnořené dotazy Databázové systémy 2 / 32

Agregační operace motivace: Ze všech hodnot konkrétního atributu nějaké relace chceme vypočíst jedinou (agregovanou) hodnotu, typicky skalárního typu. agregační funkce, angl.: aggregation function Za agragační funkci považujeme každou funkci, která na základě dané relace (a jejího atributu) vrací hodnotu, která závisí pouze na hodnotách daného atributu v relaci. Tutorial D: primitivní agregační operátory: AND, AVG (průměrná hodnota), COUNT (vyžaduje právě jeden argument relaci), D_UNION, EQUIV (sudý počet hodnot je FALSE), EXACTLY (vyžaduje dodatečný argument n typu INT, uvedený jako první; výsledek agregace je TRUE pokud má atribut právě n hodnot TRUE), INTERSECT, MAX, MIN, OR, SUM, UNION, XOR (lichý počet hodnot je TRUE), XUNION V. Vychodil (KMI/DATA1, Přednáška 7) Agregace, sumarizace, vnořené dotazy Databázové systémy 3 / 32

Příklad (Tutorial D: Vstupní data pro příklady) VAR scores BASE RELATION {name CHAR, course CHAR, date CHAR, score INT} KEY {name, course, date}; předpokládaná hodnota proměnné: NAME COURSE DATE SCORE Abbe KMI/DATA1 13/01/05 56 Abbe KMI/DATA1 13/01/08 83 Abbe KMI/PAPR1 12/04/13 65 Blangis KMI/PAPR1 12/04/14 34 Blangis KMI/DATA2 13/01/08 13 Curval KMI/PAPR1 12/04/14 75 Durcet KMI/PAPR1 12/04/14 75 Durcet KMI/DATA1 13/02/23 38 Durcet KMI/DATA1 13/02/26 89 V. Vychodil (KMI/DATA1, Přednáška 7) Agregace, sumarizace, vnořené dotazy Databázové systémy 4 / 32

Příklad (Tutorial D: Agregační operace produkující číselnou hodnotu) /* mean and extremal values */ AVG (scores, score) = 58.666 MIN (scores, score) = 13 MAX (scores, score) = 89 /* computing sums */ SUM (scores, score) = 528 SUM (scores {score}, score) = 453 /* counts of tuples in relations */ COUNT (scores) = 9 COUNT (scores {score}) = 8 /* sum with explicit type conversion */ CAST_AS_RATIONAL (SUM (scores, score)) = 528.0 V. Vychodil (KMI/DATA1, Přednáška 7) Agregace, sumarizace, vnořené dotazy Databázové systémy 5 / 32

Příklad (Tutorial D: Agregační operace pro pravdivostní hodnoty) /* auxiliary virtual variables */ VAR high VIRTUAL (EXTEND scores: {foo := score > 50}); VAR low VIRTUAL (EXTEND scores: {foo := score <= 50}); /* aggregation by logical equivalence */ EQUIV (high, foo) = FALSE /* aggregation by logical non-equivalence */ XOR (high, foo) = FALSE /* aggregation by logical conjunction and disjuntion */ AND (high, foo) = FALSE OR (high, foo) = TRUE /* exact number of values is true */ EXACTLY (6, high, foo) = TRUE EXACTLY (3, low, foo) = TRUE V. Vychodil (KMI/DATA1, Přednáška 7) Agregace, sumarizace, vnořené dotazy Databázové systémy 6 / 32

Příklad (Tutorial D: Agregační operace produkující relační hodnotu) /* auxiliary virtual variable */ VAR course_results VIRTUAL (scores GROUP {name, date, score} AS result); /* aggregations of relational values */ UNION (course_results, result) = D_UNION (course_results, result) = XUNION (course_results, result) = INTERSECT (course_results, result) = /* auxiliary virtual variable */ VAR date_exams VIRTUAL (scores {ALL BUT score} GROUP {name, course} AS registered); D_UNION (date_exams, registered) /* error: not disjoint */ V. Vychodil (KMI/DATA1, Přednáška 7) Agregace, sumarizace, vnořené dotazy Databázové systémy 7 / 32

Příklad (Tutorial D: Aplikace agregačních operací, vyjádření UNGROUP) /* new virtual variable */ VAR goo VIRTUAL (scores GROUP {date, score} AS result) KEY {name, course}; /* ungrouping of the result attribute */ goo UNGROUP result /* can equivalently be expressed by */ ((EXTEND UNION (goo, result): { res := RELATION {TUPLE {score score, date date}} }) TIMES goo WHERE res <= result) {ALL BUT res, result} /* alternatively, using WRAP, UNWRAP, and IN */ ((UNION (goo, result) WRAP ({score, date} AS res)) TIMES goo WHERE res IN result) {ALL BUT result} UNWRAP (res) V. Vychodil (KMI/DATA1, Přednáška 7) Agregace, sumarizace, vnořené dotazy Databázové systémy 8 / 32

Sumarizace agregace sumarizace: agregace jediná hodnota stanovená ze všech hodnot atributu dané relace sumarizace výsledkem je relace obsahující hodnoty vypočtené z (částí) hodnot (některých) atributů v dané relaci Tutorial D: SQL: obecné výrazy SUMMARIZE (viz dále) SELECT DISTINCT výraz 1 AS nový-atribut 1,... FROM jméno WHERE podmínka GROUP BY atribut 1,..., atribut n HAVING agregační-podmínka V. Vychodil (KMI/DATA1, Přednáška 7) Agregace, sumarizace, vnořené dotazy Databázové systémy 9 / 32

Sumarizace v Tutorial D: Syntax možné tvary použití: SUMMARIZE relační-výraz : { nový-atribut 1 := výraz 1,...} SUMMARIZE relační-výraz BY { atribut 1,...}: { nový-atr 1 := výraz 1,...} SUMMARIZE relační-výraz PER ( univerzum ): { nový-atr 1 := výraz 1,...} role argumentů: hodnotou relační-výraz je relace, kterou chceme sumarizovat nový-atribut i jsou atributy nevyskytující se ve schématu relačního výrazu výraz i jsou výrazy obsahující sumarizační funkce: AND, AVG, COUNT, D_UNION, EQUIV, EXACTLY, INTERSECT, MAX, MIN, OR, SUM, UNION, XOR, XUNION schéma relačního výrazu univerzum je podmnožinou schémtu relační-výraz v druhém případě je možné použít i notaci BY {ALL BUT atribut 1,...}} V. Vychodil (KMI/DATA1, Přednáška 7) Agregace, sumarizace, vnořené dotazy Databázové systémy 10 / 32

Sumarizace v Tutorial D: Sémantika interpretace sumarizace ve tvaru: SUMMARIZE relační-výraz PER ( univerzum ): { nový-atr 1 := výraz 1,...} je vyjádřena v následujících krocích: 1 nechť relační-výraz má hodnotu D (na schématu R) a univerzum má hodnotu D U (na schématu S R); 2 pro každou s D U vypočti {r D s r}; 3 vyhodnoť všechny výraz i za předpokladů, že proměnné odpovídající atributům y S jsou navázány na hodnoty r(y); y R \ S jsou navázány na relace {s} D a jejich hondoty musí být sumarizovány pomocí sumarizačních funkcí; n-tici výsledků označ t; 4 vlož s t do výsledku V. Vychodil (KMI/DATA1, Přednáška 7) Agregace, sumarizace, vnořené dotazy Databázové systémy 11 / 32

Sumarizace v Tutorial D: Poznámky ekvivalentní vyjádření v SUMMARIZE: BY { atribut 1,...} PER ( relační-výraz { atribut 1,...}) vynechání PER i BY je ekvivalentní uvedení PER (TABLE_DEE) Příklad (Tutorial D: Mezní případy sumarizace) /* summarization over DUM and DEE */ SUMMARIZE scores PER (TABLE_DUM): {x := COUNT()} = RELATION {x INTEGER} {} (SUMMARIZE scores PER (TABLE_DEE): {x := COUNT()}) = RELATION {TUPLE {x 9}} /* summarization over the same relation */ SUMMARIZE scores PER (scores): {x := COUNT()} EXTEND scores: {x := 1} V. Vychodil (KMI/DATA1, Přednáška 7) Agregace, sumarizace, vnořené dotazy Databázové systémy 12 / 32

Příklad (Tutorial D: Sumarizace) /* aggregation vs. summarization */ AVG (scores, score) = 58.666 SUMMARIZE scores: {average := AVG (score)} = RELATION {TUPLE {average 58.666}} SUMMARIZE scores BY {name}: {m := MAX (score), cnt := COUNT ()} /* allows to have zero counts */ SUMMARIZE scores PER (people {name}): {cnt := COUNT ()} /* summarization of relational attributes */ SUMMARIZE (scores GROUP {name, date, score} AS result) {result}: { x := UNION (result), y := INTERSECT (result) } V. Vychodil (KMI/DATA1, Přednáška 7) Agregace, sumarizace, vnořené dotazy Databázové systémy 13 / 32

Agregační vs. sumarizační funkce Poznámka o významu sumarizačních funkcí Sumarizační funkce nejsou funkce (procedury) v pravém slova smyslu: jejich použití je možné pouze uvnitř těla výrazu SUMMARIZE a narozdíl od agregačních funkcí se jim nepředávají jako argumenty relace, ve kterých se hodnoty agregují (sumarizují). Příklad (Tutorial D: Sumarizace vs. nekorektní použití agregace) /* correct use of summarization function AVG */ SUMMARIZE scores: {average := AVG (score)} = RELATION {TUPLE {average 58.666}} /* error: makes no sense outside of SUMMARIZE */ AVG (score) V. Vychodil (KMI/DATA1, Přednáška 7) Agregace, sumarizace, vnořené dotazy Databázové systémy 14 / 32

Příklad (Tutorial D: Sumarizace jako odvozená operace) /* summarization */ SUMMARIZE foo PER (baz {qux}): { total := COUNT (), conj := AND (b) } /* can be expressed as extension */ EXTEND baz {qux}: { total := COUNT (foo COMPOSE RELATION {TUPLE {qux qux}}), conj := AND (foo COMPOSE RELATION {TUPLE {qux qux}}, b) } foo: QUX B 10 FALSE 10 TRUE 20 FALSE baz: QUX NAME 10 Abbe 20 Blangis 30 Curval result: QUX TOTAL CONJ 10 2 FALSE 20 1 FALSE 30 0 TRUE V. Vychodil (KMI/DATA1, Přednáška 7) Agregace, sumarizace, vnořené dotazy Databázové systémy 15 / 32

Příklad (SQL: Sumarizace) SELECT count (*) FROM scores; SELECT count (name) FROM scores; SELECT avg (score), min (score), max (score) FROM scores; SELECT avg (score) AS average FROM scores; SELECT name, avg (score) AS average FROM scores GROUP BY name; SELECT name, avg (score) AS average FROM scores WHERE date LIKE 13% GROUP BY name; SELECT name, avg (score) AS average FROM scores WHERE date LIKE 13% GROUP BY name HAVING min (score) < 50; V. Vychodil (KMI/DATA1, Přednáška 7) Agregace, sumarizace, vnořené dotazy Databázové systémy 16 / 32

Vnořené dotazy v SQL Definice (Vnořené dotazy v SQL, angl.: subqueries) Uzávorkovaný výraz ve tvaru příkazu SELECT, případně uzávorkovaný výraz typu VALUES se nazývá vnořený dotaz (je to výraz, na konci není znak ; ). Příklad (SQL: Vnoření dotazy) (SELECT * FROM foo) (SELECT x, y FROM foo) (SELECT x, y FROM foo, bar) (SELECT x, y FROM foo, bar WHERE foo.x = bar.y) (VALUES (10)) (VALUES ( Abbe, 10)) (VALUES ( Abbe, 10), ( Blangis, 20)) V. Vychodil (KMI/DATA1, Přednáška 7) Agregace, sumarizace, vnořené dotazy Databázové systémy 17 / 32

Typy vnořených dotazů v SQL Vnořené dotazy v SQL mají jinou sémantiku podle jejich místa výskytu v dotazu. (!!) Vnořené dotazy v SQL dělíme na: skalární v dotazu se vyskytují v místech, kde je očekávaná skalární hodnota: v tom případě se vnořený dotaz musí vyhodnotit na relaci obsahující jedinou n-tici a jediný atribut a tato relace je následně přetypována na skalární hodnotu; řádkové v dotazu se vyskytují v místech, kde je očekávaná hodnota typu řádek: vnořený výraz se musí vyhodnotit na relaci obsahující jedinou n-tici a tato relace je následně přetypována na hodnotu typu řádek ; tabulkové všechny ostatní. poznámka: koerce (implicitní přetypování) dominantní (a dost nebezpečný) rys SQL V. Vychodil (KMI/DATA1, Přednáška 7) Agregace, sumarizace, vnořené dotazy Databázové systémy 18 / 32

Příklad (SQL: Skalární vnořené dotazy) /* students with scores better than the average */ SELECT name, course, date FROM scores WHERE score > (SELECT avg (score) FROM scores); /* students and their best scores (notice the alias for scores) */ SELECT DISTINCT name, (SELECT max (score) FROM scores WHERE name = x.name) AS best FROM scores AS x; /* scores of Abbe */ SELECT * FROM scores WHERE name = (VALUES ( Abbe )); /* extension by a new constrant attribute */ SELECT *, (VALUES (10)) AS ten FROM scores; SELECT *, (SELECT (VALUES (10))) AS ten FROM scores; V. Vychodil (KMI/DATA1, Přednáška 7) Agregace, sumarizace, vnořené dotazy Databázové systémy 19 / 32

Příklad (SQL: Řádkové vnořené dotazy) /* results of Abbe in KMI/DATA1 */ SELECT * FROM scores WHERE (name, course) = (VALUES ( Abbe, KMI/DATA1 )); /* worst score of Abbe */ SELECT * FROM scores WHERE (name, score) = (SELECT name, min (score) FROM scores WHERE name = Abbe GROUP BY name); /* the same using explicit ROW */ SELECT * FROM scores WHERE ROW (name, score) = (SELECT name, min (score) FROM scores WHERE name = Abbe GROUP BY name); V. Vychodil (KMI/DATA1, Přednáška 7) Agregace, sumarizace, vnořené dotazy Databázové systémy 20 / 32

Příklad (SQL: Tabulkové vnořené dotazy) /* scores in courses where the average score is less than 65 */ SELECT * FROM scores WHERE course IN (SELECT course FROM scores GROUP BY course HAVING avg (score) < 65); /* courses with difference of best/worst scores less than 20 */ SELECT * FROM (SELECT course, max (score) AS best, min (score) AS worst FROM scores GROUP BY course) AS foo WHERE best - worst < 20; /* table subqueries using VALUES */ SELECT * FROM scores WHERE (name, course) IN (VALUES ( Abbe, KMI/DATA1 ), ( Curval, KMI/DATA1 )); SELECT * FROM (VALUES (10, 20), (30, 40)) AS foo (x, y); V. Vychodil (KMI/DATA1, Přednáška 7) Agregace, sumarizace, vnořené dotazy Databázové systémy 21 / 32

Korelované vnořené dotazy v SQL Definice (korelovaný vnořený dotaz, angl.: correlated query) Vnořený dotaz se nazývá korelovaný, pokud výraz, ze kterého se vnořený dotaz skládá, obsahuje nějaký odkaz na atributy tabulky ve vnější části celého dotazu. typická forma dotazu: SELECT FROM tabulka AS jméno WHERE (SELECT FROM WHERE jméno. atribut ); } {{ } podmínka obsahující atribut z tabulky jméno poznámky: klasický indikátor neefektivity snažíme se je eliminovat korelovaný vnořený dotaz se opakovaně vyhodnocuje V. Vychodil (KMI/DATA1, Přednáška 7) Agregace, sumarizace, vnořené dotazy Databázové systémy 22 / 32

Příklad (SQL: Korelované vnořené dotazy) /* non-correlated table subquery */ SELECT * FROM scores WHERE course IN (SELECT course FROM scores GROUP BY course HAVING avg (score) < 65); /* scalar correlated variant of the previous query */ SELECT * FROM scores AS foo WHERE (SELECT avg (score) FROM scores WHERE course = foo.course) < 65; /* non-correlated variant using natural join */ SELECT foo.* FROM scores AS foo NATURAL JOIN (SELECT course, avg (score) AS average FROM scores GROUP BY course) AS bar WHERE bar.average < 65; V. Vychodil (KMI/DATA1, Přednáška 7) Agregace, sumarizace, vnořené dotazy Databázové systémy 23 / 32

Příklad (SQL: Srovnání efektivity) /* non-correlated table subquery */ EXPLAIN SELECT * FROM scores WHERE course IN (SELECT course FROM scores GROUP BY course HAVING avg (score) < 65); použitý plán: Hash Semi Join (cost=25.15..48.25 rows=255 width=128) Hash Cond: ((scores.course)::text = (scores_1.course)::text) -> Seq Scan on scores (cost=0.00..15.10 rows=510 width=128) -> Hash (cost=22.65..22.65 rows=200 width=32) -> HashAggregate (cost=17.65..20.65 rows=200 width=64) Filter: (avg(scores_1.score) < 65::numeric) -> Seq Scan on scores scores_1 (cost=0.00..15.10 rows=510 width=64) V. Vychodil (KMI/DATA1, Přednáška 7) Agregace, sumarizace, vnořené dotazy Databázové systémy 24 / 32

Příklad (SQL: Srovnání efektivity) /* scalar correlated variant of the previous query */ EXPLAIN SELECT * FROM scores AS foo WHERE (SELECT avg (score) FROM scores WHERE course = foo.course) < 65; použitý plán: Seq Scan on scores foo (cost=0.00..8377.83 rows=170 width=128) Filter: ((SubPlan 1) < 65::numeric) SubPlan 1 -> Aggregate (cost=16.39..16.40 rows=1 width=32) -> Seq Scan on scores (cost=0.00..16.38 rows=3 width=32) Filter: ((course)::text = (foo.course)::text) V. Vychodil (KMI/DATA1, Přednáška 7) Agregace, sumarizace, vnořené dotazy Databázové systémy 25 / 32

Postranní vnořené dotazy v SQL motto: Following on from the previous point, it s not clear why lateral subqueries are required in any case. C. J. Date Definice (postranní vnořený dotaz, angl.: lateral query) Vnořený dotaz vyskytující se v části FROM vnějšího dotazu se nazývá postranní, pokud je uvozen klíčovým slovem LATERAL a je povoleno, aby obsahoval odkazy na sloupce definované tabulkami nebo vnořenými dotazy, které se vyskytují na levo od něj v části FROM. sémantika: pro každou n-tici, na jejíž atributy se odkazuje daný postranní dotaz, je daný postranní dotaz vyhodnocen a výsledné n-tice se spojí V. Vychodil (KMI/DATA1, Přednáška 7) Agregace, sumarizace, vnořené dotazy Databázové systémy 26 / 32

Příklad (SQL: Postranní vnořené dotazy) /* scores with additional column of course average scores */ SELECT * FROM scores AS foo, LATERAL (SELECT avg (score) AS avg_score FROM scores WHERE course = foo.course) AS bar; /* equivalently (and more efficiently) without LATERAL */ SELECT * FROM scores NATURAL JOIN (SELECT course, avg (score) AS avg_score FROM scores GROUP BY course) AS bar; poznámka: v prvním případě by vynechání LATERAL způsobilo chybu V. Vychodil (KMI/DATA1, Přednáška 7) Agregace, sumarizace, vnořené dotazy Databázové systémy 27 / 32

Souhrn vybraných vnořených dotazů v SQL vnořený dotaz ( dotaz musí vracet relaci s jedním atributem): SELECT * FROM jméno WHERE atribut IN ( dotaz ) vnořený dotaz ( dotaz musí vracet singleton): SELECT * FROM jméno WHERE atribut = ( dotaz ) SELECT * FROM jméno WHERE atribut <= ( dotaz ) existenční a univerzální kvantifikace podmínky: SELECT * FROM jméno WHERE atribut <= SOME ( dotaz ) SELECT * FROM jméno WHERE atribut <= ALL ( dotaz ) vnořený dotaz na úrovni atributu: SELECT *, ( dotaz ) AS nový-atribut FROM jméno vnořený dotaz na úrovni jména tabulky: SELECT * FROM ( dotaz ) AS jméno-vnořeného-dotazu V. Vychodil (KMI/DATA1, Přednáška 7) Agregace, sumarizace, vnořené dotazy Databázové systémy 28 / 32

Příklad (Tutorial D: Analogie vnořených dotazů ze SQL) /* analogy of generally quantified SQL statement */ foo WHERE IS_EMPTY (bar RENAME {x AS nx} WHERE NOT (x > nx)) /* analogy of existentially quantified SQL statement */ foo WHERE NOT IS_EMPTY (bar RENAME {x AS nx} WHERE (x > nx)) /* analogy of IN-clause in SQL statement */ foo WHERE NOT IS_EMPTY (bar RENAME {x AS nx} WHERE (x = nx)) /* analogy of the nested restrict-before-join query in SQL */ (bar WHERE x > 30) JOIN baz /* analogy of nested query in place of an attribute */ EXTEND foo: { /* add new attribute of relational type */ y := bar RENAME {x AS nx} WHERE (x = nx) } V. Vychodil (KMI/DATA1, Přednáška 7) Agregace, sumarizace, vnořené dotazy Databázové systémy 29 / 32

Nerelační modifikace výpisu dotazu: Třídění nerelační operace třídění: výsledek reprezentuje pořád stejnou relaci stojí mimo RM (přidáním do modelu bychom neudrželi 1NF) pořadí n-tic je pouze věcí výpisu, tj. externí prezentace relace Tutorial D: relační-výraz ORDER (DESC atribut 1, ASC atribut 2,...) SQL: SELECT * FROM jméno ORDER BY výraz 1 DESC, výraz 1 ASC,... poznámky: implicitní je ASC (vzestupně), volitelné DESC (sestupně) V. Vychodil (KMI/DATA1, Přednáška 7) Agregace, sumarizace, vnořené dotazy Databázové systémy 30 / 32

Nerelační modifikace výpisu dotazu: Ořezání výsledků nerelační operace třídění: výsledek reprezentuje pořád stejnou relaci stojí mimo RM (přidáním do modelu bychom neudrželi 1NF) pořadí n-tic je pouze věcí výpisu, tj. externí prezentace relace další klauzule v SQL: LIMIT, OFFSET (viz cvičení) V. Vychodil (KMI/DATA1, Přednáška 7) Agregace, sumarizace, vnořené dotazy Databázové systémy 31 / 32

Přednáška 7: Závěr pojmy k zapamatování: agregační funkce, agregace hodnot v relacích sumarizační funkce, sumarizace vnořené dotazy, typy vnořených dotazů, korelované dotazy nerelační modifikace dotazu použité zdroje: Date C. J.: Database in Depth: Relational Theory for Practitioners O Reilly Media 2005, ISBN 978 0596100124 Date C. J., Darwen H.: Databases, Types and the Relational Model Addison Wesley 2006, ISBN 978 0321399427 Date C. J.: SQL and Relational Theory: How to Write Accurate SQL Code O Reilly Media 2011, ISBN 978 1449316402 V. Vychodil (KMI/DATA1, Přednáška 7) Agregace, sumarizace, vnořené dotazy Databázové systémy 32 / 32