databázy (1) - predná ka 03 - db.dai.fmph.uniba.sk · join operátory motivácia motivácia...

111
Databázy (1) Prednáška 03 Alexander Šimko [email protected]

Upload: others

Post on 27-Jan-2020

7 views

Category:

Documents


0 download

TRANSCRIPT

Databázy (1)Prednáška 03

Alexander Š[email protected]

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

Section 1

JOIN operátory

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

Alias tabuľky

názov_tabuľky AS alias_tabuľky

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

Section 2

JOINy a WHERE podmienka

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?

Section 3

Ako sa rozhodnúť medzi INNER a OUTER JOINom?

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

Section 4

Vnáranie JOINov

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

JOIN môžeme uvavrieť do zátvoriek

(výraz_1 JOIN výraz_2 ON podmienka)

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

Section 5

JOINy v príkazoch UPDATE, DELETE a INSERT

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

JOINy v príkazoch UPDATE, DELETE a INSERT INSERT

Koniec

Koniec