home *** CD-ROM | disk | FTP | other *** search
/ Chip 1999 October / Chip_1999-10_cd.bin / obsahy / Chip_txt / TXT / 164.txt < prev    next >
Text File  |  1999-08-30  |  9KB  |  173 lines

  1. Databáze standardu SQL, díl 16.
  2. Jedeme dál! Hlavním tématem dalτího pokraƒování naτeho seriálu jsou virtuální tabulky.
  3.  
  4. Zpátky k DDL 
  5.  
  6. 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. Virtuální tabulka je totiº jenom pohledem do jiné tabulky nebo tabulek. Zatímco klasická tabulka CLOVEK je vytvá²ena p²íkazem CREATE TABLE CLOVEK s uveden∞m seznamem sloupcà, je virtuální tabulka PRACHAC vytvá²ena z uº existující tabulky CLOVEK pomocí p²íkazu CREATE VIEW PRACHAC, uvnit² kterého je uveden vhodn∞ p²íkaz SELECT. V naτem konkrétním p²ípad╪ bude vhodné pojmenovat i sloupce nov╪ vzniklé virtuální tabulky. Tak dostaneme p²íkaz pro její vytvo²ení:
  7.  
  8. CREATE VIEW PRACHAC(RODNE, 
  9. PRIJMENI, JMENO, JMENI)
  10. AS
  11. SELECT RC, PRIJMENI, JMENO, 
  12. SUM(STAV) INTO PRACHAC 
  13. FROM CLOVEK, UCET
  14. WHERE CLOVEK.RC=UCET.RC
  15. GROUP BY CLOVEK.RC
  16. HAVING SUM(STAV)>1000000;
  17.  
  18. Pokud v okamºiku formulace dotazu existovaly tabulky CLOVEK a UCET a neexistovala tabulka PRACHAC, vznikne virtuální tabulka PRACHAC bez problémà. V ostatních p²ípadech virtuální tabulka nevznikne. Pokud dojde ke zm╪nám v obsahu tabulek CLOVEK nebo UCET, okamºit╪ se promítnou do virtuální tabulky PRACHAC, do které lze nahlédnout jako do kaºdé jiné jedním z následujících p²íkazà:
  19.  
  20. SELECT * FROM PRACHAC 
  21. ORDER BY PRIJMENI,JMENO,RODNE;
  22.  
  23. SELECT * FROM PRACHAC 
  24. ORDER BY JMENI DESC, PRIJMENI, JMENO, RODNE;
  25. SELECT * FROM PRACHAC 
  26. WHERE JMENI>100000000;
  27.  
  28. SELECT PRIJMENI, MAX(JMENI) 
  29. FROM PRACHAC 
  30. GROUP BY PRIJMENI;
  31.  
  32. Nyní je z²ejmé, ºe vytvo²ení VIEW se vyplatilo a ºe pouºívání ORDER BY uvnit² VIEW není k niƒemu. Pro úplnost je uveden obecn∞ tvar p²íkazu pro vytvo²ení virtuální tabulky:
  33.  
  34. CREATE VIEW název virtuální tabulky (seznam názvà sloupcà)
  35. AS
  36. SELECT seznam v∞razà
  37. FROM seznam tabulek
  38. WHERE logick∞ v∞raz
  39. GROUP BY seznam sloupcà 
  40. HAVING logick∞ v∞raz;
  41.  
  42. Je nutné respektovat následující omezení p²íkazu CREATE VIEW:
  43. - Nesmí obsahovat ORDER BY.
  44. - Nesmí obsahovat 
  45.   HAVING bez GROUP BY.
  46. - Seznam v∞razà projekce musí mít stej-
  47.   n∞ poƒet ƒlenà jako seznam názvà 
  48.   sloupcà.
  49. - Seznam názvà sloupcà je nepovinn∞.
  50.  
  51. Virtuální tabulka vznikne, je-li vnit²ní p²íkaz SELECT platn∞ a je p²ipravena pro ƒtení jin∞m p²íkazem SELECT. Virtuální tabulka se màºe odkazovat na jiné tabulky vƒetn╪ virtuálních tabulek. Odkazování virtuální tabulky na sebe samu není moºné. Pokud budeme chtít virtualitu nové tabulky brát doslova a budeme ji chtít aktualizovat pomocí INSERT, UPDATE nebo DELETE, musíme se pon╪kud uskrovnit a p²ijmout dalτí omezení. P²i popisu projekce nesmí obsahovat v∞razy GROUP BY, DISTINCT, více neº jednu tabulku za FROM, JOIN ani zahnízd╪n∞ dotaz. Pozornému ƒtená²i jist╪ neuτlo, ºe v zájmu absolutní virtuality p²iτel tém╪² o vτechny vymoºenosti p²íkazu SELECT. Zdrav∞ rozum velí naopak zapomenout na absolutní virtualitu a v╪novat se naplno vymoºenostem virtuálních tabulek urƒen∞ch jenom pro ƒtení. Koneƒn╪ tak máme k dispozici nástroj k virtuálnímu, ale trvalému spojování n╪kolika tabulek v jeden celek. Te╘ bude velmi snadné dívat se na reálná data v n╪kolika tabulkách a zároveσ nemít ºádnou zbyteƒnou práci. Nad klasick∞mi tabulkami tak màºeme vytvo²it i n╪kolik hierarchick∞ch vrstev virtuálních tabulek, které pomohou p²ísn╪ strukturovan∞ sv╪t fyzicky uloºen∞ch dat odd╪lit od sv╪ta lidí a jejich klientsk∞ch aplikací. To slouºí nejen k usnadn╪ní ƒtení dat, ale mnohdy t麠k utajení základních datov∞ch struktur p²ed konkurencí. Virtuální tabulka je velmi k²ehk∞m objektem, kter∞ relativn╪ snadno zaniká. Klasickou cestou ke zruτení naτí virtuální tabulky PRACHAC je pouºití p²íkazu
  52.  
  53. DROP VIEW PRACHAC;
  54.  
  55. Virtuální tabulka PRACHAC zanikne, zruτíme-li n╪kterou z tabulek CLOVEK, UCET nebo n╪kter∞ z pouºívan∞ch sloupcà t╪chto tabulek nap²íklad pomocí p²íkazà
  56.  
  57. DROP TABLE CLOVEK;
  58. DROP TABLE UCET;
  59. ALTER TABLE CLOVEK 
  60. DROP COLUMN RC;
  61. ALTER TABLE UCET 
  62. DROP COLUMN STAV;
  63.  
  64. To je první a poslední p²ípad, kdy si v SQL vznikl∞ objekt nechrání své zdroje p²ed zniƒením a rad╪ji zruτí sám sebe. Porovnejte to nap²íklad s vytvá²ením, uºitím a ruτením indexà, které si svoji tabulku dàsledn╪ hlídají. Pouºijeme-li p²íkazy
  65.  
  66. DELETE FROM CLOVEK;
  67. DELETE FROM UCET;
  68.  
  69. bude to patrn╪ velká ztráta informací o lidech a úƒtech, ale virtuální tabulka PRACHAC to p²eºije ve zdraví a kdykoli bude p²ipravena zobrazit kaºdého milioná²e, kter∞ bude znovu zadán do prázdn∞ch tabulek CLOVEK a UCET. 
  70. Virtualita se vyplatí
  71. M╪jme tabulku CLOVEK se sloupci RC, JMENO, PRIJMENI a tabulku KONTAKT se sloupci RC, TYP a SPOJENI. Mezi tabulkami existuje relace zprost²edkovaná rodn∞m ƒíslem RC, která je typu N : 1 a má název KONTAKT NA CLOVEKA. Sloupec TYP p²edstavuje typ kontaktu jako TELEFON, FAX, EMAIL a podobn╪, zatímco sloupec SPOJENI obsahuje konkrétní hodnotu telefonního ƒísla, ƒísla faxu ƒi poƒítaƒovou adresu. Pokud jsou ob╪ tabulky zapln╪ny bezrozporn∞mi daty, máme motivaci k vytvo²ení celé ²ady virtuálních tabulek. P²edevτím nás bude zajímat seznam lidí a p²ísluτn∞ch spojení:
  72.  
  73. CREATE VIEW CLOVICEK(RC, JMENO, PRIJMENI, TYP, SPOJENI)
  74. AS
  75. SELECT CLOVEK.RC, JMENO, 
  76. PRIJMENI, TYP, SPOJENI
  77. FROM CLOVEK LEFT JOIN KONTAKT 
  78. ON CLOVEK.RC=KONTAKT.RC;
  79.  
  80. Od tohoto okamºiku je zbyteƒné ƒíst data p²ímo z pàvodních tabulek. Nevadí, ºe tabulka CLOVICEK je virtuální. Màºeme z ní vytvo²it telefonní seznam p²íkazem: 
  81.  
  82. CREATE VIEW TELEFON(RC, JMENO, PRIJMENI, TEL)
  83. AS
  84. SELECT RC, JMENO, PRIJMENI, 
  85. SPOJENI FROM CLOVICEK
  86. WHERE TYP="TELEFON";
  87.  
  88. Virtuální tabulka TELEFON umoºní zobrazení telefonního seznamu p²íkazem
  89.  
  90. SELECT * FROM TELEFON ORDER BY PRIJMENI, JMENO, RC, TEL;
  91.  
  92. Uº jist╪ víte, jak vytvo²it VIEW vτech faxov∞ch kontaktà, vτech e-mailov∞ch kontaktà nebo seznam vτech lidí, na které není ºádn∞ kontakt. P²edstavte si, ºe chcete v rámci marketingové akce zavolat vτem lidem, na které existuje alespoσ jeden telefonní kontakt a kte²í jeτt╪ nemají internetovou adresu. Na to staƒí vytvo²it virtuální tabulku AKCE:
  93.  
  94. CREATE VIEW AKCE(PRIJMENI, JMENO, RC, TEL)
  95. AS 
  96. SELECT PRIJMENI, JMENO, RC, 
  97. SPOJENI FROM CLOVICEK
  98. WHERE TYP="TELEFON" 
  99. AND RC NOT IN
  100. (SELECT DISTINCT RC FROM 
  101. CLOVICEK WHERE TYP="EMAIL");
  102.  
  103. Kdykoli se pak lze zeptat, kter∞m klientàm máme nabízet sluºbu:
  104.  
  105. SELECT * FROM AKCE ORDER BY 
  106. PRIJMENI, JMENO, RC, TEL;
  107.  
  108. Pokud tvàrce databázového systému vhodn╪ navrhne tabulky, relace mezi nimi, a nad tím vτím vybuduje racionáln╪ systém virtuálních tabulek, je vτe p²ipraveno k formulaci jednoduch∞ch klientsk∞ch dotazà SELECT do jednotliv∞ch virtuálních tabulek s jednoduchou podmínkou za WHERE a definovan∞m t²íd╪ním pomocí ORDER BY. Tvàrce aplikace pak ani nemusí tuτit, jak dokonalého systému se vlastn╪ ptá. P²iberme si do naτeho minisystému jeτt╪ dalτí dv╪ tabulky. T²etí tabulka UCET bude mít jako kl탠CISUCTU a navíc jeτt╪ dva sloupce RC a STAV, kde RC je rodné ƒíslo majitele úƒtu a STAV je okamºit∞ stav úƒtu v korunách. Obƒas majitel úƒtu dovolí jin∞m lidem, aby z n╪j také sm╪li vybírat peníze. Tento jev je popsán tabulkou PRAVO se sloºen∞m klíƒem, tvo²en∞m sloupci CISUCTU a RC. Zároveσ p²ibylo n╪kolik relací N : 1 mezi tabulkami. Jde o relace UCET VLASTNI OSOBA, PRAVO PRO OSOBU a PRAVO NA UCET. Te╘ je t²eba nové tabulky pokr∞t uºiteƒn∞m systémem virtuálních tabulek. P²edevτím bude uºiteƒné vytvo²it virtuální tabulku lidí a jejich úƒtà:
  109.  
  110. CREATE VIEW CLOVEK_S_UCTY
  111. (PRIJMENI, JMENO, RC, UCET, STAV ) 
  112. AS
  113. SELECT PRIJMENI, JMENO,
  114. CLOVEK.RC, CISUCTU, STAV
  115. FROM CLOVEK LEFT JOIN UCET 
  116. ON CLOVEK.RC=UCET.RC;
  117.  
  118. Pro vytipování nebo odstran╪ní lidí, kte²í nemají vlastní úƒet, budou pot²ebné dalτí dv╪ virtuální tabulky. Navíc uτet²íme na p²ejmenovávání sloupcà:
  119.  
  120. CREATE VIEW IGNORANT_BANK
  121. AS
  122. SELECT PRIJMENI, JMENO, RC 
  123. FROM CLOVEK_S_UCTY
  124. WHERE UCET IS NULL; 
  125. CREATE VIEW MAJITEL_UCTU
  126. AS
  127. SELECT PRIJMENI, JMENO, RC,
  128. UCET, STAV FROM CLOVEK_S_UCTY
  129. WHERE UCET IS NOT NULL; 
  130.  
  131. Souhrnné údaje mají mnohdy v╪tτí cenu neº podrobné v∞pisy, a tak máme o dàvod víc k tomu, abychom pokraƒovali v návrhu dalτí virtuální tabulky:
  132.  
  133. CREATE VIEW MAJITEL(PRIJMENI, JMENO, RC, CELKEM)
  134. AS
  135. SELECT PRIJMENI, JMENO, RC, 
  136. SUM(STAV) FROM MAJITEL_UCTU
  137. GROUP BY RC; 
  138.  
  139. Nenechaví lidé poƒítají do svého jm╪ní i stavy na úƒtech, na které mají právo v∞b╪ru, coº vyºaduje rafinovan╪jτí virtuální tabulku nad tabulkami CLOVEK, UCET a PRAVO:
  140.  
  141. CREATE VIEW NAROK(PRIJMENI,
  142. JMENO, RC, MAJITEL, UCET, STAV)
  143. AS
  144. SELECT PRIJMENI, JMENO, 
  145. CLOVEK.RC, CLOVEK.RC=UCET.RC,
  146. CISUCTU, STAV
  147. FROM CLOVEK, UCET, PRAVO 
  148. WHERE CLOVEK.RC=UCET.RC OR
  149. CLOVEK.RC=PRAVO.RC AND 
  150. PRAVO.CISUCTU=UCET.CISUCTU;
  151.  
  152. V∞raz CLOVEK.RC=UCET.RC je p²ejmenován na sloupec MAJITEL, kter∞ má pak logickou hodnotu YES, nebo NO, podle toho, zda je dan∞ ƒlov╪k majitelem úƒtu, nebo má na n╪j jenom právo v∞b╪ru. Celkov∞ sumarizovan∞ pohled do dat:
  153.  
  154. CREATE VIEW SUMARIZACE
  155. (PRIJMENI, JMENO, RC, CELKEM)
  156. AS
  157. SELECT PRIJMENI, JMENO, RC,
  158. SUM(STAV) FROM NAROK
  159. GROUP BY RC;
  160.  
  161. Chceme-li zjistit, kolikrát v╪tτími ƒástkami disponují lidé v porovnání se skuteƒn∞m vlastnictvím, vytvo²íme si virtuální tabulku:
  162.  
  163. CREATE VIEW BLAMAZ(POMER)
  164. AS
  165. SELECT (SELECT SUM(CELKEM) 
  166. FROM SUMARIZACE)/
  167. (SELECT SUM(CELKEM) FROM 
  168. MAJITEL);
  169.  
  170. Tolik pro dneτek, p²íτt╪ pokraƒujeme.
  171. Jaromír Kukal
  172.  
  173.