home *** CD-ROM | disk | FTP | other *** search
/ Chip 1999 September / Chip_1999-09_cd.bin / servis / Chip_txt / TXT / 148.txt < prev    next >
Text File  |  1999-07-27  |  9KB  |  147 lines

  1. Databáze standardu SQL, díl 15.
  2. Patnáct∞ díl naτeho seriálu je z v╪tτí ƒásti v╪nován dokonƒení tématu spojování tabulek.
  3.  
  4. Ve spojení je síla
  5.  
  6. 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:
  7.  
  8. SELECT * FROM KONTAKT 
  9. LEFT JOIN OSOBA 
  10. ON CISLO_PRAC=CISLO_P;
  11.  
  12. SELECT * FROM OSOBA 
  13. RIGHT JOIN KONTAKT 
  14. ON CISLO_PRAC=CISLO_P;
  15.  
  16. Pak snadno získáme p²ehled o anonymních linkách p²íkazem:
  17.  
  18. SELECT DISTINCT TELEFON 
  19. FROM KONTAKT LEFT JOIN OSOBA 
  20. ON CISLO_PRAC=CISLO_P
  21. WHERE JMENO IS NULL;
  22.  
  23. 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:
  24.  
  25. SELECT * FROM OSOBA 
  26. FULL OUTER JOIN KONTAKT 
  27. ON CISLO_PRAC=CISLO_P;
  28.  
  29. 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:
  30.  
  31. SELECT CISLO_P, JMENO,
  32. COUNT(TELEFON) POCET 
  33. FROM OSOBA LEFT JOIN KONTAKT 
  34. ON CISLO_PRAC=CISLO_P
  35. GROUP BY CISLO_P 
  36. ORDER BY JMENO, CISLO_P;
  37.  
  38. Teprve te╘ máme τanci realizovat seznam neúsp╪τn∞ch lidí p²íkazem:
  39.  
  40. SELECT CISLO_P, JMENO, 
  41. COUNT(TELEFON) POCET 
  42. FROM OSOBA LEFT JOIN KONTAKT 
  43. ON CISLO_PRAC=CISLO_P
  44. GROUP BY CISLO_P
  45. HAVING COUNT(TELEFON)<=2
  46. ORDER BY CISLO_P;
  47.  
  48. 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. 
  49. Dotaz do t²í tabulek
  50. 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:
  51.  
  52. SELECT JMENO, POPIS 
  53. FROM TRPASLIK, VLASTNOST, 
  54. ZNALOST
  55. WHERE CIT=CISTRP 
  56. AND CIV=CISVLA
  57. ORDER BY JMENO, POPIS;
  58.  
  59. 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à:
  60.  
  61. SELECT DISTINCT JMENO 
  62. FROM TRPASLIK, VLASTNOST, 
  63. ZNALOST
  64. WHERE CIT=CISTRP 
  65. AND CIV=CISVLA
  66. AND POPIS IN ("LENOST","DRZOST")
  67. ORDER BY JMENO;
  68.  
  69. SELECT POPIS 
  70. FROM TRPASLIK, VLASTNOST, 
  71. ZNALOST
  72. WHERE CIT=CISTRP 
  73. AND CIV=CISVLA
  74. AND JMENO="BRUMLA"
  75. ORDER BY POPIS;
  76.  
  77. SELECT JMENO, COUNT(POPIS) 
  78. POCET_VLASTNOSTI
  79. FROM TRPASLIK, VLASTNOST, 
  80. ZNALOST
  81. WHERE CIT=CISTRP 
  82. AND CIV=CISVLA
  83. GROUP BY JMENO
  84. ORDER BY JMENO;
  85. SELECT POPIS, COUNT(JMENO) 
  86. POCET_TRPASLIKU
  87. FROM TRPASLIK, VLASTNOST, 
  88. ZNALOST
  89. WHERE CIT=CISTRP 
  90. AND CIV=CISVLA
  91. GROUP BY POPIS
  92. ORDER BY POPIS;
  93. Zahnízd╪n∞ JOIN
  94. 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í:
  95.  
  96. SELECT JMENO, POPIS 
  97. FROM VLASTNOST LEFT JOIN
  98. (TRPASLIK LEFT JOIN ZNALOST ON CIT=CISTRP) ON CIV=CISVLA 
  99. ORDER BY JMENO, POPIS;
  100.  
  101. Chytráky také snadno zjistíme: 
  102.  
  103. SELECT JMENO FROM VLASTNOST LEFT JOIN
  104. (TRPASLIK LEFT JOIN ZNALOST ON CIT=CISTRP) ON CIV=CISVLA 
  105. WHERE POPIS="CHYTROST"
  106. ORDER BY JMENO;
  107.  
  108. Následující dotaz vypíτe trpaslíky, o kter∞ch se zatím nic neví. Takov∞ dotaz bez LEFT JOIN není moºn∞: 
  109.  
  110. SELECT JMENO FROM VLASTNOST LEFT JOIN
  111. (TRPASLIK LEFT JOIN ZNALOST ON CIT=CISTRP) ON CIV=CISVLA 
  112. WHERE POPIS IS NULL
  113. ORDER BY JMENO;
  114.  
  115. Pokud nás zajímá pouze jejich poƒet, staƒí napsat:
  116.  
  117. SELECT COUNT(JMENO) NEZNAMY FROM VLASTNOST LEFT JOIN
  118. (TRPASLIK LEFT JOIN ZNALOST ON CIT=CISTRP) ON CIV=CISVLA 
  119. WHERE POPIS IS NULL;
  120.  
  121. Θleva zvaná VIEW
  122. ªádná kaτe není tak horká...
  123. 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.   
  124.  
  125. Velké pokuτení
  126. 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:
  127.  
  128. SELECT RC, PRIJMENI, JMENO, 
  129. SUM(STAV) 
  130. INTO PRACHAC FROM CLOVEK, UCET
  131. WHERE CLOVEK.RC=UCET.RC
  132. GROUP BY CLOVEK.RC
  133. HAVING SUM(STAV)>1000000
  134. ORDER BY PRIJMENI, JMENO, RC;
  135.  
  136. 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. 
  137.  
  138. Virtuální sv╪t
  139. 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í:
  140. VIRTU╡LN╓ OBJEKT X M╡ STEJNÉ VLASTNOSTI JAKO X, ALE NEN╓ TO X.
  141. 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í.
  142.  
  143. Zpátky k DDL 
  144. 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.     
  145. Jaromír Kukal
  146.  
  147.