Patnáct∞ díl naτeho seriálu je z v╪tτí ƒásti v╪nován dokonƒení tématu spojování tabulek.
Ve spojení je síla
Nejde-li nám o lidi, ale naopak o kontakty, p²ijde JOE zkrátka, ale linka 3674 bude zachrán╪na. Budeme muset bu╘ prohodit tabulky, nebo pouºít RIGHT JOIN. V obou p²ípadech získáme tabulku 1 s bezprizorním telefonem:
SELECT * FROM KONTAKT
LEFT JOIN OSOBA
ON CISLO_PRAC=CISLO_P;
SELECT * FROM OSOBA
RIGHT JOIN KONTAKT
ON CISLO_PRAC=CISLO_P;
Pak snadno získáme p²ehled o anonymních linkách p²íkazem:
SELECT DISTINCT TELEFON
FROM KONTAKT LEFT JOIN OSOBA
ON CISLO_PRAC=CISLO_P
WHERE JMENO IS NULL;
Poslední moºností spojování tabulek je FULL OUTER JOIN, kter∞ neztratí nic. Rozumní analytici pouºívají typicky LEFT JOIN k realizaci relace 1 : N mezi levou a pravou entitou. Bu╘me jeτt╪ chvíli nerozumní a vygenerujme tabulku 2 dotazem:
SELECT * FROM OSOBA
FULL OUTER JOIN KONTAKT
ON CISLO_PRAC=CISLO_P;
Pro procviƒení bude zajímavé realizovat seznam vτech osob s uvedením poƒtu kontaktà. Osoby, které se d²íve ztrácely, budou mít vedle sebe ƒíslo nula:
SELECT CISLO_P, JMENO,
COUNT(TELEFON) POCET
FROM OSOBA LEFT JOIN KONTAKT
ON CISLO_PRAC=CISLO_P
GROUP BY CISLO_P
ORDER BY JMENO, CISLO_P;
Teprve te╘ máme τanci realizovat seznam neúsp╪τn∞ch lidí p²íkazem:
SELECT CISLO_P, JMENO,
COUNT(TELEFON) POCET
FROM OSOBA LEFT JOIN KONTAKT
ON CISLO_PRAC=CISLO_P
GROUP BY CISLO_P
HAVING COUNT(TELEFON)<=2
ORDER BY CISLO_P;
Bez LEFT JOIN by nám ti nejmén╪ úsp╪τní chyb╪li. µlo by pak jen o seznam neúsp╪τn∞ch lidí, kter∞m to màºete ²íct do telefonu.
Dotaz do t²í tabulek
Zv╪davosti se meze nekladou. Proto se màºeme souƒasn╪ podívat do t²í a více tabulek najednou. Jsou-li tabulky spojeny relacemi, má takov∞ pohled smysl a kaºdé relaci odpovídá jedna vazební podmínka za WHERE. M╪jme ƒíselník TRPASLIK a ƒíselník VLASTNOST, obsahující typické trpasliƒí vlastnosti. Pokud bude ve spojovací entit╪ ZNALOST uvedena dvojice CISTRP a CISVLA jako unikátní klíƒ, máme podchyceny drby o vlastnostech konkrétních trpaslíkà. Je--li unikátní klíƒ CIT v tabulce TRPASLIK a tabulka VLASTNOST má klíƒ CIV, pak jiº màºeme vypsat vτechny drby o vτech trpaslících pomocí dotazu:
SELECT JMENO, POPIS
FROM TRPASLIK, VLASTNOST,
ZNALOST
WHERE CIT=CISTRP
AND CIV=CISVLA
ORDER BY JMENO, POPIS;
SQL server je natolik inteligentní, ºe z unikátnosti klíƒà CIT a CIV pochopí, ºe staƒí systematicky prohledat tabulku ZNALOST a v tabulce TRPASLIK rychle vyhledat p²ísluτné JMENO, respektive v tabulce VLASTNOST její slovní POPIS. Bohuºel se ale nic nedozvíme o trpaslících, o kter∞ch se nic neví, ani o vlastnostech, které trpaslíci jeτt╪ nemají. Pokud nám to zatím nevadí, zkusme n╪kolik SQL dotazà:
SELECT DISTINCT JMENO
FROM TRPASLIK, VLASTNOST,
ZNALOST
WHERE CIT=CISTRP
AND CIV=CISVLA
AND POPIS IN ("LENOST","DRZOST")
ORDER BY JMENO;
SELECT POPIS
FROM TRPASLIK, VLASTNOST,
ZNALOST
WHERE CIT=CISTRP
AND CIV=CISVLA
AND JMENO="BRUMLA"
ORDER BY POPIS;
SELECT JMENO, COUNT(POPIS)
POCET_VLASTNOSTI
FROM TRPASLIK, VLASTNOST,
ZNALOST
WHERE CIT=CISTRP
AND CIV=CISVLA
GROUP BY JMENO
ORDER BY JMENO;
SELECT POPIS, COUNT(JMENO)
POCET_TRPASLIKU
FROM TRPASLIK, VLASTNOST,
ZNALOST
WHERE CIT=CISTRP
AND CIV=CISVLA
GROUP BY POPIS
ORDER BY POPIS;
Zahnízd╪n∞ JOIN
Je na ƒase zabránit ztrátám na trpaslících a jejich vlastnostech pouºitím zahnízd╪ného LEFT JOIN. Staƒí si uv╪domit, ºe TRPASLIK LEFT JOIN ZNALOST je informaƒní zdroj obsahující vτechna data o trpaslících, a jako takov∞ jej staƒí spojit s tabulkou VLASTNOST. Tabulka VLASTNOST stojí vlevo od LEFT JOIN. Vpravo je pak v závorce zahnízd╪n∞ LEFT JOIN. Nepouºité reference na trpaslíky a na vlastnosti se pak neztratí a budou jim odpovídat jednotlivé ²ádky v∞sledné tabulky. Vylepτen∞ základní dotaz potom zní:
SELECT JMENO, POPIS
FROM VLASTNOST LEFT JOIN
(TRPASLIK LEFT JOIN ZNALOST ON CIT=CISTRP) ON CIV=CISVLA
ORDER BY JMENO, POPIS;
Chytráky také snadno zjistíme:
SELECT JMENO FROM VLASTNOST LEFT JOIN
(TRPASLIK LEFT JOIN ZNALOST ON CIT=CISTRP) ON CIV=CISVLA
WHERE POPIS="CHYTROST"
ORDER BY JMENO;
Následující dotaz vypíτe trpaslíky, o kter∞ch se zatím nic neví. Takov∞ dotaz bez LEFT JOIN není moºn∞:
SELECT JMENO FROM VLASTNOST LEFT JOIN
(TRPASLIK LEFT JOIN ZNALOST ON CIT=CISTRP) ON CIV=CISVLA
WHERE POPIS IS NULL
ORDER BY JMENO;
Pokud nás zajímá pouze jejich poƒet, staƒí napsat:
SELECT COUNT(JMENO) NEZNAMY FROM VLASTNOST LEFT JOIN
(TRPASLIK LEFT JOIN ZNALOST ON CIT=CISTRP) ON CIV=CISVLA
WHERE POPIS IS NULL;
Θleva zvaná VIEW
ªádná kaτe není tak horká...
Pokud seriál trvá p²íliτ dlouho, mohou podle klasika nastat dv╪ moºnosti. Bu╘ roste sloºitost nov∞ch p²edkládan∞ch fakt nade vτechny meze únosnosti pro ƒtená²e, nebo klesá procento nov∞ch a souƒasn╪ uºiteƒn∞ch informací aº tém╪² k samé nule. Jist╪ jste jiº p²esyceni rozvinut∞mi moºnostmi p²íkazu SELECT z minul∞ch dílà a v tomto díle oƒekáváte dalτí sloºitosti, nebo jiº jen opakování znám∞ch fakt. Dnes nás ƒeká nové téma, které je souƒasn╪ nové, snadné, uºiteƒné, a navíc navazuje na p²edchozí témata. Cht╪ necht╪ musíme ud╪lat velk∞ návrat do DDL SQL a v╪novat se t╪m jeho partiím, které by p²ed rokem vyzn╪ly naprázdno. Ano, bude ²eƒ o vytvá²ení, pouºívání a ruτení virtuálních tabulek zvan∞ch VIEW.
Velké pokuτení
Snad kaºd∞, komu se povedl elegantní p²íkaz SELECT, si ho okamºit╪ opíτe do poznámkového bloku, aby se pojistil pro p²íτtí podobné situace. Technické podob╪ "bloku" se meze nekladou. Jindy je pro nás cenn╪jτí odpov╪╘ na dotaz, která není niƒím jin∞m neº tabelárním p²ehledem dat. P²íkaz SELECT màºeme snadno doplnit o slovo INTO a název cílové tabulky, a tak v souladu s p²edchozími díly seriálu vytvo²íme novou reálnou tabulku obsahující poºadované konkrétní hodnoty. Proto je celá ²ada programátorà v pokuτení skladovat za kaºdou cenu koncentráty informací v nov∞ch a nov∞ch tabulkách tak, jak mohou vzniknout po p²íkazech typu:
SELECT RC, PRIJMENI, JMENO,
SUM(STAV)
INTO PRACHAC FROM CLOVEK, UCET
WHERE CLOVEK.RC=UCET.RC
GROUP BY CLOVEK.RC
HAVING SUM(STAV)>1000000
ORDER BY PRIJMENI, JMENO, RC;
Co je moºné, není povinné a nemusí b∞t efektivní. P²edchozí postup nezaslouºí následování, nebo£ má v╪tτinou t²i nev∞hody. Nová tabulka PRACHAC v prvé ²ad╪ zabírá místo na disku. Navíc tabulka neobsahuje informaci o svém okamºiku vzniku. V okamºiku ƒtení tabulky PRACHAC jiº mohou b∞t bohatí i jiní lidé a obƒas n╪kdo zem²e nebo zchudne. To, ºe nová tabulka není aktuální, je podstatná vada na kráse. T²etí nev∞hodu okusíme p²i kaºdé aktualizaci tabulky. Nejprve ji budeme muset zruτit p²íkazem DROP TABLE PRACHAC, pak se podívat do notesu a znovu napsat p²íkaz SELECT. Dost ƒasto se projeví ƒtvrtá nev∞hoda. Nová tabulka nemusí b∞t v 5NF. P²edchozí p²íkaz tuto nev∞hodu nedemonstruje. Staƒilo by na STAV úƒtu neaplikovat agregaƒní funkci SUM a vynechat ƒásti GROUP BY a HAVING. Taková tabulka neobsahuje údaje o bohat∞ch lidech, ale spíτe o jednotliv∞ch stavech na neznám∞ch úƒtech a o jejich majitelích. Bohuºel nemá unikátní klíƒ, tedy je pouze v 1NF. P²idáním sloupce CISUCTU do p²íkazu SELECT si mnoho nepomàºeme. Nová tabulka má sice unikátní klíƒ CISUCTU a je uºiteƒná, ale je zatíºena závislostí mezi neklíƒov∞mi sloupci RC a PRIJMENI, respektive RC a JMENO. Proto bude pouze v 2NF. Pro databázi je typické, ºe obsahuje pouze tabulky v 5NF a neobsahuje nadbyteƒná data. Pro uºivatele je naopak normální vid╪t data v lidτt╪jτí podob╪, která se nadbyteƒností a nenormalizovaností p²ímo pyτní, nebo£ názornost si ºádá své ob╪ti.
Virtuální sv╪t
Rok 2000 se kvapem blíºí a moderní ƒlov╪k dává ƒasto p²ednost virtuální realit╪ p²ed tou trapn╪ obyƒejnou. Na naτich obrazovkách a tiskárnách b╪ºn╪ vídáme ƒty²místn∞ letopoƒet jako souƒást informace o datu, kdy se n╪co podstatného stalo. N╪kte²í lidé nejpozd╪ji poƒátkem ledna p²íτtího roku zjistí, ºe to byla pouze virtuální realita, která zast²ela obyƒejnou realitu dvoucifernou. Moderní virtuální doba p²ináτí mnoho nového. Proto je nebezpeƒné rozvíjet intelekt p²edτkolních dítek pomocí jednoduch∞ch hádanek typu: Má to rohy, kopyta a ocas a není to zví²e. Odpov╪╘ je prostá: virtuální zví²e. Pokud bych m╪l srozumiteln╪ definovat pojem virtuality, neobejdu se bez naivity vyjád²ení:
VIRTU╡LN╓ OBJEKT X M╡ STEJNÉ VLASTNOSTI JAKO X, ALE NEN╓ TO X.
P²estoºe bych nikomu nep²ál, aby se musel odprásknout virtuálním revolverem po delτí virtuální symbióze s virtuální ƒarod╪jnicí, budu naopak velmi propagovat pouºívání virtuálních tabulek místo t╪ch normálních. Virtuální tabulka z pohledu uºivatele i jazyka SQL vypadá jako klasická tabulka, ale není to ona. Pro nás je podstatné, ºe vytvá²ení, pouºívání a ruτení virtuálních tabulek je jednoduchou záleºitostí.
Zpátky k DDL
DDL-Data Definition Language jako souƒást SQL umoºσuje vytvá²ení a ruτení virtuálních tabulek. Ty jsou anglicky oznaƒovány jako VIEW, coº ƒesky neznamená nic jiného, neº pohled na n╪co ƒi do n╪ƒeho.