Datové a procesní modely Relační databáze Přednáška 5 Marian Kamenický Syntea software group a.s.
[email protected] MFFUK Praha 2012/13
1
Poddotazy Zeme
OsoReg
Jm
Poh
St
Zkr
Nazev
Pepa
m
CZ
BE
Franz
m
DE
CZ
Belgie Česko
Jana
z
SK
FR
Piere
m
FR
DE
Francie Německo
SK
Slovensko
...
...
tabulku bychom rádi doplnili o text státu z jiné tabulky Jm
Poh
St
Pepa
m
CZ
Zeme Česko
Franz
m
DE
Německo
Jana
z
SK
Slovensko
Piere
m
FR
Francie
Poddotazy Zeme
Jm
Poh St
Zeme
Pepa
m
CZ Select Nazev From Zeme Where Zkr='CZ' CZ
Franz m Jana Piere
Zkr
Nazev
Česko
BE
Belgie
DE Select Nazev From Zeme Where Zkr='DE' DE
Německo
CZ
Česko
z
SK
Select Nazev From Zeme Where Zkr='SK' SK
Slovensko
FR
Francie
m
FR
Select Nazev From Zeme Where Zkr='FR' FR
Francie
DE
Německo
SK
Slovensko
...
...
Select Select From From Where Where
Nazev Nazev Zeme Zeme Zkr CZ Zkr=='CZ' 'CZ'
Poddotazy Zeme
Jm
Poh St
Zeme
Pepa
m
CZ Select Nazev From Zeme Where Zkr='CZ' CZ
Franz m Jana
z
DE Select Nazev From Zeme Where Zkr='DE' DE SK Select Nazev From Zeme Where Zkr='SK' SK
Piere
m
FR Select Nazev From Zeme Where Zkr='FR' FR
Select Select From From Where Where
Nazev Nazev Zeme Zeme Zkr CZ Zkr=='CZ' 'CZ'
Zkr
Nazev
Česko
BE
Belgie
Německo
CZ
Česko
Slovensko
FR
Francie
Francie
DE
Německo
SK
Slovensko
...
...
Poddotazy Zeme
Jm
Poh St
Zeme
Pepa
m
CZ Select Nazev From Zeme Where Zkr='CZ' CZ
Franz m Jana
z
DE Select Nazev From Zeme Where Zkr='DE' DE SK Select Nazev From Zeme Where Zkr='SK' SK
Piere
m
FR Select Nazev From Zeme Where Zkr='FR' FR
Select Jm Select Jm,, Poh, Poh, St, St, ((Select Select Nazev NazevFrom FromZeme ZemeZZ Where Z.Zkr Where O.St O.St==Z.Zkr) Z.Zkr) Zeme Zeme From From OsoReg OsoRegO; O;
Zkr
Nazev
Česko
BE
Belgie
Německo
CZ
Česko
Slovensko
FR
Francie
Francie
DE
Německo
SK
Slovensko
...
...
Jm
Poh
St
Pepa
m
CZ
Zeme Česko
Franz
m
DE
Německo
Jana
z
SK
Slovensko
Piere
m
FR
Francie
Poddotazy Zeme
Jm
Poh St
Zeme
Pepa
m
CZ Select Nazev From Zeme Where Zkr='CZ' CZ
Franz m Jana
z
DE Select Nazev From Zeme Where Zkr='DE' DE SK Select Nazev From Zeme Where Zkr='SK' SK
Piere
m
FR Select Nazev From Zeme Where Zkr='FR' FR
Select Jm , Poh, Poddotaz
St,
( Select Nazev From Zeme Z Where O.St = Z.Zkr) Z.Zkr Zeme From OsoReg O;
Zkr
Nazev
Česko
BE
Belgie
Německo
CZ
Česko
Slovensko
FR
Francie
Francie
DE
Německo
SK
Slovensko
...
...
Jm
Poh
St
Pepa
m
CZ
Zeme Česko
Franz
m
DE
Německo
Jana
z
SK
Slovensko
Piere
m
FR
Francie
Poddotazy poddotaz
vnořený dotaz, SubSelect
Select v nějaké klauzuli dotazu [povelu Select] Select ...,..., (Select ...) ,
(Select ...)
From
(Select ) as TTT
Where ....
(Select ...)
Group By Having ...
(Select) ...
Order By ...;
derivovan á tabulka derivovaná tabulka
Poddotazy vnořený dotaz, SubSelect
poddotaz
Select v nějaké klauzuli DML povelu
Update Update
Tab Tab
Set Set Sloupec Sloupec== ((Select Select...) ...)... ... Where Where
Delete Delete Where Where
(Select (Select...) ...)
From FromTab Tab
(Select (Select...) ...)
Poddotazy nekorelovaný
poddotaz nezávislý na žádné hodnotě řádku vnější tabulky
vyčíslý se pouze jednou pro celou vnější tabulku
do všech řádek vnější tabulky se dozadí připravená hodnota
Poddotazy NasZam
40 000
nekorelovaný Select SelectJm, Jm,Prof, Prof,Plat, Plat, (Select (SelectMax Max(Plat) (Plat)From FromNasZam) NasZam)MaxPlat MaxPlat From From NasZam NasZam
Jm
Prof
Plat
Bobo
truhlar
20 000
David
truhlar
25 000
Franta
kovar
30 000
Jan
kovar
40 000
Karel
sofer
8 000
40 000
Jm
Prof
Plat
MaxPlat
Bobo
truhlar
20 000
40 000
David
truhlar
25 000
40 000
Franta
kovar
30 000
40 000
Jan
kovar
40 000
40 000
Karel
sofer
8 000
40 000
Poddotazy NasZam
nekorelovaný
Select SelectJm, Jm,Prof, Prof,Plat, Plat, (Select (SelectMax Max(Plat) (Plat)From FromNasZam) NasZam) MaxPlat MaxPlat,, (Select (SelectMax Max(Plat) (Plat)From FromNasZam) NasZam)--Plat Plat as asMene Mene From From NasZam NasZam
Jm
Prof
Plat
MaxPlat
Mene
Bobo
truhlar
20 000 40 000
20 000
David
truhlar
25 000 40 000
15 000
Franta
kovar
30 000 40 000
10 000
Jan
kovar
40 000 40 000
0
Karel
sofer
8 000 40 000
32 000
Jm
Prof
Plat
Bobo
truhlar
20 000
David
truhlar
25 000
Franta
kovar
30 000
Jan
kovar
40 000
Karel
sofer
8 000
40 000
Poddotazy korelovaný
poddotaz závislý na nějaké hodnotě řádku vnější tabulky
provádí se prokaždou řádku vnější tabulky
chceme k zamestnanci zjistit Max(Plat)
avšak v rámci jeho profese
NasZam Jm
Prof
Plat
Bobo
truhlar
20 000
David
truhlar
25 000
Franta
kovar
30 000
Jan
kovar
40 000
Karel
sofer
8 000
Poddotazy NasZam
korelovaný
Jm
Prof
Plat
Bobo
truhlar
20 000
Select SelectJm, Jm,Prof, Prof,Plat, Plat, (Select Max (Select Max(Plat) (Plat)
David
truhlar
25 000
Franta
kovar
30 000
Jan
kovar
40 000
From NasZam From NasZamNZ2 NZ2 Where Where NZ1.Prof=NZ2.Prof NZ1.Prof=NZ2.Prof))MaxPlat MaxPlat From From NasZam NasZamNZ1 NZ1
Karel
sofer
8 000
Jm
Prof
Plat
MaxPlat
Bobo
truhlar
20 000
25 000
David
truhlar
25 000
25 000
Franta
kovar
30 000
40 000
Jan
kovar
40 000
40 000
Karel
sofer
8 000
8 000
Poddotazy - korelované Zeme
Jm
Poh St
Pepa
m
CZ
Franz m Jana Piere
Zeme
Zkr
Nazev
Česko
BE
Belgie
DE
Německo
CZ
Česko
z
SK
Slovensko
FR
Francie
m
FR
Francie
DE
Německo
SK
Slovensko
...
...
Select Jm Select Jm,, Poh, Poh, St, St, ((Select Select Nazev NazevFrom FromZeme ZemeZZ Where Where O.St O.St==Z.Zkr) Z.Zkr) Zeme Zeme From From OsoReg OsoRegO; O;
Jm
Poh
St
Pepa
m
CZ
Zeme Česko
Franz
m
DE
Německo
Jana
z
SK
Slovensko
Piere
m
FR
Francie
Poddotazy - korelované Zeme
Jm
Poh St
Pepa
m
Zeme
Zkr
Nazev
CZ
BE
Belgie
Franz m
DE
CZ
Česko
Jana
z
SK
FR
Francie
Piere
m
FR
DE
Německo
SK
Slovensko
...
...
pro vnější tab OsoReg poddotaz do tab Zeme
Select Jm , Poh, St,
Poddotaz korelovaný
( Select Nazev From Zeme Z Where O.St = Z.Zkr) Z.Zkr Zeme From OsoReg O;
Jm
Poh
St
Pepa
m
CZ
Zeme Česko
Franz
m
DE
Německo
Jana
z
SK
Slovensko
Piere
m
FR
Francie
Poddotazy - korelované NasZam
Select Select ** From From
NasZam NasZam Z1 Z1
Where Where (Select (Select Count(*) Count(*)From FromNasZam NasZam Z2 Z2
Jm
Prof
Plat
Bobo
truhlar
20 000
David
truhlar
25 000
Franta
kovar
30 000
Jan
kovar
40 000
Karel
sofer
8 000
?
Where Where Z1.Prof Z1.Prof==Z2.Prof Z2.Prof)) >>1; 1; NasZam Jm
Prof
Plat
Bobo
truhlar
20 000
David
truhlar
25 000
Franta
kovar
30 000
Jan
kovar
40 000
Poddotazy - korelované
zkuste vypsat tab KramPro aby postupne načítala ProCenu KramPro Dat
Zbozi
KramPro Id
Dat
Zbozi
ProCena
1
2012-05-01 mleko
30
2
2012-05-01 maso
80
ProCena
Soucet
3
2012-05-02 pecivo
8
2012-05-01 mleko
30
30
4
2012-05-02 mleko
20
2012-05-01 maso
80
110
5
2012-05-03 pecivo
4
2012-05-02 pecivo
8
118
6
2012-05-04 mleko
50
2012-05-02 mleko
20
128
2012-05-03 pecivo
4
132
2012-05-04 mleko
50
182
Select Select Dat, Dat,Zbozi, Zbozi,ProCena, ProCena, (Select (SelectSum(Procena) Sum(Procena)From FromKramPro KramProK2 K2 Where WhereK2.Id K2.Id<= <=K.Id) K.Id) as as Soucet Soucet From From KramPro KramProKK Order OrderBy ById; Id;
Poddotazy - korelované KramPro
KramPro Id
Dat
30
1
2012-05-01 mleko
30
80
80
2
2012-05-01 maso
80
2012-05-02 pecivo
8
8
3
2012-05-02 pecivo
8
2012-05-02 mleko
20
50
4
2012-05-02 mleko
20
2012-05-03 pecivo
4
12
5
2012-05-03 pecivo
4
2012-05-04 mleko
50
100
6
2012-05-04 mleko
50
Dat
Zbozi
ProCena
Soucet
2012-05-01 mleko
30
2012-05-01 maso
Zbozi
ProCena
Select Select Dat, Dat,Zbozi, Zbozi,ProCena, ProCena,
(Select (SelectSum(Procena) Sum(Procena)From FromKramPro KramProK2 K2 Where WhereK2.Id K2.Id<= <=K.Id K.Id And And K2.Zbozi=K.Zbozi) K2.Zbozi=K.Zbozi) as as Soucet Soucet
From From KramPro KramProKK Order OrderBy ById; Id;
totéž avšak načítání ve zbozi
joiny joiny nebo nebo poddotazy poddotazy ce ší ce je je lep lepší ??? ???
Poddotazy - korelované Zeme
Jm
Poh St
Pepa
m
Zeme
Zkr
Nazev
CZ
BE
Belgie
Franz m
DE
CZ
Česko
Jana
z
SK
FR
Francie
Piere
m
FR
DE
Německo
SK
Slovensko
...
...
Select Jm Select Jm,, Poh, Poh,
Jm
Poh
St
St, St,
Pepa
m
CZ
Zeme Česko
Franz
m
DE
Německo
Jana
z
SK
Slovensko
Piere
m
FR
Francie
((Select Select Nazev NazevFrom FromZeme ZemeZZ Where Where O.St O.St==Z.Zkr) Z.Zkr) Zeme Zeme From From OsoReg OsoRegO; O;
šlo "otextování" názvem země činit jinak ?
Náhrada korelovaných poddotazů Zeme
Zeme
Zkr
Nazev
BE
Belgie Česko
Jm
Poh
St
Pepa
m
CZ
CZ
Franz
m
DE
FR
Jana
z
SK
Piere
m
FR
Select Jm Select Jm, , Poh, Poh, St, St, ( (Select Select Nazev NazevFrom FromZeme ZemeZZ Where Where O.St O.St==Z.Zkr) Z.Zkr) Zeme Zeme From From OsoReg OsoRegO; O;
Select Select O. O.Jm, Jm,O. O.Poh, Poh,O.St, O.St, Z.Nazev Z.Nazev From From OsoReg OsoRegOO Join Join Zeme ZemeZZ On On
O.St O.St==Z.Zkr; Z.Zkr;
DE
Francie Německo
SK
Slovensko
...
...
OsoReg O
Zeme Z
Jm
Poh
St
Zkr
Nazev
Pepa
m
CZ
CZ
Cesko
Franz
m
DE
DE
Německo
.....
.....
.....
.....
.....
Jm
Poh
St
Pepa
m
CZ
Zeme Česko
Franz
m
DE
Německo
Jana
z
SK
Slovensko
Piere
m
FR
Francie
Poddotazy a spojování tabulek
poddotazy korelované i nekorelované
lze nahradit spojováním tabulek [join]
náhrada korelovaných dotazů spojením je žádoucí
náhrada nekorelovaných dotazů se nikdy nečiní
Poddotazy a spojování tabulek NasZam
Select SelectJm, Jm,Prof, Prof,Plat, Plat, (Select (SelectMax Max(Plat) (Plat)From FromNasZam) NasZam)MaxPlat MaxPlat From From NasZam NasZam
Jm
Prof
Plat
Bobo
truhlar
20 000
David
truhlar
25 000
Franta
kovar
30 000
Jan
kovar
40 000
Karel
sofer
8 000
nahraďte [treningově] poddotaz spojením Select SelectZ1.Jm, Z1.Jm,Z1.Prof, Z1.Prof,Z1.Plat, Z1.Plat,Max(Z2.Plat) Max(Z2.Plat)MaxP MaxP From From NasZam NasZamZ1 Z1Cross CrossJoin JoinNasZam NasZamZ2 Z2 Group GroupBy ByZ1.Jm Z1.Jm
Jm
Prof
Plat
MaxPlat
Bobo
truhlar
20 000
40 000
David
truhlar
25 000
40 000
Franta
kovar
30 000
40 000
Jan
kovar
40 000
40 000
Karel
sofer
8 000
40 000
Poddotazy a spojování tabulek Select SelectZ1.Jm, Z1.Jm,Z1.Prof, Z1.Prof,Z1.Plat, Z1.Plat,Max(Z2.Plat) Max(Z2.Plat)MaxP MaxP From From NasZam NasZamZ1 Z1Cross CrossJoin JoinNasZam NasZamZ2 Z2 Group GroupBy ByZ1.Jm Z1.Jm
NasZam Z1 Jm Prof plat
NasZam Z2 Jm Prof plat
Bobo
truhlar
20 000
Bobo
truhlar
20 000
Bobo
truhlar
20 000
David
truhlar
25 000
Bobo
truhlar
20 000
Franta
kovar
30 000
Bobo
truhlar
20 000
Jan
kovar
40 000
Bobo
truhlar
20 000
Karel
sofer
8 000
David
truhlar
25 000
Bobo
truhlar
20 000
David
truhlar
25 000
David
truhlar
25 000
David
truhlar
25 000
Franta
kovar
30 000
David
truhlar
25 000
Jan
kovar
40 000
David
truhlar
25 000
Karel
sofer
8 000
Franta
kovar
30 000
Bobo
truhlar
20 000
Franta
kovar
30 000
David
truhlar
25 000
Franta
kovar
30 000
Franta
kovar
30 000
Franta
kovar
30 000
Jan
kovar
40 000
Franta
kovar
30 000
Karel
sofer
8 000
......
......
......
......
......
......
......
......
......
......
......
......
NasZam Jm
Prof
Plat
Bobo
truhlar
20 000
David
truhlar
25 000
Franta
kovar
30 000
Jan
kovar
40 000
Karel
sofer
8 000
40 000
40 000
40 000
Jm
Prof
Plat
MaxPlat
Bobo
truhlar
20 000
40 000
David
truhlar
25 000
40 000
Franta
kovar
30 000
40 000
Jan
kovar
40 000
40 000
Karel
sofer
8 000
40 000
Poddotazy a spojování tabulek Select SelectZ1.Jm, Z1.Jm,Z1.Prof, Z1.Prof,Z1.Plat, Z1.Plat,Max(Z2.Plat) Max(Z2.Plat)MaxP MaxP From From NasZam NasZamZ1 Z1Cross CrossJoin JoinNasZam NasZamZ2 Z2 Group GroupBy ByZ1.Jm Z1.Jm MySQL MySQL ostatn í ostatní
Jm
NasZam Z1 Prof plat
Jm
ok ok error error
NasZam Z2 Prof plat
Bobo
truhlar
20 000
Bobo
truhlar
20 000
Bobo
truhlar
20 000
David
truhlar
25 000
Bobo
truhlar
20 000
Franta
kovar
30 000
Bobo
truhlar
20 000
Jan
kovar
40 000
Bobo
truhlar
20 000
Karel
sofer
8 000
NasZam Jm
Prof
Plat
Bobo
truhlar
20 000
David
truhlar
25 000
Franta
kovar
30 000
Jan
kovar
40 000
Karel
sofer
8 000
Poddotazy a spojování tabulek NasZam
Select SelectZ1.Jm, Z1.Jm,
Jm
Prof
Plat
Z1.Prof, Z1.Prof,
Bobo
truhlar
20 000
David
truhlar
25 000
Z1.Plat, Z1.Plat,
Franta
kovar
30 000
Jan
kovar
40 000
Karel
sofer
8 000
Max(Z2.Plat) Max(Z2.Plat)
MaxP MaxP
From From NasZam NasZamZ1 Z1Cross CrossJoin JoinNasZam NasZamZ2 Z2 Group GroupBy ByZ1.Jm Z1.Jm
Jm
NasZam Z1 Prof plat
Jm
NasZam Z2 Prof plat
Bobo
truhlar
20 000
Bobo
truhlar
20 000
Bobo
truhlar
20 000
David
truhlar
25 000
Bobo
truhlar
20 000
Franta
kovar
30 000
Bobo
truhlar
20 000
Jan
kovar
40 000
Bobo
truhlar
20 000
Karel
sofer
8 000
error error
Poddotazy a spojování tabulek NasZam
Select SelectZ1.Jm, Z1.Jm,
Jm
Prof
Plat
Z1.Prof, Z1.Prof,
Bobo
truhlar
20 000
David
truhlar
25 000
Z1.Plat, Z1.Plat,
Franta
kovar
30 000
Jan
kovar
40 000
Karel
sofer
8 000
Max(Z2.Plat) Max(Z2.Plat)
MaxP MaxP
From From NasZam NasZamZ1 Z1Cross CrossJoin JoinNasZam NasZamZ2 Z2 Group GroupBy ByZ1.Jm, Z1.Jm,Z1.Prof, Z1.Prof,Z1.Plat Z1.Plat
Jm
NasZam Z1 Prof plat
Jm
NasZam Z2 Prof plat
Bobo
truhlar
20 000
Bobo
truhlar
20 000
Bobo
truhlar
20 000
David
truhlar
25 000
Bobo
truhlar
20 000
Franta
kovar
30 000
Bobo
truhlar
20 000
Jan
kovar
40 000
Bobo
truhlar
20 000
Karel
sofer
8 000
ok ok
Poddotazy a spojování tabulek NasZam
Select SelectZ1.Jm, Z1.Jm, Min Prof Min((Z1.Prof Z1.Prof)) Prof, Prof, Min Min((Z1.Plat) Z1.Plat)
Plat, Plat Plat,
Max(Z2.Plat) Max(Z2.Plat)
MaxP MaxP
From From NasZam NasZamZ1 Z1Cross CrossJoin JoinNasZam NasZamZ2 Z2 Group GroupBy ByZ1.Jm Z1.Jm
Jm
NasZam Z1 Prof plat
Jm
NasZam Z2 Prof plat
Bobo
truhlar
20 000
Bobo
truhlar
20 000
Bobo
truhlar
20 000
David
truhlar
25 000
Bobo
truhlar
20 000
Franta
kovar
30 000
Bobo
truhlar
20 000
Jan
kovar
40 000
Bobo
truhlar
20 000
Karel
sofer
8 000
ok ok
Jm
Prof
Plat
Bobo
truhlar
20 000
David
truhlar
25 000
Franta
kovar
30 000
Jan
kovar
40 000
Karel
sofer
8 000
aa jiný ý ppříklad říklad jin jiný
Poddotazy a spojování tabulek NasZam
korelovaný
Jm
Prof
Plat
Bobo
truhlar
20 000
Select SelectJm, Jm,Prof, Prof,Plat, Plat, (Select Max (Select Max(Plat) (Plat)
David
truhlar
25 000
Franta
kovar
30 000
Jan
kovar
40 000
From NasZam From NasZamNZ2 NZ2 Where Where NZ1.Prof=NZ2.Prof NZ1.Prof=NZ2.Prof))MaxPlat MaxPlat From From NasZam NasZamNZ1 NZ1
Karel
sofer
8 000
Jm
Prof
Plat
MaxPlat
Bobo
truhlar
20 000
25 000
David
truhlar
25 000
25 000
Franta
kovar
30 000
40 000
Jan
kovar
40 000
40 000
Karel
sofer
8 000
8 000
nahra ďte nahraďte
spojen ím spojením řešte řešte
Poddotazy a spojování tabulek NasZam
Select SelectJm, Jm,Prof, Prof,Plat, Plat, (Select (Select Max Max(Plat) (Plat) From From NasZam NasZamNZ2 NZ2 Where Where NZ1.Prof=NZ2.Prof NZ1.Prof=NZ2.Prof))MaxPlat MaxPlat From From NasZam NasZamNZ1 NZ1
Select Select Z1.Jm, Z1.Jm,Z1.Prof, Z1.Prof,Z1.Plat, Z1.Plat, Max Max(Z2.Plat) (Z2.Plat) MaxPlat MaxPlat From From
NasZam NasZamZ1 Z1
Join Join
NasZam NasZamZ2 Z2
Jm
Prof
Plat
Bobo
truhlar
20 000
David
truhlar
25 000
Franta
kovar
30 000
Jan
kovar
40 000
Karel
sofer
8 000
Jm
Prof
Plat
MaxPlat
Bobo
truhlar
20 000
25 000
David
truhlar
25 000
25 000
Franta
kovar
30 000
40 000
Jan
kovar
40 000
40 000
Karel
sofer
8 000
8 000
On On Z1.Prof Z1.Prof==Z2. Z2.Prof Prof Group GroupBy ByZ1.Jm; Z1.Jm;
error error
Jm
Prof
Plat
MaxPlat
Bobo
truhlar
20 000
25 000
David
truhlar
25 000
25 000
Franta
kovar
30 000
40 000
Jan
kovar
40 000
40 000
Karel
sofer
8 000
8 000
Poddotazy a spojování tabulek NasZam
Select SelectJm, Jm,Prof, Prof,Plat, Plat, (Select (Select Max Max(Plat) (Plat) From From NasZam NasZamNZ2 NZ2 Where Where NZ1.Prof=NZ2.Prof NZ1.Prof=NZ2.Prof))MaxPlat MaxPlat From From NasZam NasZamNZ1 NZ1
Select Select Z1.Jm, Z1.Jm, Min Prof Min(Z1.Prof) (Z1.Prof) Prof, Prof,
From From
Min Min(Z1.Plat) (Z1.Plat)
Plat, Plat,
Max Max(Z2.Plat) (Z2.Plat)
MaxPlat MaxPlat
NasZam NasZamZ1 Z1
Join Join
NasZam NasZamZ2 Z2
On On Z1.Prof Z1.Prof==Z2. Z2.Prof Prof Group GroupBy ByZ1.Jm; Z1.Jm;
ok ok
Jm
Prof
Plat
Bobo
truhlar
20 000
David
truhlar
25 000
Franta
kovar
30 000
Jan
kovar
40 000
Karel
sofer
8 000
Poddotazy a spojování tabulek NasZam
Select Select Z1.Jm, Z1.Jm, Min Prof Min(Z1.Prof) (Z1.Prof) Prof, Prof, Min Min(Z1.Plat) (Z1.Plat) Plat, Plat, Max Z2.Plat) MaxPlat Z2 Max((Z2.Plat) MaxPlat From Join NasZam From NasZam NasZamZ1 Z1 Join NasZamZ2 Z2 On On Z1.Prof Z1.Prof==Z2. Z2.Prof Prof Group GroupBy ByZ1.Jm; Z1.Jm;
NasZam Z1 Jm Prof plat
NasZam Z2 Jm Prof plat
Bobo
truhlar
20 000
Bobo
truhlar
20 000
Bobo
truhlar
20 000
David
truhlar
25 000
David
truhlar
25 000
Bobo
truhlar
20 000
David
truhlar
25 000
David
truhlar
25 000
Franta
kovar
30 000
Franta
kovar
30 000
Franta
kovar
30 000
Jan
kovar
40 000
Jan
kovar
40 000
Franta
kovar
30 000
Jan
kovar
40 000
Jan
kovar
40 000
Karel
sofer
8 000
Karel
sofer
8 000
Jm
Prof
Plat
Bobo
truhlar
20 000
David
truhlar
25 000
Franta
kovar
30 000
Jan
kovar
40 000
Karel
sofer
8 000
25 000 25 000 40 000 40 000 8 000
Jm
Prof
Plat
MaxPlat
Bobo
truhlar
20 000
25 000
David
truhlar
25 000
25 000
Franta
kovar
30 000
40 000
Jan
kovar
40 000
40 000
Karel
sofer
8 000
8 000
trochu trochu to to zkomplikujme zkomplikujme
Poddotazy Kniha
Kniha PK
Isbn Nazev Autor Cena
Autor
Autor
Isbn
Nazev
Autor
Cena
111
Volám hurá
Anna
200
222
Dnes ne
Bobo
100
333
Vzpomínky
Franc
300
444
Vaření
Pepa
100
555
Zítra taky
Bobo
500
PK
Jmeno Titul RokNar Mesto
Jmeno
Titul
RokNar
Mesto
Anna
Ing
1950
Brno
Bobo
Dr
1970
Praha
1980
Beroun
1980
Vary
Franc Pepa
Judr
úkol: úkol: vypište vypište knihy knihy které které napsal napsal nejstarší nejstarší autor autor Kniha Isbn
Nazev
Autor
Cena
111
Volám hurá
Anna
200
promyslete promyslete
zzkkuusst tee
Poddotazy - úkol : knihy nejstaršího autora Kniha
Kniha PK
Isbn Nazev Autor Cena
Autor
Autor
Isbn
Nazev
Autor
Cena
111
Volám hurá
Anna
200
222
Dnes ne
Bobo
100
333
Vzpomínky
Franc
300
444
Vaření
Pepa
100
555
Zítra taky
Bobo
500
PK
Jmeno Titul RokNar Mesto
Jmeno
Titul
RokNar
Mesto
Anna
Ing
1950
Brno
Bobo
Dr
1970
Praha
1980
Beroun
1980
Vary
Franc Pepa
rok rok narození narození nejstaršího nejstaršího autora autora ?? nejstarší nejstarší autor autor ??
Min...
Select Select Min(RokNar) Min(RokNar) From From Autor; Autor; Select Select Where Where
** FROM FROM Autor Autor RokNar RokNar==(Select (SelectMin(RokNar) Min(RokNar) From FromAutor); Autor);
Judr
1950
Autor Jmeno
Titul
RokNar
Mesto
Anna
Ing
1950
Brno
Poddotazy - úkol : knihy nejstaršího autora Kniha
Kniha PK
Isbn Nazev Autor Cena
Isbn
Nazev
111
Anna Volám hurá Anna
200
222
Dnes ne
Bobo
100
333
Vzpomínky
Franc
300
444
Vaření
Pepa
100
555
Zítra taky
Bobo
500
Autor
Cena
PK
Jmeno Titul RokNar Mesto
rok rok narození narození nejstaršího nejstaršího autora autora ?? nejstarší nejstarší autor autor ?? knihy knihy nejstaršího nejstaršího autora autora ?? Select Select ** Where Where
From FromKniha Kniha Autor Autor==((
Select FROM Select Jmeno Jmeno FROM Autor Autor Where Where RokNar RokNar==((
););
Autor
Autor
Select SelectMin(RokNar) Min(RokNar) From FromAutor) Autor)
Jmeno
Titul
RokNar
Mesto
Anna
Ing
1950
Brno
Bobo
Dr
1970
Praha
1980
Beroun
1980
Vary
Franc Pepa
Judr
Autor Min...
Jmeno
Titul
RokNar
Mesto
1950
Anna
Ing
1950
Brno
Kniha Isbn
Nazev
Autor
Cena
111
Volám hurá
Anna
200
Poddotazy Kniha
Kniha PK
Isbn Nazev Autor Cena
Autor
Autor
Isbn
Nazev
Autor
Cena
111
Volám hurá
Anna
200
222
Dnes ne
Bobo
100
333
Vzpomínky
Franc
300
444
Vaření
Pepa
100
555
Zítra taky
Bobo
500
PK
Jmeno Titul RokNar Mesto
Jmeno
Titul
RokNar
Mesto
Anna
Ing
1950
Brno
Bobo
Dr
1970
Praha
1980
Beroun
1980
Vary
Franc Pepa
Judr
úkol: úkol: vypište vypište knihy knihy které mladší autor které napsal napsal nej nejmladší autor
promyslete promyslete
zzkkuusst tee
Poddotazy Kniha
Kniha PK
Isbn Nazev Autor Cena
Autor
Autor
Isbn
Nazev
Autor
Cena
111
Volám hurá
Anna
200
222
Dnes ne
Bobo
100
333
Vzpomínky
Franc
300
444
Vaření
Pepa
100
555
Zítra taky
Bobo
500
PK
Jmeno Titul RokNar Mesto
Jmeno
Titul
RokNar
Mesto
Anna
Ing
1950
Brno
Bobo
Dr
1970
Praha
1980
Beroun
1980
Vary
Franc Pepa
Judr
úkol úkol :vypište :vypište knihy knihy které mladší autor které napsal napsal nej nejmladší autor Select Select ** Where Where
From FromKniha Kniha Autor Autor==((
!!! !!!Subquery Subqueryreturns returnsmore morethan than11row row
Select FROM Select Jmeno Jmeno FROM Autor Autor Where Where RokNar RokNar==((
););
!!! !!!Neskalární Neskalárnípoddotazy poddotazy!!! !!!
Select Min Select Max Min (RokNar) (RokNar) From FromAutor) Autor) error error
promyslete promyslete
zzkkuusst tee
Neskalární poddotazy - knihy nejmladšího autora Kniha
Kniha PK
Isbn Nazev Autor Cena
Autor
Autor
Isbn
Nazev
Autor
Cena
111
Volám hurá
Anna
200
222
Dnes ne
Bobo
100
333
Franc Franc
300
444
Vzpomínky Vaření
Pepa Pepa
100
555
Zítra taky
Bobo
500
PK
Jmeno Titul RokNar Mesto
Jmeno
Titul
RokNar
Mesto
Anna
Ing
1950
Brno
Bobo
Dr
1970
Praha
1980
Beroun
1980
Vary
Franc Pepa Autor
rok rok narození narození nejmladšího nejmladšího autora autora ?? 1980 nejmladší nejmladší autor autor ?? knihy knihy nejmladšího nejmladšího autora autora ??
Max...
Select Select ** Where Where
From FromKniha Kniha Autor Autor==((
Jmeno Franc Franc Pepa Pepa
Kniha
Select FROM Select Jmeno Jmeno FROM Autor Autor Where error error Where RokNar RokNar==(( Select SelectMax Max(RokNar) (RokNar) From FromAutor) Autor)
););
Judr
Isbn
Nazev
Autor
Cena
333
Vzpomínky
Franc
300
444
Vaření
Pepa
100
!!! !!!Subquery Subqueryreturns returnsmore morethan than11row row
Neskalární poddotazy - knihy nejmladšího autora Kniha
Kniha PK
Isbn Nazev Autor Cena
Autor
Autor
Isbn
Nazev
Autor
Cena
111
Volám hurá
Anna
200
222
Dnes ne
Bobo
100
333
Vzpomínky
Franc Franc
300
444
Vaření
Pepa Pepa
100
555
Zítra taky
Bobo
500
PK
Jmeno Titul RokNar Mesto
Jmeno
Titul
RokNar
Mesto
Anna
Ing
1950
Brno
Bobo
Dr
1970
Praha
1980
Beroun
1980
Vary
Franc Pepa
Judr
Autor Max... 1980
Jmeno Franc Franc Pepa Pepa
Select Select ** Where Where
From FromKniha Kniha Autor Autor==((
Select FROM Select Jmeno Jmeno FROM Autor Autor Where Where RokNar RokNar==(( Select SelectMax Max(RokNar) (RokNar) From FromAutor) Autor)
););
vnitřní vnitřní dotaz dotaz -- 22 hodnoty hodnoty porovnání porovnání skalár skalár = = (množina) (množina) operátor operátor "=" "=" operátor operátor homogenní homogenní error error
Neskalární poddotazy - knihy nejmladšího autora problémem ár> verzus Množina> problémem operace operace <Skal <Skalár> verzus <<Množina> potřebujeme potřebujeme nějakou nějakou "operaci" "operaci" na na množině množině
--> --> výsledek výsledek skalár skalár [True, [True, False] False] skal ároMnožinové relační skalároMnožinové relační operátory operátory
Skal ár Skalár
Select Select ** Where Where
RelOper átor RelOperátor
Mno žina Množina
Exists Exists
Mno žina Množina
From FromKniha Kniha Autor Autor==((
Select FROM Select Jmeno Jmeno FROM Autor Autor Where error error Where RokNar RokNar==(( Select SelectMax Max(RokNar) (RokNar) From FromAutor) Autor)
););
In In Any Any/ /Some Some All All
Exists Exists
vnitřní vnitřní dotaz dotaz -- 22 hodnoty hodnoty porovnání porovnání skalár skalár = = (množina) (množina) operátor operátor "=" "=" operátor operátor homogenní homogenní error error
Relační operátor In - Not In Výraz Výraz In In (Množina) (Množina)
true true hodnota hodnota výrazu výrazu je je součástí součástí množiny množiny
Výraz Výraz Not NotIn In (Množina) (Množina)
true true hodnota hodnota výrazu výrazu není není vv množině množině
Not Not((Výraz Výraz In In (Množina) (Množina))) 5 IIn n ( 1, 3 , 5, 7, 9) 5 IIn n ( 10, 20 , 30) 30) 'c' IIn n ( 'a', 'ab', 'abc')
From From Dual; Dual;
From From Dual; Dual;
Select Select
'e' IIn n ( 'c', 'e', 'f') 'Pepa' Not In ( 'Fany', 'Tom') 10/5+2 IIn n (1, 3, 5, 7)
Select Select
'Pepa' In (Select Jmeno From Autor)
Select Select Select Select Select Select Select Select Select Select
From From Dual; Dual; From From Dual; Dual;
From From Dual; Dual; From From Dual; Dual;
From From Dual; Dual;
true false false true true false true
Neskalární poddotazy - knihy nejmladšího autora Kniha
Kniha PK
Isbn Nazev Autor Cena
Autor
Autor
Isbn
Nazev
Autor
Cena
111
Volám hurá
Anna
200
222
Dnes ne
Bobo
100
333
Vzpomínky
Franc Franc
300
444
Vaření
Pepa Pepa
100
555
Zítra taky
Bobo
500
PK
Jmeno Titul RokNar Mesto
Jmeno
Titul
RokNar
Mesto
Anna
Ing
1950
Brno
Bobo
Dr
1970
Praha
1980
Beroun
1980
Vary
Franc Pepa Autor
Max... 1980
Jmeno Franc Franc Pepa Pepa
Select Select ** Where Where
From FromKniha Kniha Autor Autor == ((
error error
Select FROM Select Jmeno Jmeno FROM Autor Autor Where Where RokNar RokNar==(( Select SelectMax Max(RokNar) (RokNar) From FromAutor) Autor) ););
Judr
Neskalární poddotazy - knihy nejmladšího autora Kniha
Kniha PK
Isbn Nazev Autor Cena
Autor
Autor
Isbn
Nazev
Autor
Cena
111
Volám hurá
Anna
200
222
Dnes ne
Bobo
100
333
Vzpomínky
Franc Franc
300
444
Vaření
Pepa Pepa
100
555
Zítra taky
Bobo
500
PK
Jmeno Titul RokNar Mesto
Jmeno
Titul
RokNar
Mesto
Anna
Ing
1950
Brno
Bobo
Dr
1970
Praha
1980
Beroun
1980
Vary
Franc Pepa
Judr
Autor Max...
Jmeno
1980
Franc Franc Pepa Pepa
Select Select ** Where Where
From FromKniha Kniha Autor Autor IN IN ((
Select FROM Select Jmeno Jmeno FROM Autor Autor Where Where RokNar RokNar==(( Select SelectMax Max(RokNar) (RokNar) From FromAutor) Autor) ););
Kniha Isbn
Nazev
Autor
Cena
333
Vzpomínky
Franc
300
444
Vaření
Pepa
100
Relační operátor poddotazů Any / Some - All Any Any/ /Some Some
All All
relační relační operátory operátory pro pro porovnání porovnání hodnoty hodnoty [sloupce] [sloupce] ss [neskalárním] [neskalárním] výsledkem výsledkem poddotazu poddotazu All před před operátory operátory Any Any/ /Some Some All se se uvádí uvádí vlastní vlastní operátor operátor porovnání porovnání == <> <> != != >> << >= >= <= <= Where WhereVýraz Výraz== Any Any (Select (Select....) ....) Where WhereVýraz Výraz<> <>Any Any (Select (Select....) ....) Where WhereVýraz Výraz!= != Any Any (Select (Select....) ....) Where WhereVýraz Výraz>> Any Any (Select (Select....) ....) Where WhereVýraz Výraz>> All All Where WhereVýraz Výraz<= <= All All
(Select (Select....) ....) (Select (Select....) ....)
Relační operátor poddotazů Any / Some - All Any Any/ /Some Some
Where WhereVýraz Výraz== Any Any (Select (Select....) ....)
porovnání porovnání se se provede provede na na každém každém prvku prvku poddotazu poddotazu pokud pokud je je alespoň alespoň jedno jedno porovnání porovnání pravdivé pravdivé výsledek výsledek relace relace je je True True
All All
Where WhereVýraz Výraz>> All All
(Select (Select....) ....)
porovnání porovnání se se provede provede na na každém každém prvku prvku poddotazu poddotazu výsledek výsledek je je True True pokud pokud porovnání porovnání na na všech všech prvcích prvcích poddotazu poddotazu jsou jsou pravdivá pravdivá Where WhereVýraz Výraz== All All
(Select (Select....) ....)
??? ???
Relační operátor poddotazů Any / Some - All Select 'Ano' From Dual Where 3 In ( 1, 2, 3, 4, 5 ); Select 'Ano' From Dual Where 3 In (Select 1,2,3,4,5 From Dual); Select 'Ano' From Dual Where 3 = Any (Select 1,2,3,4,5 From Dual);
Ano
error error
error error
Select 'Ano' From Dual Where 3 = Any (Select 1 From Dual Union Select 2 From Dual Union Select 3 From Dual);
Ano
Select 'Ano' From Dual Where 3 In (Select 1 From Dual Union Select 2 From Dual Union Select 3 From Dual);
Ano
Relační operátor poddotazů Any / Some
Autor Jmeno
Titul
RokNar
Mesto
Anna
Ing
1950
Brno
Bobo
Dr
1970
Praha
1980
Beroun
1980
Vary
Franc Pepa
Judr
Select Select'Ano' 'Ano' From FromDual Dual Where Where'Pepa' 'Pepa'==Any Any (Select (SelectJmeno Jmeno From FromAutor) Autor)
Ano Ano
Select Select'Ano' 'Ano' From FromDual Dual Where Where1965 1965>>Any Any (Select (SelectRokNar RokNar From FromAutor) Autor)
Ano Ano
Select Select'Ano' 'Ano' From FromDual Dual Where ll (Select Where1930 1930<
Ano Ano
Select Select'Ano' 'Ano' From FromDual Dual Where ll (Select Where'Kiki' 'Kiki'<> <>AAll (SelectJmeno Jmeno From FromAutor) Autor)
Ano Ano
Relační operátor poddotazů Exists, Not Exists Exists Exists
Exists Exists (Poddotaz) (Poddotaz)
poddotaz poddotaz je je vyhodnocen vyhodnocen zda zda vrátí vrátí vůbec vůbec nějakou nějakou řádku řádku poddotaz poddotaz vrátí vrátí alespoň alespoň jednu jednu řádku řádku ==> ==> poddotaz ==> poddotaz nevrátí nevrátí řádnou řádnou řádku řádku ==> je je zcela zcela jedno jedno co co se se zadá zadá vv Select Select Exists Exists Exists Exists Exists Exists Exists Exists
((Select Select ** ((Select Select 'Franta' 'Franta'
From From... ...Where Where...) ...) From From... ...Where Where...) ...)
((Select Select 11 From From... ...Where Where...) ...) ((Select Select Sloup1 Sloup1 From From... ...Where Where...) ...) Not Select Jm, NotExists Exists ((Select Jm,Plat Plat From From... ...Where Where...) ...)
True True False False
Relační operátor poddotazů Exists, Not Exists Autor
Kniha2
Isbn
Nazev
Autor
Cena
Jmeno
Titul
RokNar
Mesto
111
Volám hurá
Anna
200
Anna
Ing
1950
Brno
222
Dnes ne
Bobo
100
Bobo
Dr
1970
Praha
333
Vzpomínky
Franc
300
Franc
1980
Beroun
444
Vaření
Pepa
100
Pepa
1980
Vary
555
Zítra taky
Bobo
500
666
Apokalypsa
Kiki
250
Kiki
777
Anastazie
Jim
150
Jim
Judr
zjistěte zjistěte knihy knihy jejichž jejichž autoři autoři nejsou nejsou uvedeny uvedeny vv katalogu katalogu autorů autorů
Select Select ** Where Where
From FromKniha2 Kniha2KK Not NotExists Exists
(Select (Select**From FromAutor AutorAA ´´ Where Where A.Jmeno A.Jmeno==K.Autor); K.Autor);
Kniha2 Isbn
Nazev
Autor
Cena
666
Apokalypsa
Kiki
250
777
Anastazie
Jim
150
promyslete promyslete
zzkkuusst tee
aa zas ěco akč čního ak zas nněco akčního
Nejnovější super Byzniz-drby jsou TuTuTu
vážení jedině strategie ppřidávat, řidávat, ppřidávat řidávat
přinese skutečný poklid do Vašeho podniku
a proto provádějte ihned a vždy ppřidávání řidávání !!!! !!!!
Ještě novejší nejnovější super Byzniz-drby jsou TuTuTu
750 750 Miliard Miliard Euro Euro
burza burza de de nahoru nahoru !! !!
Ještě novejší nejnovější super Byzniz-drby jsou TuTuTu
750 Miliard Euro 750 Miliard Euro Platy !!!
Přidávat !!! Přidávat !!!
burza burza de de nahoru nahoru !! !!
Příjemná zpráva
cc80214.005
situace ve světě financí - různá ve vašem podniku však vynikající všichni (tj. 10 000 lidí) dostanou přidáno 6000 !!
Přidání platu Zamestnanci PK
Jmeno DatNar Funkce Oddeleni Plat
Finanční ředitel Zamestnanci Jmeno
DatNar
Oddeleni
Plat
01.01.1980
Funkce ředitel
Pepa
A100
50 000
Hana
02.02.1990
sekretářka
A100
20 000
Karel
03:03:1960
skladnik
S200
25 000
...
...
...
...
...
UPDATE UPDATE Zamestnanci Zamestnanci SET SET Plat Plat == Plat Plat ++ 44 000 000
Přidání platu Zamestnanci
Zamestnanci PK
Jmeno DatNar Funkce Oddeleni Plat
Jmeno
DatNar
Funkce
Oddeleni
Plat
Pepa
01.01.1980
ředitel
A100
50 000
Hana
02.02.1990
sekretářka
A100
20 000
03:03:1960
skladnik
S200
25 000
Karel
Finanční ředitel
UPDATE UPDATE Zamestnanci Zamestnanci SET SET Plat Plat == Plat Plat ++ 44 000 000 Kolika lidem bylo přidáno ???
Jak to zjistit ???
Ježíšmarjá
Je žíšmarjá Ježíšmarjá jjá á jsem ísto vyp ínače jsemm místo vypínače sv ětla na áchodě světla nazzáchodě odstartovala odstartovala atomovou atomovou hlavici že by ]. hlavici[[že bybomba bomba??]. To ů [[švih] švih] Tozase zasebude budepr prů upraveno censurou upraveno censurou
59
Ježíšmarjá
svět je plný chyb Je žíšmarjá Ježíšmarjá pořád něco nefunguje jjá á jsem ísto vyp ínače jsemm místo vypínače elektrika vypadne sv ětla na áchodě světla nazzáchodě hardware dělá chyby odstartovala atomovou odstartovala atomovou lidi dělají chyby hlavici [[že že by bomba ??]. ]. hlavici by bomba programy dělají chyby SODOMA To zase ů [[švih] švih] ToGOMORA zasebude budepr prů jak se v tom dá přežít ???
upraveno censurou upraveno censurou
transakcemi, ím transakcemi,pros prosím 60
Transakce
technologie technologie
jak jak přežít přežít ss minimální minimální újmou újmou
ve ve světě světě plném plném chyb chyb aa nepravostí nepravostí
vv prostředí, prostředí, kdy kdy ÊÊhoufy houfy uživatelů uživatelů stále stále
–– vkládají vkládají data data –– mění mění data data –– ruší ruší data data –– zobrazují zobrazují data data
Transakce
důsledek důsledek událostí událostí vv reálném reálném světě světě ÊÊ neb neb svět svět je je špatně špatně aa chaoticky chaoticky řízen řízen
událost událost má má důsledky důsledky ÊÊ často často změnu změnu mnoha mnoha různých různých objektů objektů
––jejich jejich stavů stavů ––vlastností vlastností ––vazev vazev ––hodnot hodnot
Přidání platu Zamestnanci
Zamestnanci PK
Jmeno DatNar Funkce Oddeleni Plat
Jmeno
DatNar
Funkce
Oddeleni
Plat
Pepa
01.01.1980
ředitel
A100
50 000
Hana
02.02.1990
sekretářka
A100
20 000
03:03:1960
skladnik
S200
25 000
Karel
Finanční ředitel
UPDATE UPDATE Zamestnanci Zamestnanci SET SET Plat Plat == Plat Plat ++ 44 000 000 Kolika lidem bylo přidáno ???
Žádnému nebylo přidáno !!
Jak to zjistit ???
Povel Povel se se provede provede buď buď celý celý
nebo nebo vůbec vůbec
Převod z konta na konto (částku 10 000)
Převeďte Převeďte částku částku
laskavě laskavě 10 10 000 000
zz konta konta na na konto konto
1111 1111 2222 2222
Už Už tak tak činím, činím, pane pane šéf šéf už už tak tak konám konám
Převod z konta na konto (částku 10 000) Konto IdKonto
Castka
.....
1111
20 000
...
...
...
2222
50 000
...
10 000
...
Převod z konta na konto (částku 10 000) Konto IdKonto
Castka
1111
20 000
...
...
2222
50 000
.....
10 000
...
10 000
... 60 000
...
... ...SET SETCastka Castka ==Castka Castka-- 10 10000 000 Where WhereIdKonto IdKonto==1111 1111 ... ...SET SETCastka Castka== Castka Castka++10 10000 000 Where WhereIdKonto IdKonto==2222 2222
) Odečti částku z Konto (1)
UPDATE konto (1)
) Přičti částku na Konto (2)
UPDATE konto (2)
) Nastav DatumPoslVydej Klient (1)
UPDATE klient (1)
) Nastav DatumPoslPříjem Klient (2)
UPDATE klient (2)
KRACH
Co áhle havarovalo Cokdyby kdybyto tonnáhle havarovalo?? ??
Převod z konta na konto (částku 10 000) Konto IdKonto
Castka
1111
20 000
...
...
2222
50 000
.....
10 000
...
10 000
... 60 000
...
... ...SET SETCastka Castka ==Castka Castka-- 10 10000 000 Where WhereIdKonto IdKonto==1111 1111 ... ...SET SETCastka Castka== Castka Castka++10 10000 000 Where WhereIdKonto IdKonto==2222 2222
) Odečti částku z Konto (1)
UPDATE konto (1)
) Přičti částku na Konto (2)
UPDATE konto (2)
) Nastav DatumPoslVydej Klient (1)
UPDATE klient (1)
) Nastav DatumPoslPříjem Klient (2)
UPDATE klient (2)
KRACH
Co áhle havarovalo Cokdyby kdybyto tonnáhle havarovalo?? ??
Převod z konta na konto (částku 10 000) Konto IdKonto
Castka
.....
1111
20 000
...
...
...
2222
50 000
...
10 000
...
10 000
... ...SET SETCastka Castka ==Castka Castka-- 10 10000 000 Where WhereIdKonto IdKonto==1111 1111
) Odečti částku z Konto (1)
UPDATE konto (1)
) Přičti částku na Konto (2)
UPDATE konto (2)
) Nastav DatumPoslVydej Klient (1)
UPDATE klient (1)
) Nastav DatumPoslPříjem Klient (2)
UPDATE klient (2)
KRACH
Ztratilo ám vvbance Ztratilose sennám bance10 10000 000
Převod z konta na konto (částku 10 000) Konto IdKonto
Castka
1111
20 000
...
...
2222
50 000
.....
10 000
...
10 000
... 60 000
...
... ...SET SETCastka Castka ==Castka Castka-- 10 10000 000 Where WhereIdKonto IdKonto==1111 1111 ... ...SET SETCastka Castka== Castka Castka++10 10000 000 Where WhereIdKonto IdKonto==2222 2222
) Odečti částku z Konto (1)
UPDATE konto (1)
) Nastav DatumPoslPříjem Klient (2)
UPDATE klient (2)
Jednotka
UPDATE konto (2) Jednotka práce (vše nebo nic) ) Nastav DatumPoslVydej Klient (1) UPDATE klient (1)
ATOM
) Přičti částku na Konto (2)
Transakce
posloupnost posloupnost jednoho jednoho čiči více více SQL SQL příkazů příkazů
Update Update
Insert Insert Update Update Delete Delete
tvoří tvoří logickou logickou atomickou atomickou jednotku jednotku aplikace aplikace (zpracování) (zpracování)
každý každý SQL SQL příkaz příkaz uvnitř uvnitř provádí provádí část část [mini] [mini] úlohy úlohy
pro pro dokončení dokončení úlohy úlohy je je třeba třeba provést provést všechny všechny povely povely ÊÊ aby aby DB DB zůstala zůstala vv konzistentním konzistentním stavu stavu
buď buď budou budou provedeny provedeny všechny, všechny, nebo nebo žádný žádný ÊÊ nedělitelná nedělitelná jednotka jednotka -- ATOM ATOM
Převod z konta na konto (částku 10 000) Konto IdKonto
Castka
1111
20 000
...
...
2222
50 000
.....
10 000
...
10 000
... 60 000
...
... ...SET SETCastka Castka ==Castka Castka-- 10 10000 000 Where WhereIdKonto IdKonto==1111 1111 ... ...SET SETCastka Castka== Castka Castka++10 10000 000 Where WhereIdKonto IdKonto==2222 2222
toto toto je je peněžní peněžní transakce transakce musí musí být být provedena provedena jako jako
) Odečti částku z Konto (1)
UPDATE konto (1)
UPDATE konto (2) Jednotka práce (vše nebo nic) ) Nastav DatumPoslVydej Klient (1) UPDATE klient (1) ) Nastav DatumPoslPříjem Klient (2)
UPDATE klient (2)
Jednotka
) Přičti částku na Konto (2)
ATOM
jedna jedna DB DB transakce transakce
Transakce
posloupnost posloupnost jednoho jednoho čiči více více SQL SQL příkazů příkazů peněžní peněžní transakce transakce musí musí být být provedena provedena jako jako jedna jedna DB DB transakce transakce
musí musí být být vymezeno vymezeno kde kde transakce transakce začíná začíná ÊÊ kterým kterým příkazem příkazem
aa kde kde transakce transakce končí končí ÊÊ kterým kterým příkazem příkazem
Update UpdateKonto Konto Set SetCastka Castka== Castka Castka- -10 10000 000 Where IdKonto = 1111; Where IdKonto = 1111; Update Konto Set Castka = Update Konto Set Castka = Castka Castka++10 10000 000 Where IdKonto = 2222; Where IdKonto = 2222; Insert Into Protokol (IdKonto,Zmena) Insert Into Protokol (IdKonto,Zmena) Values Values(1111, (1111,-10 -10000); 000); Insert Into Protokol (IdKonto,Zmena) Insert Into Protokol (IdKonto,Zmena) Values Values(2222, (2222,+10 +10000); 000);
Odcamcať Odcamcať
Pocamcať Pocamcať
Vymezení transakce Konto IdKonto
Castka
1111
20 000
...
...
2222
50 000
.....
10 000
... ...
60 000
...
INSERT INSERT ...... SELECT SELECT......
OdcamcaťOdcamcať-začátek začátektrans trans UPDATE...SET UPDATE...SETCastka= Castka=Castka Castka-- 10 10000 000 UPDATE...SET UPDATE...SETCastka= Castka=Castka Castka++10 10000 000 UPDATE...SET UPDATE...SETDatPoslVyd= DatPoslVyd=Now() Now() UPDATE...SET UPDATE...SETDatPoslVyd= DatPoslVyd=Now() Now() SELECT SELECT...... .... ....
PocamcaťPocamcať-konec konectrans trans
) Přičti částku na Konto (2)
UPDATE konto (2)
) Nastav DatumPoslVydej Klient (1)
UPDATE klient (1)
) Nastav DatumPoslPříjem Klient (2)
UPDATE klient (2)
Jednotka
UPDATE konto (1) ATOM
) Odečti částku z Konto (1)
Vymezení transakce Oso IdKonto
Castka
1111
20 000
...
...
2222
50 000
.....
10 000
... ...
60 000
...
INSERT INSERT .... .... SELECT .... SELECT ....
OdcamcaťOdcamcať-začátek začátektrans trans BEGIN ; BEGIN; UPDATE...SET UPDATE...SETCastka= Castka=Castka Castka-- 10 10000 000 UPDATE...SET UPDATE...SETCastka= Castka=Castka Castka++10 10000 000 UPDATE...SET UPDATE...SETDatPoslVyd= DatPoslVyd=Now() Now() UPDATE...SET UPDATE...SETDatPoslVyd= DatPoslVyd=Now() Now() ;; PocamcaťPocamcať-konec konectrans trans
SELECT SELECT...... .... ....
) Přičti částku na Konto (2)
UPDATE konto (2)
) Nastav DatumPoslVydej Klient (1)
UPDATE klient (1)
) Nastav DatumPoslPříjem Klient (2)
UPDATE klient (2)
Jednotka
UPDATE konto (1) ATOM
) Odečti částku z Konto (1)
Vymezení transakce Oso IdKonto
Castka
1111
20 000
...
...
2222
50 000
.....
10 000
... ...
60 000
...
INSERT INSERT .... .... SELECT .... SELECT ....
OdcamcaťOdcamcať-začátek začátektrans trans BEGIN ; BEGIN; UPDATE...SET UPDATE...SETCastka= Castka=Castka Castka-- 10 10000 000 UPDATE...SET UPDATE...SETCastka= Castka=Castka Castka++10 10000 000 UPDATE...SET UPDATE...SETDatPoslVyd= DatPoslVyd=Now() Now() UPDATE...SET UPDATE...SETDatPoslVyd= DatPoslVyd=Now() Now() COMMIT ; PocamcaťCOMMIT; Pocamcať-konec konectrans trans
SELECT SELECT...... .... ....
) Přičti částku na Konto (2)
UPDATE konto (2)
) Nastav DatumPoslVydej Klient (1)
UPDATE klient (1)
) Nastav DatumPoslPříjem Klient (2)
UPDATE klient (2)
Jednotka
UPDATE konto (1) ATOM
) Odečti částku z Konto (1)
Ukončení transakce COMMIT COMMIT
[pocamcať]
označení označení úspěšného úspěšného konce konce transakce transakce odsouhlasení odsouhlasení transakce transakce
transakce transakce je je tímto tímto kompletní kompletní ÊÊ všechny všechny příkazy příkazy provedeny provedeny aa potvrzeny potvrzeny DB DB je je tímto tímto konzistentní konzistentní
Nový Stav
ROLLBACK ROLLBACK označení označení neúspěšného neúspěšného konce konce transakce transakce
uživatel uživatel nechce nechce dokončit dokončit transakci transakci všechny všechny [v [v transakci] transakci] provedené provedené změny změny se se odvolají odvolají transakce transakce je je tímto tímto kompletní kompletní (žádný (žádný příkaz příkaz neproveden) neproveden) DB DB je je tímto tímto konzistentní konzistentní ÊÊ ve ve stavu, stavu, vv jakém jakém byla byla před před transakcí transakcí Jak To Bylo
Převod z konta na konto (částku 10 000) Konto IdKonto
Castka
1111
20 000
...
...
2222
50 000
... 10 000
... ...
60 000
...
INSERT INSERT .... .... SELECT .... SELECT ....
OdcamcaťOdcamcať-začátek začátektrans trans BEGIN ; BEGIN; UPDATE...SET UPDATE...SETCastka= Castka=Castka Castka-- 10 10000 000 UPDATE...SET UPDATE...SETCastka= Castka=Castka Castka++10 10000 000 UPDATE...SET UPDATE...SETDatPoslVyd= DatPoslVyd=Now() Now() UPDATE...SET UPDATE...SETDatPoslVyd= DatPoslVyd=Now() Now() COMMIT ; PocamcaťCOMMIT; Pocamcať-konec konectrans trans
SELECT SELECT...... .... ....
) Začni transakci
BEGIN [WORK]
) Přičti částku na Konto (2)
UPDATE konto (2)
) Nastav DatumPoslVydej Klient (1)
UPDATE klient (1)
) Nastav DatumPoslPříjem Klient (2)
UPDATE klient (2)
) Úspěšně ukonči transakci
COMMIT [WORK]
Jednotka
UPDATE konto (1) ATOM
) Odečti částku z Konto (1)
Převod z konta na konto (částku 10 000) Konto Castka
1111
20 000
...
...
2222
50 000
... 10 000
... ...
60 000
...
INSERT INSERT .... .... SELECT .... SELECT ....
OdcamcaťOdcamcať-začátek začátektrans trans BEGIN ; BEGIN; UPDATE...SET UPDATE...SETCastka= Castka=Castka Castka-- 10 10000 000 UPDATE...SET UPDATE...SETCastka= Castka=Castka Castka++10 10000 000 UPDATE...SET UPDATE...SETDatPoslVyd= DatPoslVyd=Now() Now() UPDATE...SET UPDATE...SETDatPoslVyd= DatPoslVyd=Now() Now() COMMIT ; PocamcaťCOMMIT; Pocamcať-konec konectrans trans
Transakce
IdKonto
SELECT SELECT...... .... ....
) Začni transakci
BEGIN [WORK]
) Přičti částku na Konto (2)
UPDATE konto (2)
) Nastav DatumPoslVydej Klient (1)
UPDATE klient (1)
) Nastav DatumPoslPříjem Klient (2)
UPDATE klient (2)
) Úspěšně ukonči transakci
COMMIT [WORK]
Transakce
UPDATE konto (1) ATOM
) Odečti částku z Konto (1)
Aktualizace dat – transakce dle ANSI/ISO
TRANSAKCE
Konzistentní DB
INSERT
INSERT
INSERT
INSERT
UPDATE
UPDATE
UPDATE
UPDATE
COMMIT
COMMIT
COMMIT
COMMIT
TRANSAKCE
Konzistentní DB
UPDATE
UPDATE
UPDATE
UPDATE
DELETE
DELETE
DELETE
DELETE
COMMIT
ROLLBACK
Program skončí
Program selže
Konec transakce
COMMIT
(úspěch)
ROLLBACK
(neúspěch)
Program končí ok (úspěch)
Program selže
Konzistentní DB
(implicitní) COMMIT
Začátek transakce
(implicitní) ROLLBACK
automaticky 1. povelem
(neúspěch)
Aktualizace dat – transakce Sybase (SQL Server) Konzistentní DB
BEGIN TRANSACTION
UPDATE
ČÁST
Návratový bod A
DELETE
INSERT
SAVE TRANSACTION B
ČÁST
TRANSAKCE
SAVE TRANSACTION A
INSERT
ROLLBACK TO
B
DELETE
COMMIT TRANSACTION
Konzistentní DB
Návratový bod B
Aktualizace dat – transakce jiná strategie aaco ž nejsme čním re žimu ?? cokdy když nejsmevvtransak transakčním režimu
vždy jsme v trans režimu
minimální transakce
TRANSAKCE
BEGIN WORK
UPDATE
DELETE
INSERT
COMMIT WORK
Ê
nezadaná
Ê
povel
povel se provede Ê
buď celý
Ê
nebo nic
nikdy se neprovede
T
T
T
Ê INSERT
UPDATE
DELETE
T
BEGIN WORK
....
půl povelu
TRANSAKCE
SELECT SELECT INSERT INSERT UPDATE UPDATE DELETE DELETE COMMIT COMMIT
TRANSAKCE
Aktualizace dat – transakce dle ANSI/ISO - automatická
UPDATE UPDATE ..... ..... SELECT .... SELECT .... DELETE .... DELETE .... INSERT .... INSERT .... ROLLBACK ROLLBACK [WORK] [WORK]
..... ..... ...... ...... ...... ...... ..... ..... [WORK] [WORK]
První SQL povel zahájí automaticky transakci
Po ukončení předchozí první další povel zahajuje novou transakci
T T T T T T T
MIMO TRANSAKCI
TRANSAKCE
MIMO TRANSAKCI
Aktualizace dat – transakce dle Sybase - manuální SELECT SELECT INSERT INSERT UPDATE UPDATE
..... ..... ...... ...... ...... ......
BEGIN BEGIN DELETE DELETE INSERT INSERT UPDATE UPDATE COMMIT COMMIT
[WORK] [WORK] ..... ..... ... ... .... .... [WORK] [WORK]
UPDATE UPDATE ..... ..... SELECT .... SELECT .... DELETE .... DELETE .... INSERT .... INSERT .... ROLLBACK ROLLBACK [WORK] [WORK]
SQL mimo transakční režim Každý povel samostatnou transakcí
Explicitně zahájená transakce
SQL mimo transakční režim
Chyba Transakce nebyla zahájena U Sybase místo WORK -- TRANSACTION
Transakce BEGIN BEGIN INSERT INSERT INSERT UPDATE UPDATE UPDATE DELETE DELETE DELETE COMMIT COMMIT
TRANSACTION TRANSACTION
[WORK] [WORK]
trvale v DB TRANSACTION TRANSACTION
[WORK] [WORK]
BEGIN TRANSACTION [WORK] BEGIN TRANSACTION [WORK] INSERT INSERT INSERT UPDATE UPDATE zrušeno v DB UPDATE DELETE DELETE DELETE ROLLBACK TRANSACTION [WORK] ROLLBACK TRANSACTION [WORK]
Transakce s návratovými body BEGIN BEGIN INSERT INSERT
TRANSACTION TRANSACTION ..a.. ..a..
UPDATE UPDATE SAVE SAVE
..b.. ..b.. TRANSACTION TRANSACTION
DELETE DELETE INSERT INSERT
..c.. ..c.. ..d.. ..d..
ROLLBACK ROLLBACK TO TO INSERT ..e.. ..e.. INSERT ..e.. UPDATE ..f.. UPDATE ..f.. COMMIT COMMIT
TRANSACTION TRANSACTION
trvale v DB Bod1 Bod1 zrušeno v DB Bod1 Bod1 trvale v DB [WORK] [WORK]
Transakce s návratovými body - PostgreSql
BEGIN; INSERT INTO table1 VALUES (1); SAVEPOINT my_savepoint; INSERT INTO table1 VALUES (2); ROLLBACK TO SAVEPOINT my_savepoint; INSERT INTO table1 VALUES (3); COMMIT;
Table1 ..... 1 3
Transakce dle ANSI/ISO
lze lze měnit měnit uživatelská uživatelská data data vv DB DB ÊÊ INSERT INSERT ÊÊ ÊÊ
UPDATE UPDATE DELETE DELETE
Lze (DDL) Lze měnit měnit popis popis DB DB (DDL) ÊÊ CREATE Table, CREATE Table, Domain,... Domain,... ÊÊ ÊÊ
(DML) (DML)
ALTER ALTER DROP DROP
Lze Lze měnit měnit práva práva ÊÊ GRANT GRANT ÊÊ
REVOKE REVOKE
Transakce dle ANSI/ISO - omezení v DBS strojích
nemíchat nemíchat vv transakci transakci ÊÊ změnu změnu struktury struktury DB DB (DDL) (DDL) ÊÊ
(DML) (DML)
transakce, transakce, měnící měnící strukturu strukturu DB DB (DDL) (DDL) ÊÊ
se se změnami změnami dat dat
mohou mohou obsahovat obsahovat pouze pouze jeden jeden povel povel
uu modelu modelu návratových návratových bodů bodů obvykle obvykle ÊÊ
zákaz zákaz změny změny struktury struktury DB DB vv transakci transakci
aa zas ěco akč čního ak zas nněco akčního
to nebylo vvůbec ůbec ak ční akční to bylo aaž ž transak ční transakční