databázy (1) - predná ka 03 - db.dai.fmph.uniba.sk · join operátory motivácia motivácia...
TRANSCRIPT
Contents I
JOIN operátory
JOINy a WHERE podmienka
Ako sa rozhodnúť medzi INNER a OUTER JOINom?
Vnáranie JOINov
JOINy v príkazoch UPDATE, DELETE a INSERT
JOIN operátory Motivácia
Motivácia
filmsid name year price1 Léon: The Professional 1994 102 Django Unchained 2012 10
ratingsuser_id film_id rating
1 1 102 1 82 2 9
Chceme získať hodnotenia filmov, ale namiesto idčka filmu chceme získaťnázov filmu.
JOIN operátory Motivácia
JOIN operátory
I CROSS JOINI INNER JOINI LEFT OUTER JOINI RIGHT OUTER JOINI FULL OUTER JOIN
kombinujú dve tabuľky do jednej, ktorú môžeme použiť v časti FROMpríkazu SELECT
JOIN operátory CROSS JOIN
CROSS JOIN – Syntax
názov_tabuľky_1 CROSS JOIN názov_tabuľky_2
1. Vytvor kartézsky súčin tabuliek (dvojice riadkov)I každý riadok prvej tabuľky spoj s každým riadkom druhej tabuľky
JOIN operátory CROSS JOIN
CROSS JOIN – Príklad
countriesid name1 Slovakia4 Czech Republic
genresid name1 sci-fi2 drama
SELECT *FROM countries CROSS JOIN genres
JOIN operátory CROSS JOIN
CROSS JOIN – Príklad
countriesid name1 Slovakia4 Czech Republic
genresid name1 sci-fi2 drama
SELECT *FROM countries CROSS JOIN genres
id name id name1 Slovakia 1 sci-fi1 Slovakia 2 drama4 Czech Republic 1 sci-fi4 Czech Republic 2 drama
JOIN operátory CROSS JOIN
CROSS JOIN – Poznámka
I samostatne veľký zmysel nemáI niekedy sa hodí ako súčasť zložitejších príkazov
JOIN operátory INNER JOIN
INNER JOIN
názov_tabuĺky_1 INNER JOIN názov_tabuľky_2ON podmienka
1. vytvor kartézsky súčin tabuliek (dvojice riadkov)I každý riadok z prvej tabuľky spoj s každým riadkom druhej tabuľky
2. vyber dvojice, pre ktoré je splnená podmienka (vyhodnotí sa na TRUE)
JOIN operátory INNER JOIN
INNER JOIN – Motivačný príklad
ratingsuser_id film_id rating
1 1 102 1 82 2 9
filmsid name year price1 Léon 1994 102 Django 2012 10
SELECT name, ratingFROM ratings INNER JOIN filmsON film_id = id
JOIN operátory INNER JOIN
INNER JOIN – Motivačný príklad
ratingsuser_id film_id rating
1 1 102 1 82 2 9
filmsid name year price1 Léon 1994 102 Django 2012 10
SELECT name, ratingFROM ratings INNER JOIN filmsON film_id = id
user_id film_id rating id name year price1 1 10 1 Léon 1994 101 1 10 2 Django 2012 102 1 8 1 Léon 1994 102 1 8 2 Django 2012 102 2 9 1 Léon 1994 102 2 9 2 Django 2012 10
JOIN operátory INNER JOIN
INNER JOIN – Motivačný príklad
ratingsuser_id film_id rating
1 1 102 1 82 2 9
filmsid name year price1 Léon 1994 102 Django 2012 10
SELECT name, ratingFROM ratings INNER JOIN filmsON film_id = id
user_id film_id rating id name year price1 1 10 1 Léon 1994 101 1 10 2 Django 2012 102 1 8 1 Léon 1994 102 1 8 2 Django 2012 102 2 9 1 Léon 1994 102 2 9 2 Django 2012 10
JOIN operátory INNER JOIN
INNER JOIN – Motivačný príklad
ratingsuser_id film_id rating
1 1 102 1 82 2 9
filmsid name year price1 Léon 1994 102 Django 2012 10
SELECT name, ratingFROM ratings INNER JOIN filmsON film_id = id
user_id film_id rating id name year price1 1 10 1 Léon 1994 102 1 8 1 Léon 1994 102 2 9 2 Django 2012 10
JOIN operátory INNER JOIN
INNER JOIN – Motivačný príklad
ratingsuser_id film_id rating
1 1 102 1 82 2 9
filmsid name year price1 Léon 1994 102 Django 2012 10
SELECT name, ratingFROM ratings INNER JOIN filmsON film_id = id
name ratingLéon 10Léon 8Django 9
JOIN operátory INNER JOIN
INNER JOIN – Na poradí tabuliek takmer nezáleží
Rovnaké výsledky až na poradie stĺpcov
SELECT *FROM ratings INNER JOIN filmsON film_id = id
user_id film_id rating id name year price
SELECT *FROM films INNER JOIN ratingsON film_id = id
id name year price user_id film_id rating
JOIN operátory INNER JOIN
INNER JOIN – ’INNER’ je nepovinné
názov_tabuľky_1 INNER JOIN názov_tabuľky_2ON podmienka
je to isté ako
názov_tabuľky_1 JOIN názov_tabuľky_2ON podmienka
JOIN operátory Rovnomenné stĺpce
Rovnomenné stĺpce
countriesid name1 Slovakia4 Czech Republic
usersid name email country_id1 fan123 [email protected] 12 johnny [email protected] 4
SELECT *FROM countries INNER JOIN usersON id = country_id
ERROR: column reference "id" is ambiguous
JOIN operátory Rovnomenné stĺpce
Rozlišovanie stĺpcov – Syntax
Pred názov stĺpca treba predradiť názov tabuľky:
názov_tabuľky.názov_stĺpca
JOIN operátory Rovnomenné stĺpce
Rozlišovanie stĺpcov – Príklad
countriesid name1 Slovakia4 Czech Republic
usersid name email country_id1 fan123 [email protected] 12 johnny [email protected] 4
SELECT *FROM countries INNER JOIN usersON countries.id = country_id
id name id name email country_id1 Slovakia 1 fan123 [email protected] 14 Czech Republic 2 johnny [email protected] 4
JOIN operátory Rovnomenné stĺpce
Všetky stĺpce konkrétnej tabuľky
I * vyberá všetky stĺpce všetkých tabuliek, ktoré sa spájaliI názov_tabuľky.* vyberie všetky stĺpce konkrétnej tabuľky
JOIN operátory Rovnomenné stĺpce
Všetky stĺpce konkrétnej tabuľky – Príklad
SELECT countries.*, user.nameFROM countries INNER JOIN usersON countries.id = country_id
id name name1 Slovakia fan1234 Czech Republic johnny
JOIN operátory OUTER JOIN
OUTER JOIN – motivácia
Pre každú krajinu chceme získať zoznam ľudí z danej krajiny. Nechceme,aby nám žiadna krajina vypadla.
countriesid name1 Slovakia4 Czech Republic5 Poland
usersid name email country_id1 fan123 [email protected] 12 johnny [email protected] 43 stellar [email protected] 1
SELECT country.name, user.nameFROM countries INNER JOIN usersON countries.id = country_id
JOIN operátory OUTER JOIN
OUTER JOIN – motivácia
Krajina s idčkom 5 vypadne, lebo countriy_id = 5 sa nevyhodnotí na TRUEpre žiadnu dvojicu.
id name id name email country_id1 Slovakia 1 fan123 [email protected] 11 Slovakia 3 stellar [email protected] 14 Czech Republic 2 johnny [email protected] 4
Čo ak by sme chceli krajinu 5 nechať a na miesto používateľa dať NULL?
JOIN operátory LEFT OUTER JOIN
LEFT OUTER JOIN
názov_tabuľky_1 LEFT OUTER JOIN názov_tabuľky_2ON podmienka
Pre každý riadok tabuľky_11. pripoj každý riadok z tabuľky_2 taký, že je podmienka splnená,2. ak v tabuľke_2 existuje viac takých riadkov, riadok tabuľky_1 bude
duplikovaný3. ak žiaden taký riadok neexistuje, stĺpce z tabuľky_2 vyplň NULLmi
Vo výsledku sú všetky riadky tabuľky_1.
JOIN operátory LEFT OUTER JOIN
LEFT OUTER JOIN – Príklad
countriesid name1 Slovakia4 Czech Republic5 Poland
usersid name email country_id1 fan123 [email protected] 12 johnny [email protected] 43 stellar [email protected] 1
SELECT country.name, user.nameFROM countries LEFT OUTER JOIN usersON countries.id = country_id
JOIN operátory LEFT OUTER JOIN
LEFT OUTER JOIN – Príklad
countriesid name1 Slovakia4 Czech Republic5 Poland
usersid name email country_id1 fan123 [email protected] 12 johnny [email protected] 43 stellar [email protected] 1
SELECT country.name, user.nameFROM countries LEFT OUTER JOIN usersON countries.id = country_id
id name id name email country_id
JOIN operátory LEFT OUTER JOIN
LEFT OUTER JOIN – Príklad
countriesid name1 Slovakia4 Czech Republic5 Poland
usersid name email country_id1 fan123 [email protected] 12 johnny [email protected] 43 stellar [email protected] 1
SELECT country.name, user.nameFROM countries LEFT OUTER JOIN usersON countries.id = country_id
id name id name email country_id
JOIN operátory LEFT OUTER JOIN
LEFT OUTER JOIN – Príklad
countriesid name1 Slovakia4 Czech Republic5 Poland
usersid name email country_id1 fan123 [email protected] 12 johnny [email protected] 43 stellar [email protected] 1
SELECT country.name, user.nameFROM countries LEFT OUTER JOIN usersON countries.id = country_id
id name id name email country_id
JOIN operátory LEFT OUTER JOIN
LEFT OUTER JOIN – Príklad
countriesid name1 Slovakia4 Czech Republic5 Poland
usersid name email country_id1 fan123 [email protected] 12 johnny [email protected] 43 stellar [email protected] 1
SELECT country.name, user.nameFROM countries LEFT OUTER JOIN usersON countries.id = country_id
id name id name email country_id1 Slovakia 1 fan123 [email protected] 11 Slovakia 3 stellar [email protected] 1
JOIN operátory LEFT OUTER JOIN
LEFT OUTER JOIN – Príklad
countriesid name1 Slovakia4 Czech Republic5 Poland
usersid name email country_id1 fan123 [email protected] 12 johnny [email protected] 43 stellar [email protected] 1
SELECT country.name, user.nameFROM countries LEFT OUTER JOIN usersON countries.id = country_id
id name id name email country_id1 Slovakia 1 fan123 [email protected] 11 Slovakia 3 stellar [email protected] 1
JOIN operátory LEFT OUTER JOIN
LEFT OUTER JOIN – Príklad
countriesid name1 Slovakia4 Czech Republic5 Poland
usersid name email country_id1 fan123 [email protected] 12 johnny [email protected] 43 stellar [email protected] 1
SELECT country.name, user.nameFROM countries LEFT OUTER JOIN usersON countries.id = country_id
id name id name email country_id1 Slovakia 1 fan123 [email protected] 11 Slovakia 3 stellar [email protected] 1
JOIN operátory LEFT OUTER JOIN
LEFT OUTER JOIN – Príklad
countriesid name1 Slovakia4 Czech Republic5 Poland
usersid name email country_id1 fan123 [email protected] 12 johnny [email protected] 43 stellar [email protected] 1
SELECT country.name, user.nameFROM countries LEFT OUTER JOIN usersON countries.id = country_id
id name id name email country_id1 Slovakia 1 fan123 [email protected] 11 Slovakia 3 stellar [email protected] 14 Czech Republic 2 johnny [email protected] 4
JOIN operátory LEFT OUTER JOIN
LEFT OUTER JOIN – Príklad
countriesid name1 Slovakia4 Czech Republic5 Poland
usersid name email country_id1 fan123 [email protected] 12 johnny [email protected] 43 stellar [email protected] 1
SELECT country.name, user.nameFROM countries LEFT OUTER JOIN usersON countries.id = country_id
id name id name email country_id1 Slovakia 1 fan123 [email protected] 11 Slovakia 3 stellar [email protected] 14 Czech Republic 2 johnny [email protected] 4
JOIN operátory LEFT OUTER JOIN
LEFT OUTER JOIN – Príklad
countriesid name1 Slovakia4 Czech Republic5 Poland
usersid name email country_id1 fan123 [email protected] 12 johnny [email protected] 43 stellar [email protected] 1
SELECT country.name, user.nameFROM countries LEFT OUTER JOIN usersON countries.id = country_id
id name id name email country_id1 Slovakia 1 fan123 [email protected] 11 Slovakia 3 stellar [email protected] 14 Czech Republic 2 johnny [email protected] 4
JOIN operátory LEFT OUTER JOIN
LEFT OUTER JOIN – Príklad
countriesid name1 Slovakia4 Czech Republic5 Poland
usersid name email country_id1 fan123 [email protected] 12 johnny [email protected] 43 stellar [email protected] 1
SELECT country.name, user.nameFROM countries LEFT OUTER JOIN usersON countries.id = country_id
id name id name email country_id1 Slovakia 1 fan123 [email protected] 11 Slovakia 3 stellar [email protected] 14 Czech Republic 2 johnny [email protected] 45 Poland NULL NULL NULL NULL
JOIN operátory LEFT OUTER JOIN
LEFT OUTER JOIN – Príklad
countriesid name1 Slovakia4 Czech Republic5 Poland
usersid name email country_id1 fan123 [email protected] 12 johnny [email protected] 43 stellar [email protected] 1
SELECT country.name, user.nameFROM countries LEFT OUTER JOIN usersON countries.id = country_id
id name id name email country_id1 Slovakia 1 fan123 [email protected] 11 Slovakia 3 stellar [email protected] 14 Czech Republic 2 johnny [email protected] 45 Poland NULL NULL NULL NULL
JOIN operátory LEFT OUTER JOIN
LEFT OUTER JOIN – Príklad
countriesid name1 Slovakia4 Czech Republic5 Poland
usersid name email country_id1 fan123 [email protected] 12 johnny [email protected] 43 stellar [email protected] 1
SELECT country.name, user.nameFROM countries LEFT OUTER JOIN usersON countries.id = country_id
name nameSlovakia fan123Slovakia stellar
Czech Republic johnnyPoland NULL
JOIN operátory LEFT OUTER JOIN
LEFT OUTER JOIN – ’OUTER’ je nepovinné
názov_tabuĺky_1 LEFT OUTER JOIN názov_tabuľky_2ON podmienka
je to isté ako
názov_tabuĺky_1 LEFT JOIN názov_tabuľky_2ON podmienka
JOIN operátory RIGHT OUTER JOIN
RIGHT OUTER JOIN
To isté ako LEFT OUTER JOIN až na poradie tabuliek a stĺpcov
názov_tabuĺky_1 RIGHT OUTER JOIN názov_tabuľky_2ON podmienka
Pre každý riadok tabuľky_21. pripoj každý riadok z tabuľky_1 taký, že je podmienka splnená,2. ak v tabuľke_1 existuje viac takých riadkov, riadok tabuľky_2 bude
duplikovaný3. ak žiaden taký riadok neexistuje, stĺpce z tabuľky_1 vyplň NULLmi
Vo výsledku sú všetky riadky tabuľky_2
JOIN operátory RIGHT OUTER JOIN
RIGHT OUTER JOIN – Príklad
usersid name email country_id1 fan123 [email protected] 12 johnny [email protected] 43 stellar [email protected] 1
countriesid name1 Slovakia4 Czech Republic5 Poland
SELECT countries.name, users.nameFROM users RIGHT OUTER JOIN countriesON country_id = countries.id
JOIN operátory RIGHT OUTER JOIN
RIGHT OUTER JOIN – Príklad
usersid name email country_id1 fan123 [email protected] 12 johnny [email protected] 43 stellar my@email. com 1
countriesid name1 Slovakia4 Czech Republic5 Poland
SELECT countries.name, users.nameFROM users RIGHT OUTER JOIN countriesON country_id = countries.id
id name email country_id id name1 fan123 fan123@... 1 1 Slovakia3 stellar [email protected] 1 1 Slovakia2 johnny spam@... 4 4 Czech Republic
NULL NULL NULL NULL 5 Poland
JOIN operátory RIGHT OUTER JOIN
RIGHT OUTER JOIN – Príklad
usersid name email country_id1 fan123 [email protected] 12 johnny [email protected] 43 stellar [email protected] 1
countriesid name1 Slovakia4 Czech Republic5 Poland
SELECT countries.name, users.nameFROM users RIGHT OUTER JOIN countriesON country_id = countries.id
name nameSlovakia fan123Slovakia stellar
Czech Republic johnnyPoland NULL
JOIN operátory RIGHT OUTER JOIN
RIGHT OUTER JOIN – ’OUTER’ je nepovinné
názov_tabuĺky_1 RIGHT OUTER JOIN názov_tabuľky_2ON podmienka
je to isté ako
názov_tabuĺky_1 RIGHT JOIN názov_tabuľky_2ON podmienka
JOIN operátory FULL OUTER JOIN
FULL OUTER JOIN
Kombinácia LEFT a RIGHT OUTER JOINov
názov_tabuĺky_1 FULL OUTER JOIN názov_tabuľky_2ON podmienka
1. riadky z tabuľky_1 spojí s riadkami z tabuľky_2 tak, že je splnenápodmienka,
2. ak pre riadok z jednej tabuľky žiaden riadok z druhej tabuľky nespĺňapodmienku, chýbajúce stĺpce vyplní NULLmi
Vo výsledku sú všetky riadky oboch tabuliek.
JOIN operátory FULL OUTER JOIN
FULL OUTER JOIN – Príklad
Zoznam používateľov s názvami krajím:I ponechať používateľov s nezadanou krajinou,I pridať prázdne krajiny
usersid name email country_id1 fan123 [email protected] 12 johnny [email protected] 43 stellar [email protected] NULL
countriesid name1 Slovakia4 Czech Republic5 Poland
JOIN operátory FULL OUTER JOIN
FULL OUTER JOIN – Príklad
usersid name email country_id1 fan123 [email protected] 12 johnny [email protected] 43 stellar [email protected] NULL
countriesid name1 Slovakia4 Czech Republic5 Poland
SELECT *FROM users FULL OUTER JOIN countriesON country_id = countries.id
id name email country_id id name1 fan123 fan123@... 1 1 Slovakia2 johnny spam@... 4 4 Czech Republic3 stellar my@... NULL NULL NULL
NULL NULL NULL NULL 5 Poland
JOIN operátory FULL OUTER JOIN
FULL OUTER JOIN – ’OUTER’ je nepovinné
názov_tabuĺky_1 FULL OUTER JOIN názov_tabuľky_2ON podmienka
je to isté ako
názov_tabuĺky_1 FULL JOIN názov_tabuľky_2ON podmienka
JOIN operátory Alias tabuľky
JOINovanie tabuľky so samou sebou
Chceme dvojice všetkých filmov. Používateľ bude postupne vyberať ktorýfilm z dvojice je podľa neho lepší:
SELECT *FROM filmsCROSS JOIN films
ERROR: table name "films" specified more than once
JOIN operátory Alias tabuľky
JOINovanie tabuľky so samou sebou – Pokračovanie
SELECT *FROM films AS films1CROSS JOIN films AS films2
JOIN operátory Alias tabuľky
JOINovanie tabuľky so samou sebou – Pokračovanie
SELECT *FROM films AS films1CROSS JOIN films AS films2
Takto dostaneme:I dvojice v tvare film1, film1I okrem dvojice film1, film2 aj dvojicu film2, film1
JOIN operátory Alias tabuľky
JOINovanie tabuľky so samou sebou – Pokračovanie
SELECT *FROM films AS films1CROSS JOIN films AS films2WHERE films1.id < films2.id
JOIN operátory Rekapitulácia
Rekapitulácia
CROSS JOIN kartézsky súčinINNER JOIN CROSS JOIN + vyhodíme niektoré dvojice
LEFT OUTER JOIN INNER + nenajoinované z prvej doplnené o NULLRIGHT OUTER JOIN ako LEFT ale vymenené poradie tabuliekFULL OUTER JOIN kombinácia LEFT a RIGHT OUTER JOIN
JOINy a WHERE podmienka
JOINy a WHERE – Kam s podmienkou?
1. vykonaj JOIN → máme jednu veľkú tabuľku2. z tejto veľkej tabuľky vyber riadky, ktoré spĺňajú where_podmienku3. ...
JOINy a WHERE podmienka CROSS JOIN a WHERE
CROSS JOIN + WHERE = INNER JOIN
SELECT zoznam_výrazovFROM názov_tabuľky_1 CROSS JOIN názov_tabuľky_2WHERE podmienka
je to to isté ako
SELECT zoznam_výrazovFROM názov_tabuľky_1 INNER JOIN názov_tabuľky_2ON podmienka
JOINy a WHERE podmienka INNER JOIN a WHERE
INNER JOIN + WHERE
SELECT zoznam_výrazovFROM názov_tabuľky_1 INNER JOIN názov_tabuľky_2 ON podmienkaWHERE where_podmienka...
JOINy a WHERE podmienka INNER JOIN a WHERE
INNER JOIN podmienka vs WHERE podmienka
SELECT zoznam_výrazovFROM názov_tabuľky_1INNER JOIN názov_tabuľky_2 ON podmienka
1. kartézsky súčin tabuliek2. vyberie riadky spĺňajúce podmienku
SELECT zoznam_výrazovFROM názov_tabuľky_1INNER JOIN názov_tabuľky_2 ON trueWHERE podmienka
1. kartézsky súčin tabuliek2. vyberie všetky riadky (lebo ’true’ je pravdivé pre každý riadok)3. z nich vyberie riadky spĺňajúce podmienku
JOINy a WHERE podmienka OUTER JOIN a WHERE
OUTER JOIN + WHERE
SELECT zoznam_výrazovFROM názov_tabuľky_1 OUTER LRF JOIN názov_tabuľky_2ON podmienkaWHERE where_podmienka...
JOINy a WHERE podmienka OUTER JOIN a WHERE
OUTER JOIN podmienka vs WHERE podmienka
SELECT zoznam_výrazovFROM názov_tabuľky_1LEFT OUTER JOIN názov_tabuľky_2 ON podmienka
Uvažujme, že podmienka = false.1. keďže podmienka je false, žiadne dva riadky sa nespoja,2. vráti každý riadok tabuľky_1 raz,3. v stĺpcoch tabuľky_2 budú NULLy.
SELECT zoznam_výrazovFROM názov_tabuľky_1LEFT OUTER JOIN názov_tabuľky_2 ON trueWHERE podmienka
1. keďže JOIN podmienka je true, vytvorí kartézsky súčin tabuliek,2. kedže podmienka je false, do výsledku nevyberie žiaden riadok.
Ako sa rozhodnúť medzi INNER a OUTER JOINom?
Otázka č. 1
Majú byť vo výsledku všetky riadky jednej tabuľky aj keď pre ne neexistujeriadok druhej tabuľky spĺňajúci podmienku?
I ak ÁNO, potom OUTER JOIN,I ak NIE, potom INNER JOIN,
Príklady sme už videli
Ako sa rozhodnúť medzi INNER a OUTER JOINom?
Otázka č. 2
Porovnávame vo WHERE časti stĺpec pripájanej tabuľky s neNULLovouhodnotou?
I ak ÁNO, potom INNER aj OUTER JOIN dajú ten istý výsledok
Ak by aj OUTER JOIN k nejakému riadku pripojil samé NULLy, tentoriadok potom vypadne kvôli WHERE podmienke.
Ako sa rozhodnúť medzi INNER a OUTER JOINom?
Otázka č. 2 – Príklad
usersid name email country_id1 fan123 [email protected] 12 johnny [email protected] 43 stellar [email protected] NULL
countriesid name1 Slovakia4 Czech Republic
SELECT *FROM users INNER JOIN countriesON country_id = countries.idWHERE countries.name = ’Slovakia’
Ako sa rozhodnúť medzi INNER a OUTER JOINom?
Otázka č. 2 – Príklad
SELECT *FROM users INNER JOIN countriesON country_id = countries.idWHERE countries.name = ’Slovakia’
id name email country_id id name1 fan123 fan123@... 1 1 Slovakia2 johnny spam@... 4 4 Czech Republic
Ako sa rozhodnúť medzi INNER a OUTER JOINom?
Otázka č. 2 – Príklad
SELECT *FROM users INNER JOIN countriesON country_id = countries.idWHERE countries.name = ’Slovakia’
id name email country_id id name1 fan123 fan123@... 1 1 Slovakia2 johnny spam@... 4 4 Czech Republic
Ako sa rozhodnúť medzi INNER a OUTER JOINom?
Otázka č. 2 – Príklad
SELECT *FROM users INNER JOIN countriesON country_id = countries.idWHERE countries.name = ’Slovakia’
id name email country_id id name1 fan123 fan123@... 1 1 Slovakia
Ako sa rozhodnúť medzi INNER a OUTER JOINom?
Otázka č. 2 – Príklad
SELECT *FROM users LEFT OUTER JOIN countriesON country_id = countries.idWHERE countries.name = ’Slovakia’
id name email country_id id name1 fan123 fan123@... 1 1 Slovakia2 johnny spam@... 4 4 Czech Republic3 stellar my@... NULL NULL NULL
Ako sa rozhodnúť medzi INNER a OUTER JOINom?
Otázka č. 2 – Príklad
SELECT *FROM users LEFT OUTER JOIN countriesON country_id = countries.idWHERE countries.name = ’Slovakia’
id name email country_id id name1 fan123 fan123@... 1 1 Slovakia2 johnny spam@... 4 4 Czech Republic3 stellar my@... NULL NULL NULL
Ako sa rozhodnúť medzi INNER a OUTER JOINom?
Otázka č. 2 – Príklad
SELECT *FROM users LEFT OUTER JOIN countriesON country_id = countries.idWHERE countries.name = ’Slovakia’
id name email country_id id name1 fan123 fan123@... 1 1 Slovakia
Vnáranie JOINov
Vnáranie JOINov
Argumentom JOINu môže byť iný JOIN:
výraz_1 JOIN výraz_2 ON podmienka
I najprv sa vyhodnotia obe strany, čím zniknú dve tabuľkyI potom sa aplikuje JOIN a vznikne jedna tabuľka
Vnáranie JOINov
Vnáranie JOINov – Príklad
filmsid name year price1 Léon: The Professional 1994 102 Django Unchained 2012 10
usersid name email country_id1 fan123 [email protected] 12 johnny [email protected] 43 stellar [email protected] NULL
countriesid name1 Slovakia4 Czech Republic
ratingsuser_id film_id rating
1 1 103 2 9
Vnáranie JOINov
Vnáranie JOINov – Príklad
Chceme hodnotenia filmov. Chceme mať meno človeka a názov krajiny,pričom film nás nezaujíma.
SELECT users.name, countries.name, ratingFROM(ratings INNER JOIN users ON ratings.user_id = users.id)LEFT OUTER JOIN countriesON users.country_id = countries.id
Vnáranie JOINov
Vnáranie JOINov – Príklad
SELECT users.name, countries.name, ratingFROM(ratings INNER JOIN users ON ratings.user_id = users.id)LEFT OUTER JOIN countriesON users.country_id = countries.id
user_id film_id rating1 1 103 2 9
Vnáranie JOINov
Vnáranie JOINov – Príklad
SELECT users.name, countries.name, ratingFROM(ratings INNER JOIN users ON ratings.user_id = users.id)LEFT OUTER JOIN countriesON users.country_id = countries.id
user_id film_id rating name country_id1 1 10 fan123 13 2 9 stellar NULL
Vnáranie JOINov
Vnáranie JOINov – Príklad
SELECT users.name, countries.name, ratingFROM(ratings INNER JOIN users ON ratings.user_id = users.id)LEFT OUTER JOIN countriesON users.country_id = countries.id
user_id film_id rating name country_id name1 1 10 fan123 1 Slovakia3 2 9 stellar NULL NULL
Vnáranie JOINov
Vnáranie JOINov – Príklad
SELECT users.name, countries.name, ratingFROM(ratings INNER JOIN users ON ratings.user_id = users.id)LEFT OUTER JOIN countriesON users.country_id = countries.id
name name ratingfan123 Slovakia 10stellar NULL 9
Vnáranie JOINov
To isté trocha ináč
SELECT users.name, countries.name, ratingFROM(ratings INNER JOIN users ON ratings.user_id = users.id)LEFT OUTER JOIN countriesON users.country_id = countries.id
SELECT users.name, countries.name, ratingsFROMratings INNER JOIN(users LEFT OUTER JOIN countriesON users.country_id = countries.id)
ON ratings.user_id = users.id
Vnáranie JOINov
Ak nepoužijeme zátvorky
v_0 JOIN v_1 ON p_1 JOIN v_2 ON p_2
je to isté ako
(v_0 JOIN v_1 ON p_1) JOIN v_2 ON p_2
Platí pre všetky JOINy
Vnáranie JOINov
JOINovanie nie je vo všeobecnosti asociatívne
(v_0 JOIN v_1 ON p_1) JOIN v_2 ON p_2
je vo všeobecnosti iné než
v_0 JOIN (v_1 JOIN v_2 ON p_2) ON p_1
Tu JOINom myslím CROSS, INNER, LEFT OUTER, RIGHT OUTER,FULL OUTER JOIN.
Vnáranie JOINov
JOINovanie nie je vo všeobecnosti asociatívne
Chceme zoznam všetkých filmov a k nemu pripojiť hodnotenia. Hodnoteniesa má pripojiť iba ak je od človeka zo Slovenska. Ináč má byť NULL.
Nesprávny pokus:
SELECT films.name, ratingFROM (films LEFT JOIN ratings ON films.id = ratings.film_id)INNER JOIN users ON ratings.user_id = users.id AND
country_id = 1
Správne riešenie:
SELECT films.name, ratingFROM films LEFT JOIN(ratings INNER JOIN users ON ratings.user_id = users.id AND
country_id = 1)ON films.id = ratings.film_id
Vnáranie JOINov
JOINovanie nie je vo všeobecnosti asociatívne
Nesprávny pokus:SELECT films.name, ratingFROM (films LEFT JOIN ratings ON films.id = ratings.film_id)INNER JOIN users ON ratings.user_id = users.id AND
country_id = 1
filmsid name year price1 Léon: The Professional 1994 10
usersid name email country_id2 johnny [email protected] 4
ratingsuser_id film_id rating
2 1 10
Vnáranie JOINov
JOINovanie nie je vo všeobecnosti asociatívne
Nesprávny pokus:
SELECT films.name, ratingFROM (films LEFT JOIN ratings ON films.id = ratings.film_id)INNER JOIN users ON ratings.user_id = users.id AND
country_id = 1
id name user_id film_id rating1 Léon: The Professional 2 1 10
Vnáranie JOINov
JOINovanie nie je vo všeobecnosti asociatívne
Nesprávny pokus:
SELECT films.name, ratingFROM (films LEFT JOIN ratings ON films.id = ratings.film_id)INNER JOIN users ON ratings.user_id = users.id AND
country_id = 1
id name user_id film_id rating country_id1 Léon: The Professional 2 1 10 4
Vnáranie JOINov
JOINovanie nie je vo všeobecnosti asociatívne
Nesprávny pokus:
SELECT films.name, ratingFROM (films LEFT JOIN ratings ON films.id = ratings.film_id)INNER JOIN users ON ratings.user_id = users.id AND
country_id = 1
id name user_id film_id rating country_id1 Léon: The Professional 2 1 10 4
Vnáranie JOINov
JOINovanie nie je vo všeobecnosti asociatívne
Nesprávny pokus:
SELECT films.name, ratingFROM (films LEFT JOIN ratings ON films.id = ratings.film_id)INNER JOIN users ON ratings.user_id = users.id AND
country_id = 1
id name user_id film_id rating country_id
Film vypadol, hoci sme ho chceli nechať.
Vnáranie JOINov
JOINovanie nie je vo všeobecnosti asociatívne
Správne riešenie:SELECT films.name, ratingFROM films LEFT JOIN(ratings INNER JOIN users ON ratings.user_id = users.id AND
country_id = 1)ON films.id = ratings.film_id
filmsid name year price1 Léon: The Professional 1994 10
usersid name email country_id2 johnny [email protected] 4
ratingsuser_id film_id rating
2 1 10
Vnáranie JOINov
JOINovanie nie je vo všeobecnosti asociatívne
Správne riešenie:
SELECT films.name, ratingFROM films LEFT JOIN(ratings INNER JOIN users ON ratings.user_id = users.id AND
country_id = 1)ON films.id = ratings.film_id
user_id film_id rating country_id2 1 10 4
Vnáranie JOINov
JOINovanie nie je vo všeobecnosti asociatívne
Správne riešenie:
SELECT films.name, ratingFROM films LEFT JOIN(ratings INNER JOIN users ON ratings.user_id = users.id AND
country_id = 1)ON films.id = ratings.film_id
user_id film_id rating country_id2 1 10 4
Vnáranie JOINov
JOINovanie nie je vo všeobecnosti asociatívne
Správne riešenie:
SELECT films.name, ratingFROM films LEFT JOIN(ratings INNER JOIN users ON ratings.user_id = users.id AND
country_id = 1)ON films.id = ratings.film_id
user_id film_id rating country_id
Vnáranie JOINov
JOINovanie nie je vo všeobecnosti asociatívne
Správne riešenie:
SELECT films.name, ratingFROM films LEFT JOIN(ratings INNER JOIN users ON ratings.user_id = users.id AND
country_id = 1)ON films.id = ratings.film_id
id name user_id film_id rating country_id1 Léon: The Professional NULL NULL NULL NULL
Vnáranie JOINov Viacej výrazov vo FROM
FROM – Viacej výrazov
V časti FROM môžeme uviesť viacej výrazov:
SELECT zoznam_stĺpcovFROM tabuľkový_výraz_1,
tabuľkový_výraz_2,...tabuľkový_výraz_n
je to to isté ako:
SELECT zoznam_stĺpcovFROM tabuľkový_výraz_1CROSS JOIN tabuľkový_výraz_2,CROSS JOIN ...CROSS JOIN tabuľkový_výraz_n
JOINy v príkazoch UPDATE, DELETE a INSERT UPDATE
UPDATE – motivácia
filmsid name year price1 Léon: The Professional 1994 102 Django Unchained 2012 10
ratesyear rate1994 22012 3
Cheme aktualizovať cenu filmov na základe hodnôt, ktoré sú v tabuľkerates.
filmsid name year price1 Léon: The Professional 1994 202 Django Unchained 2012 30
JOINy v príkazoch UPDATE, DELETE a INSERT UPDATE
UPDATE
UPDATE názov_cieľovej_tabuľkySET ...
FROM zoznam_názvov_pomocnych_tabuliek[WHERE podmienka]
I cieľová tabuľka a pomocné tabuľky sa spoja CROSS JOINnomI ponechajú sa riadky spĺňajúce podmienkuI prechádzajú sa riadky výslednej tabuľky – každý zodpovedá nejakému
riadku v cieľovej tabuľke a ten sa aktualizuje
JOINy v príkazoch UPDATE, DELETE a INSERT UPDATE
UPDATE – riešenie
Cheme aktualizovať cenu filmov na základe hodnôt, ktoré sú v tabuľkerates.
filmsid name year price1 Léon: The Professional 1994 102 Django Unchained 2012 10
ratesyear rate1994 22012 3
UPDATE films SET price = films.price * rates.rateFROM ratesWHERE rates.year = films.year
JOINy v príkazoch UPDATE, DELETE a INSERT UPDATE
UPDATE – riešenie
UPDATE films SET price = films.price * rates.rateFROM ratesWHERE rates.year = films.year
filmsid name year price1 Léon: The Professional 1994 102 Django Unchained 2012 10
ratesyear rate1994 22012 3
JOINy v príkazoch UPDATE, DELETE a INSERT UPDATE
UPDATE – riešenie
UPDATE films SET price = films.price * rates.rateFROM ratesWHERE rates.year = films.year
id name year price year rate1 Léon: The Professional 1994 10 1994 21 Léon: The Professional 1994 10 2012 32 Django Unchained 2012 10 1994 22 Django Unchained 2012 10 2012 3
JOINy v príkazoch UPDATE, DELETE a INSERT UPDATE
UPDATE – riešenie
UPDATE films SET price = films.price * rates.rateFROM ratesWHERE rates.year = films.year
id name year price year rate1 Léon: The Professional 1994 10 1994 22 Django Unchained 2012 10 2012 3
JOINy v príkazoch UPDATE, DELETE a INSERT UPDATE
UPDATE – riešenie
UPDATE films SET price = films.price * rates.rateFROM ratesWHERE rates.year = films.year
filmsid name year price1 Léon: The Professional 1994 202 Django Unchained 2012 30
JOINy v príkazoch UPDATE, DELETE a INSERT UPDATE
Čo ak vznikne viac riadkov pre jeden cieľový?
filmsid name year price1 Léon: The Professional 1994 102 Django Unchained 2012 10
ratesyear rate1994 21994 32012 3
UPDATE vezme iba jeden riadok a zvyšné odignoruje.
filmsid name year price1 Léon: The Professional 1994 202 Django Unchained 2012 30
JOINy v príkazoch UPDATE, DELETE a INSERT UPDATE
V zozname tabuliek môžeme používať všetky JOINy
filmsid name year price1 Léon: The Professional 1994 102 Django Unchained 2012 10
ratesyear rate1994 22012 3
correctionsyear correction1994 0.92012 1.2
UPDATE filmsSET price = films.price * rates.rate * corrections.correctionFROM rates JOIN corrections ON rates.year = corrections.yearWHERE rates.year = films.year
JOINy v príkazoch UPDATE, DELETE a INSERT DELETE
DELETE
Podobne pre DELETE:
DELETE FROM názov_cieľovej_tabuľkyUSING zoznam_pomocných_tabuliek[WHERE podmienka]
I cieľová tabuľka a pomocné tabuľky sa spoja CROSS JOINnomI ponechajú sa riadky spĺňajúce podmienkuI prechádzajú sa riadky výslednej tabuľky – každý zodpovedá nejakému
riadku v cieľovej tabuľke a ten sa zmaže
JOINy v príkazoch UPDATE, DELETE a INSERT DELETE
DELETE – príklad
Cheme zmazať filmy, ktorých cena by sa aktualizovaním zväčšila viac neždvakrát.
filmsid name year price1 Léon: The Professional 1994 102 Django Unchained 2012 10
ratesyear rate1994 22012 3
DELETE FROM films USING ratesWHERE rates.year = films.year AND rates.rate > 2
filmsid name year price1 Léon: The Professional 1994 10
JOINy v príkazoch UPDATE, DELETE a INSERT DELETE
V zozname tabuliek môžeme používať všetky JOINy
V zozname tabuliek môžeme používať všetky JOINy
JOINy v príkazoch UPDATE, DELETE a INSERT INSERT
INSERT
INSERT INTO názov_tabuľky(názov_stĺpca_1, ..., názov_stĺpca_n)dopyt
I namiesto VALUES môžeme uviesť dopyt (SELECT)I do zadanej tabuľky sa vložia dáta z dopytuI i-ty stĺpec zo SELECTu sa vloží do i-teho stĺpca zo zoznamu
JOINy v príkazoch UPDATE, DELETE a INSERT INSERT
INSERT – Príklad
Koeficient už nebude podľa roku ale bude samostante pre každý film.Nebudeme ich ale ukladať v tabuľke films ale film_rates.
INSERT INTO film_rates(film_id, rate)SELECT films.id, rates.rateFROM films JOIN rates ON films.year = rates.year