|
|
Spojenφ relacφ
Na vojn∞ se v₧dycky °φkßvalo - bez spojenφ nenφ velenφ. Ve sv∞t∞ databßzφ bychom mohli °φkat, ₧e bez spojenφ nenφ relaΦnφ databßze. Je to pravda. Listovßnφ v jednotliv²ch tabulkßch je sice n∞kdy u₧iteΦnΘ, ale rozumnß sφla relaΦnφch jazyk∙ se zaΦne projevovat a₧ od mo₧nostφ spojovßnφ relacφ. P°ipome≥me si op∞t schΘmata relacφ FILM(JM╔NO_F, REÄIS╔R), popisujφcφ data o filmech a jejich re₧isΘrech, a P╪EDSTAVEN═(N┴ZEV_K, JM╔NO_F), pro data o kinech hrajφcφch filmy. Coddova relaΦnφ algebra nabφzφ operaci p°irozenΘ spojenφ, znaΦφ se tradiΦn∞ * , kterß, aplikovßna na danΘ relace vytvo°φ relaci se schΘmatem N┴ZEV_K, JM╔NO_F, REÄIS╔R. ╪ßdky tΘto novΘ relace, °ekn∞me T, vzniknou spojenφm °ßdk∙ aktußlnφ relace FILM s °ßdky aktußlnφ relace P╪EDSTAVEN═ p°es spoleΦnΘ hodnoty atributu JM╔NO_F (viz obr. 1). FILM JM╔NO_F REÄIS╔R P╪EDSTAVEN═ N┴ZEV_K JM╔NO_F Karla MßÜa Prßce Karla Matka Mencl Prßce BabiΦka BabiΦka Pr∙cha Mφr BabiΦka Obr. 1 Relace FILM a P╪EDSTAVEN═ Relace T danß v²razem FILM * P╪EDSTAVEN═ je na obrßzku 2. T N┴ZEV_K JM╔NO_F REÄIS╔R Prßce Karla MßÜa Prßce BabiΦka Pr∙cha Mφr BabiΦka Pr∙cha Obr. 2 V²sledek spojenφ Princip je z°ejm². Spojuje se, co lze. Nap°. dvojice (Matka, Mencl) se spojenφ ne·Φastnφ, proto₧e film Matka zrovna nikde nedßvajφ. Tento typ spojenφ se naz²vß p°irozenΘ proto, ₧e spojuje p°es mno₧inu atribut∙, kterΘ se vyskytujφ v obou relacφch. Zde Ülo o jedin² atribut - JM╔NO_F. Vedle tohoto spojenφ obsahuje relaΦnφ algebra dalÜφ u₧iteΦnß spojenφ, jako je = - spojenφ, £ - spojenφ apod., tj. spojenφ p°es podmφnku. V nich se ovÜem musφ °φci, pro kterΘ atributy se spojovacφ podmφnka danß porovnßvacφm operßtorem v nßzvu spojenφ uplatnφ. Formßln∞ m∙₧eme takovß spojenφ oznaΦovat nap°. R [ A£ B] S, existujφ-li t°eba relace R(B,A), S(A,G,H). V²sledkem je ovÜem relace, kde se atribut A vyskytuje dvakrßt, narozdφl od p°irozenΘho spojenφ, kde se jeden ze spoleΦn²ch atribut∙ eliminoval. Dva v²skyty atributu vÜak podle definice relaΦnφho databßzovΘho modelu nejsou povoleny, tak₧e bychom si jeÜt∞ museli vypomoci p°ejmenovßnφm atribut∙ ve v²sledku. Jak se ke spojenφ relacφ stavφ SQL? Pozor, je t°eba si uv∞domit, kterΘ SQL. Tak nejprve klasickΘ SQL89, tj. standard z roku 1989. P°irozenΘ spojenφ v n∞m nemß odpovφdajφcφ konstrukt. Je nutnΘ si vypomoci = - spojenφm a vhodnou projekcφ atribut∙ do v²sledku. Dotaz pro zφskßnφ relace T na obrßzku 2 by se musel zapsat nap°. nßsledovn∞: SELECT P╪EDSTAVEN═ * , FILM.REÄIS╔R FROM FILM, P╪EDSTAVEN═ WHERE FILM.JM╔NO_F = P╪EDSTAVEN═.JM╔NO_F; Tφmto zp∙sobem lze zapsat i vφcenßsobnΘ spojenφ, kdy se spojujφ obecn∞ vφce ne₧ 2 relace. ╚φm vφce relacφ, tφm vφce spojovacφch podmφnek za WHERE. SQL92, tj. standard z roku 1992, nabφzφ u₧ivateli jazyka SQL, co se spojenφ t²Φe, mnohem v∞tÜφ mo₧nosti. Pat°φ sem vedle ji₧ uvedenΘ mo₧nosti ôstarΘho styluö:
P°irozenΘ spojenφ FILM * P╪EDSTAVEN═ se v SQL92 zapφÜe takto: SELECT * FROM FILM NATURAL JOIN P╪EDSTAVEN═; Spojenφ k°φ₧em je pouze syntaktickΘ rozÜφ°enφ mo₧nosti vytvo°it kartΘzsk² souΦin dvou relacφ ve starΘm SQL. Toho se dalo docφlit pro relace R a S takto: SELECT * FROM R, S; V SQL92 je mo₧nΘ pou₧φt explicitnφ pojmenovßnφ tohoto druhu spojenφ (kartΘzsk² souΦin se chßpe jako p°φpad, kdy se spojuje ka₧d² °ßdek z R s ka₧d²m z S), tj. SELECT * FROM R CROSS JOIN S; Spojenφ p°es podmφnku je op∞t modifikacφ v²raziva starΘho SQL, kdy se za WHERE dalo zapsat p°es co se spojuje. Po vzoru p°edchozφch nov²ch konstrukt∙, podmφnka se st∞huje za FROM s odd∞lovaΦem ON. Spojenφ R [ A£ B] S pak mß v SQL tvar SELECT * FROM R JOIN S ON A£ B; Zd∙razn∞me, ₧e takov²ch spojenφ lze za FROM napsat vφce, p°iΦem₧ za WHERE lze psßt dalÜφ podmφnky t²kajφcφ se vÜech atribut∙, kterΘ tvo°φ relaci vzniklou spojenφm. Zdß se, ₧e tendence je odd∞lit pro u₧ivatele fßzi spojenφ a fßzi selekce. Tyto fßze nebyly v p∙vodnφm SQL rozliÜovßny - vÜe vymezujφcφ data jdoucφ na v²stup se objevovalo za WHERE. P°ipome≥me vÜak, ₧e skuteΦnΘ vyhodnocenφ takov²ch dotaz∙ je samoz°ejm∞ optimalizovßno, tj. nenφ pravda, ₧e by se obecn∞ d∞lalo spojenφ d°φve ne₧ selekce za WHERE. Spojenφ p°es vyjmenovanΘ sloupce rozÜi°uje mo₧nosti p°irozenΘho spojenφ. Uva₧ujme relace U(X, Z, Y, P) a V(Z,Y,P,Q). P°irozen²m spojenφm bychom spojovali p°es vÜechny spoleΦnΘ atributy, tj. Z,Y,P. Je-li po₧adavkem spojenφ pouze p°es Z a Y, pak v SQL92 m∙₧eme psßt SELECT * FROM U JOIN V USING (Z, Y); Uvedenß spojenφ se naz²vajφ vnit°nφ spojenφ (inner join). Dokonce lze i psßt INNER NATURAL JOIN nebo INNER JOIN. OznaΦenφ se zavßdφ proto, aby by se systematicky tato spojenφ odliÜila o vn∞jÜφch spojenφ (outer joins). Tato spojenφ slou₧φ k p°idßvßnφ n∞kter²ch °ßdk∙, kterΘ se s niΦφm nespojily, do v²sledku. Zb²vajφcφ atributy v takov²ch °ßdcφch majφ p°i°azenu prßzdnou hodnotu NULL. Spojovat lze op∞t p°irozen∞ nebo s ON. Podle oznaΦenφ LEFT, RIGHT a FULL se p°idßvß z levΘho, resp. pravΘho, resp. z obou operand∙ spojenφ. NapφÜeme-li tedy SELECT * FROM P╪EDSTAVEN═ NATURAL RIGHT OUTER JOIN FILM; obdr₧φme tabulku T N┴ZEV_K JM╔NO_F REÄIS╔R Prßce Karla MßÜa Prßce BabiΦka Pr∙cha Mφr BabiΦka Pr∙cha NULL Matka Mencl Obr. 3 V²sledek levΘho vn∞jÜφho spojenφ Op∞t lze za FROM psßt vφce vn∞jÜφch spojenφ. OvÜem pozor! Vn∞jÜφ spojenφ je nebezpeΦnΘ, proto₧e nenφ asociativnφ, tj. dv∞ r∙znß po°adφ n∞kolika takto spojovan²ch tabulek m∙₧e vΘst k r∙zn²m v²sledk∙m. Poslednφm typem spojenφ je spojenφ sjednocenφm (union join). P°ipomφnß FULL OUTER JOIN a₧ na to, ₧e se v n∞m nespojφ ₧ßdnΘ °ßdky. Ka₧d² °ßdek z levΘho, resp. pravΘho operandu je ve v²sledku dopln∞n zprava, resp. zleva hodnotou NULL. Zßpis v SQL92 je SELECT * FROM U UNION JOIN V; ╪ada Φtenß°∙, u₧ivatel∙ r∙zn²ch SQL server∙, rozpoznß, ₧e n∞kterß spojenφ znß. Nap°. OUTER JOIN se v n∞kter²ch relaΦnφch S╪BD vyskytuje. Bohu₧el ale s jinou syntaxφ. Zdß se, ₧e n∞kdy zbyteΦn² sp∞ch ve v²voji m∙₧e znamenat krok zpßtky, anebo alespo≥ stranou. Takov²ch p°φklad∙ ovÜem SQL92 (a ji₧ znßmß koncepce zvanß zatφm SQL3) poskytuje mnoho.
<seznam dφl∙ serißlu> <COMPUTERWORLD> |