Databze standardu SQL, dl 15. Patnct dl naeho serilu je z vt sti vnovn dokonen tmatu spojovn tabulek. Ve spojen je sla Nejde-li nm o lidi, ale naopak o kontakty, pijde JOE zkrtka, ale linka 3674 bude zachrnna. Budeme muset bu prohodit tabulky, nebo pout RIGHT JOIN. V obou ppadech zskme tabulku 1 s bezprizornm 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 zskme pehled o anonymnch linkch pkazem: SELECT DISTINCT TELEFON FROM KONTAKT LEFT JOIN OSOBA ON CISLO_PRAC=CISLO_P WHERE JMENO IS NULL; Posledn monost spojovn tabulek je FULL OUTER JOIN, kter neztrat nic. Rozumn analytici pouvaj typicky LEFT JOIN k realizaci relace 1 : N mezi levou a pravou entitou. Bume jet chvli nerozumn a vygenerujme tabulku 2 dotazem: SELECT * FROM OSOBA FULL OUTER JOIN KONTAKT ON CISLO_PRAC=CISLO_P; Pro procvien bude zajmav realizovat seznam vech osob s uvedenm potu kontakt. Osoby, kter se dve ztrcely, budou mt 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 mme anci realizovat seznam nespnch lid pkazem: 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 nm ti nejmn spn chybli. lo by pak jen o seznam nespnch lid, kterm to mete ct do telefonu. Dotaz do t tabulek Zvdavosti se meze nekladou. Proto se meme souasn podvat do t a vce tabulek najednou. Jsou-li tabulky spojeny relacemi, m takov pohled smysl a kad relaci odpovd jedna vazebn podmnka za WHERE. Mjme selnk TRPASLIK a selnk VLASTNOST, obsahujc typick trpasli vlastnosti. Pokud bude ve spojovac entit ZNALOST uvedena dvojice CISTRP a CISVLA jako uniktn kl, mme podchyceny drby o vlastnostech konkrtnch trpaslk. Je--li uniktn kl CIT v tabulce TRPASLIK a tabulka VLASTNOST m kl CIV, pak ji meme vypsat vechny drby o vech trpaslcch 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 uniktnosti kl CIT a CIV pochop, e sta systematicky prohledat tabulku ZNALOST a v tabulce TRPASLIK rychle vyhledat pslun JMENO, respektive v tabulce VLASTNOST jej slovn POPIS. Bohuel se ale nic nedozvme o trpaslcch, o kterch se nic nev, ani o vlastnostech, kter trpaslci jet nemaj. Pokud nm to zatm nevad, zkusme nkolik 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; Zahnzdn JOIN Je na ase zabrnit ztrtm na trpaslcch a jejich vlastnostech pouitm zahnzdnho LEFT JOIN. Sta si uvdomit, e TRPASLIK LEFT JOIN ZNALOST je informan zdroj obsahujc vechna data o trpaslcch, a jako takov jej sta spojit s tabulkou VLASTNOST. Tabulka VLASTNOST stoj vlevo od LEFT JOIN. Vpravo je pak v zvorce zahnzdn LEFT JOIN. Nepouit reference na trpaslky a na vlastnosti se pak neztrat a budou jim odpovdat jednotliv dky vsledn tabulky. Vylepen zkladn dotaz potom zn: SELECT JMENO, POPIS FROM VLASTNOST LEFT JOIN (TRPASLIK LEFT JOIN ZNALOST ON CIT=CISTRP) ON CIV=CISVLA ORDER BY JMENO, POPIS; Chytrky tak snadno zjistme: SELECT JMENO FROM VLASTNOST LEFT JOIN (TRPASLIK LEFT JOIN ZNALOST ON CIT=CISTRP) ON CIV=CISVLA WHERE POPIS="CHYTROST" ORDER BY JMENO; Nsledujc dotaz vype trpaslky, o kterch se zatm nic nev. Takov dotaz bez LEFT JOIN nen mon: SELECT JMENO FROM VLASTNOST LEFT JOIN (TRPASLIK LEFT JOIN ZNALOST ON CIT=CISTRP) ON CIV=CISVLA WHERE POPIS IS NULL ORDER BY JMENO; Pokud ns zajm pouze jejich poet, 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 kae nen tak hork... Pokud seril trv pli dlouho, mohou podle klasika nastat dv monosti. Bu roste sloitost novch pedkldanch fakt nade vechny meze nosnosti pro tene, nebo kles procento novch a souasn uitench informac a tm k sam nule. Jist jste ji pesyceni rozvinutmi monostmi pkazu SELECT z minulch dl a v tomto dle oekvte dal sloitosti, nebo ji jen opakovn znmch fakt. Dnes ns ek nov tma, kter je souasn nov, snadn, uiten, a navc navazuje na pedchoz tmata. Cht necht musme udlat velk nvrat do DDL SQL a vnovat se tm jeho partim, kter by ped rokem vyznly naprzdno. Ano, bude e o vytven, pouvn a ruen virtulnch tabulek zvanch VIEW. Velk pokuen Snad kad, komu se povedl elegantn pkaz SELECT, si ho okamit ope do poznmkovho bloku, aby se pojistil pro pt podobn situace. Technick podob "bloku" se meze nekladou. Jindy je pro ns cennj odpov na dotaz, kter nen nim jinm ne tabelrnm pehledem dat. Pkaz SELECT meme snadno doplnit o slovo INTO a nzev clov tabulky, a tak v souladu s pedchozmi dly serilu vytvome novou relnou tabulku obsahujc poadovan konkrtn hodnoty. Proto je cel ada programtor v pokuen skladovat za kadou cenu koncentrty informac v novch a novch tabulkch tak, jak mohou vzniknout po pkazech 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 mon, nen povinn a nemus bt efektivn. Pedchoz postup nezaslou nsledovn, nebo m vtinou ti nevhody. Nov tabulka PRACHAC v prv ad zabr msto na disku. Navc tabulka neobsahuje informaci o svm okamiku vzniku. V okamiku ten tabulky PRACHAC ji mohou bt bohat i jin lid a obas nkdo zeme nebo zchudne. To, e nov tabulka nen aktuln, je podstatn vada na krse. Tet nevhodu okusme pi kad aktualizaci tabulky. Nejprve ji budeme muset zruit pkazem DROP TABLE PRACHAC, pak se podvat do notesu a znovu napsat pkaz SELECT. Dost asto se projev tvrt nevhoda. Nov tabulka nemus bt v 5NF. Pedchoz pkaz tuto nevhodu nedemonstruje. Stailo by na STAV tu neaplikovat agregan funkci SUM a vynechat sti GROUP BY a HAVING. Takov tabulka neobsahuje daje o bohatch lidech, ale spe o jednotlivch stavech na neznmch tech a o jejich majitelch. Bohuel nem uniktn kl, tedy je pouze v 1NF. Pidnm sloupce CISUCTU do pkazu SELECT si mnoho nepomeme. Nov tabulka m sice uniktn kl CISUCTU a je uiten, ale je zatena zvislost mezi neklovmi sloupci RC a PRIJMENI, respektive RC a JMENO. Proto bude pouze v 2NF. Pro databzi je typick, e obsahuje pouze tabulky v 5NF a neobsahuje nadbyten data. Pro uivatele je naopak normln vidt data v lidtj podob, kter se nadbytenost a nenormalizovanost pmo pyn, nebo nzornost si d sv obti. Virtuln svt Rok 2000 se kvapem bl a modern lovk dv asto pednost virtuln realit ped tou trapn obyejnou. Na naich obrazovkch a tiskrnch bاn vdme tymstn letopoet jako soust informace o datu, kdy se nco podstatnho stalo. Nkte lid nejpozdji potkem ledna ptho roku zjist, e to byla pouze virtuln realita, kter zastela obyejnou realitu dvoucifernou. Modern virtuln doba pin mnoho novho. Proto je nebezpen rozvjet intelekt pedkolnch dtek pomoc jednoduchch hdanek typu: M to rohy, kopyta a ocas a nen to zve. Odpov je prost: virtuln zve. Pokud bych ml srozumiteln definovat pojem virtuality, neobejdu se bez naivity vyjden: VIRTULN OBJEKT X M STEJN VLASTNOSTI JAKO X, ALE NEN TO X. Pestoe bych nikomu nepl, aby se musel odprsknout virtulnm revolverem po del virtuln symbize s virtuln arodjnic, budu naopak velmi propagovat pouvn virtulnch tabulek msto tch normlnch. Virtuln tabulka z pohledu uivatele i jazyka SQL vypad jako klasick tabulka, ale nen to ona. Pro ns je podstatn, e vytven, pouvn a ruen virtulnch tabulek je jednoduchou zleitost. Zptky k DDL DDL-Data Definition Language jako soust SQL umouje vytven a ruen virtulnch tabulek. Ty jsou anglicky oznaovny jako VIEW, co esky neznamen nic jinho, ne pohled na nco i do n؟eho. Jaromr Kukal