home *** CD-ROM | disk | FTP | other *** search
/ Chip 2003 April / Chip_2003-04_cd1.bin / tema / krypta / articles.php@ID=146 < prev    next >
Text File  |  2003-02-02  |  34KB  |  559 lines

  1. <!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN">
  2. <html>
  3. <head>
  4.  <title>Krypta.cz - SQL v praxi aneb bezpeΦnostnφ oddech</title>
  5.  <link rel="StyleSheet" href="server/main.css" type="text/css">
  6.  <link rel="SHORTCUT ICON" href="server/favicon.ico">
  7.  <meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
  8.  <meta http-equiv="Cache-control" content="no-cache">
  9.  <meta http-equiv="Pragma" content="no-cache">
  10.  <meta http-equiv="Expires" content="0">
  11.  <meta name="robots" content="ALL,FOLLOW">
  12.  <meta http-equiv="Content-language" content="cs">
  13.  <meta name="description" content="Internetov² bezpeΦnostnφ portßl, zab²vajφcφ se kryptografiφ (Üifrovßnφm), ochranou dat, internetovou bezepeΦnostφ a poΦφtaΦov²mi viry">
  14.  <meta name="keywords" content="Üifrovßnφ cryptography pgp des aes rsa dss digital signatures pki linux free bezpeΦnost ochrana hacking cracking virus worm">
  15.  <meta name="copyright" content="Copyright (C) 2000-2002 Krypta.cz - <a href=mailto:michal.till@krypta.cz>Michal Till</a> a <a href=mailto:jan.kulveit@krypta.cz>Jan Kulveit</a>.">
  16.  <!-- No caching for this document.Trying to write to art146.html. ?> -->
  17.  
  18.  <!-- output.php -->
  19.  
  20.   <script language="JavaScript">
  21.   <!-- 
  22. //    if(top != self) { window.top.location.href=document.location; }  -->
  23.   </script>
  24.  
  25.  
  26. <!-- NAVRCHOLU.cz -->
  27. <script language="JavaScript" type="text/javascript">
  28. <!--
  29. pxDepth = screen.pixelDepth;
  30. if (!(pxDepth > 0))
  31.     pxDepth = screen.colorDepth;
  32. if (!(pxDepth > 0))
  33.     pxDepth = 0; 
  34. document.write("<img style=\"position:absolute; top:0px; left: 0px;\" src=\"../hit.navrcholu.cz/hit@id=00039669;n=1;screenx=" + screen.width + ";screeny=" + screen.height + ";cdepth=" + pxDepth + ";ref=" + escape(top.document.referrer) + "\" width=\"1\" height=\"1\" alt=\"\">");
  35. // -->
  36. </script>
  37. <noscript>
  38. <img style="position:absolute; top:0px; left: 0px;" src="../hit.navrcholu.cz/hit@id=00039669;n=1" width="1" height="1" alt="" border="0">
  39. </noscript>
  40. <!-- NAVRCHOLU.cz - konec -->
  41.  
  42. <STYLE Type=text/css>
  43.     BODY                { font-size:110%; background-color: #ffffff; color: #000000; margin: 0px;   background-image: url(images/backgr.gif); }
  44.  
  45.  
  46.  
  47.     .Copyright        { color: #000000; }
  48.     .Copyright A    { color: #000000; }
  49. </STYLE>
  50. </head>
  51. <SCRIPT>
  52. </SCRIPT><SCRIPT Src=charts.php@version=1621></SCRIPT><SCRIPT>
  53.  // Nalezeno  1 polozek. 
  54. var SectionTitles=new Array( "SQL v praxi aneb bezpeΦnostnφ oddech" , "      Relace" , "    P°φkaz SELECT" , "    P°φkaz SELECT je jist∞ nejd∙le₧it∞jÜφ Φ" , "    NejlepÜφ vysv∞tlenφ mnoha SQL p°φklad∙ " , "    Zpracovßnφ °et∞zc∙" , "      Modifikßtory" , "      Spojovßnφ tabulek" , "    Jak je vid∞t, v tabulce je mnoho irelev" , "      AgregaΦnφ funkce a seskupovßnφ v²sled" , "      Stromovß struktura v databßzi" , "      Slo₧enΘ dotazy" , "    Za n∞kter²ch podmφnek je mo₧nΘ spojit d" , "      Zßv∞rem" );
  55. var SectionURLs=new Array( "146" , "146#Title1" , "146#Title2" , "146#Title3" , "146#Title4" , "146#Title5" , "146#Title6" , "146#Title7" , "146#Title8" , "146#Title9" , "146#Title10" , "146#Title11" , "146#Title12" , "146#Title13" );
  56.  
  57. var BrothersNames = new Array("Ochrana dat v datab_25E1z_25EDch a (nejen) bezpe_25E8nostn_25ED probl_25E9my (1.d_25EDl)","Ochrana dat v datab_25E1z_25EDch a (nejen) bezpe_25E8nostn_25ED probl_25E9my (2.d_25EDl)","SQL v praxi aneb bezpeΦnostnφ oddech","");
  58. var BrothersIDs = new Array("140","142","146","");
  59. //=====INFO======
  60. ItemName='Article146';
  61.  
  62. InIFrame='No';
  63. TableNum=2; 
  64. ItemID=146; 
  65. ArticleType='3'; 
  66. Action='articles'
  67. ItemTitle='SQL v praxi aneb bezpeΦnostnφ oddech';
  68. ItemComment='SQL v praxi aneb bezpeΦnostnφ oddech';
  69. TabName='Articles'
  70. Parent1Title='Databßze' ;
  71. Parent2Title='BezpeΦnost a anonymita' ;
  72. Parent1ID='51' ;
  73. Parent2ID='9' ;
  74. ParentTitle='Databßze' ;
  75. AuthorName='Michal Till' ;
  76. AuthorDesc='' ;
  77. AuthorEMail='Michal.Till_40Seznam.cz' ;
  78. AuthorID='1' ;
  79. ItemDate='28.2.2002';
  80. Views='285' ;
  81. Average='1.00' ;
  82. Grade='1' ;
  83. NumVotes='3' ;
  84. SourceName='' ;
  85. SourceURL='' ;
  86. SourceLink='' ;
  87. Ref1URL='' ;
  88. Ref2URL='' ;
  89. Ref3URL='' ;
  90. Ref4URL='' ;
  91. Ref5URL='' ;
  92. Ref1Link='' ;
  93. Ref2Link='' ;
  94. Ref3Link='' ;
  95. Ref4Link='' ;
  96. Ref5Link='' ;
  97. Ref1Desc='' ;
  98. Ref2Desc='' ;
  99. Ref3Desc='' ;
  100. Ref4Desc='' ;
  101. Ref5Desc='' ;
  102. Possible=1 ;
  103. Answer1='' ;
  104. Answer2='' ;
  105. Answer3='' ;
  106. Answer4='' ;
  107. Answer5='' ;
  108. Num1='';
  109. Num2='';
  110. Num3='';
  111. Num4='';
  112. Num5='';
  113. Type= ''; //def
  114. WebName='Krypta.cz';
  115. //====ENDINFO======
  116.  
  117. </SCRIPT>
  118.  
  119. <BODY>
  120. </SCRIPT>
  121. <SCRIPT Language=JavaScript Src="server/startfeatures.php@Rand=ddd "> </SCRIPT><SCRIPT Language=JavaScript Src="server/features.php"> </SCRIPT><!-- Rozdeleni na sloupce -->
  122.  
  123. <TABLE cellspacing="0" cellpadding="0" border="0" width="100%">
  124. <tr>
  125.  
  126. <!-- Levy sloupec -->
  127.  
  128.  
  129.  
  130. <td  width="161" align="center" valign="top">
  131.  
  132. <img src=space.gif height=1 width=161>
  133. <SCRIPT SRC=server/left_js.php@version=1621></SCRIPT></td>
  134.  
  135. <!-- /Levy sloupec -->
  136.  
  137. <!-- Mezera 1-->
  138. <td width=13 bgcolor="#006792" ><img src="images/spacer.gif" width="13" height="1" border="0" alt=""></td>
  139. <!-- /Mezera 1-->
  140.  
  141. <!-- Mezera 2 -->
  142. <td width=1 bgcolor=#1063A5><img src="images/spacer.gif" width="1" height="1" border="0" alt=""></td>
  143. <!-- /Mezera 2-->
  144.  
  145. <!-- Mezera 3 -->
  146. <td width=10><img src="images/spacer.gif" width="10" height="1" border="0" alt=""></td>
  147. <!-- /Mezera 3-->
  148.  
  149.  
  150. <!-- Prostredni sloupec -->
  151. <td align="center" valign="top">
  152.  
  153. <!-- Hlavicka -->
  154. <!-- Horni lista s reklamou -->
  155.  
  156. <TABLE cellspacing="0" cellpadding="0" border="0" width="100%" class="hrlista">
  157. <tr>
  158.  
  159. <!-- Logo-->
  160. <td VAlign=Top>
  161. <a href="default.htm"><img src="images/logo.gif"  style="z-index:100;" vspace=0 cwidth="222" cheight="48" border="0" alt="Krypta.cz - Magazφn o informaΦnφ bezpeΦnosti"></a>
  162. </td>
  163. <!-- /Logo -->
  164.  
  165. <td align=center>
  166. </td></tr></table>
  167. <!-- /Horni lista s reklamou-->
  168. <!-- /Hlavicka -->
  169.  
  170. <TABLE Width=100% Border=0><TD><SCRIPT>
  171. </SCRIPT><SCRIPT>
  172. ArticleHead('SQL v praxi aneb bezpeΦnostnφ oddech', 'Michal Till', 'Michal.Till_40Seznam.cz', '28.2.2002', '19:36:05', 'Nßvod');
  173. Intro('Zkratka SQL znamenß Structured Query Language, do ΦeÜtiny bychom to asi nejlΘpe p°elo₧ili jako strukturovan² dotazov² jazyk. Pokud tento jazyk chßpeme jako protokol, tak bychom ho za°adili do SpojovΘ vrstvy referenΦnφho sφ¥ovΘho modelu ISO/OSI. Jazyk SQL slou₧φ pro komunikace aplikace s databßzφ. Optimßlnφ uschovßnφ a sprßva velkΘho objemu dat je velmi specializovanß v∞c a nenφ mo₧nΘ, aby se jφ ka₧d² program zab²val sßm. Vlastnφ databßzov² stroj je tedy odd∞len² program a pro \"dolovßnφ\" dat z n∞ho byl tedy vytvo°en tento, vφcemΘn∞ standardizovan² jazyk.');
  174. ArticleBanner_smallres('margin-bottom:10px;margin-top:-3px;');
  175. </SCRIPT>
  176. <DIV Class=Article><SCRIPT>
  177. AuthorData();
  178. if (Type != 'Pure') if ((ArticleType!=19) && (ArticleType!=20)) ShowSections();
  179. ArticleBanner_bigres('margin-top:12px;margin-bottom:-3px;');
  180. </SCRIPT><FONT Size=2><DIV Align=Justify Class=Paragraph>
  181.     Za cφl tohoto Φlßnku jsem si vytyΦil seznßmenφ Φtenß°e s prßcφ s daty pomocφ jazyka SQL. Rozhodn∞ bych necht∞l suplovat n∞jakou referenΦnφ p°φruΦku, co nejvφce bych se zam∞°il na principy fungovßnφ celΘho systΘmu. Naopak klasickΘ p°φkazy nap°. pro vytvo°enφ u₧ivatele, tabulky apod. bych spφÜe p°enechal jin²m zdroj∙m, nebo¥ jde o mΘn∞ zajφmavΘ p°φpady, kdy je pot°eba spφÜe znßt syntaxi ne₧ porozum∞t v∞ci.
  182. </DIV></FONT></b></i>
  183. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  184.     Ka₧d² databßzovΘ prost°edφ pracuje s tabulkami, v tomto p°φpad∞ je to zßkladnφ "·lo₧iÜt∞ dat". Podobnost s tabulkami, jak je znßme z tabulkov²ch kalkulßtor∙ nenφ nßhodnß, v naÜem p°φpad∞ se ale kladou na jistΘ aspekty prßce mimo°ßdnΘ nßroky, pro kterΘ programy typu Excel nejsou urΦeny. Prßv∞ proto je p°edstava databßze jako₧to jedinΘ tabulky mylnß, jednß se o soustavu tabulek s logick²mi vazbami. Vytvo°me si nynφ pro demonstraci fiktivnφ Ükolu a jejφ zam∞stnance.
  185. </DIV></FONT></b></i>
  186. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  187.     Tabulka U╚ITEL╔ : 
  188. </DIV></FONT></b></i>
  189. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  190.     <PRE>
  191. ╚φslo    JmΘno    P°edm∞t    
  192.  
  193. 1    Durych    1    
  194. 2    Adßmek    1    
  195. 3    Liborec    2    
  196. 4    ╚ervenß    3    
  197. 5    Hßjkovß    NULL    
  198. </PRE>
  199. </DIV></FONT></b></i>
  200. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  201.     Tabulka P╪EDM╠TY: 
  202. </DIV></FONT></b></i>
  203. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  204.     <PRE>
  205. ╚φslo    Popis
  206.  
  207. 1    Matematika
  208. 2    Zem∞pis
  209. 3    D∞jepis
  210. 4    Fyzika
  211. </PRE>
  212. </DIV></FONT></b></i>
  213. <A Name="Title1"><FONT Size=3><DIV Class=Headline>
  214. Relace</DIV></font>
  215. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  216.     Promφtneme-li si popisovanou firmu do reßlnΘ situace v Excelu, zjistφme, ₧e data by byla organizovßna jinak. Byla by pouze jedinß tabulka se t°emi sloupci a jmΘna jednotliv²ch p°edm∞t∙ by se opakovala na jednotliv²ch °ßdcφch. Zde je mezi sloupci U╚ITEL╔.P°edm∞t a P╪EDM╠TY.╚φslo relace. Je to logickß vazba, °φkajφcφ, ₧e hodnota ve sloupci P°edm∞t znaΦφ Φφslo °ßdku v tabulce P╪EDM╠TY (zde se nßzvoslovφ teorie trochu liÜφ s populßrn∞ nauΦnou literaturou, k Φemu₧ se jeÜt∞ vrßtφm). Tφm je nap°φklad pan Durych jednoznaΦn∞ svßzßn s p°edm∞tem Matematika (stejn∞ jako pan Adßmek), panφ ╚ervenß s d∞jepisem apod. Co ale p°φpad zam∞stnankyn∞ HßjkovΘ? NULL v databßzφch p°edstavuje jakΘsi "prßzdno", sloupec v tΘto °ßdce nenab²vß ₧ßdnΘ hodnoty a panφ Hßjkovß tedy ₧ßdn² p°edm∞t nevyuΦuje. Äßdnß anomßlie nenφ takΘ Φtvrt² °ßdek v tabulce P╪EDM╠TY, fyziku prost∞ nikdo nevyuΦuje. Abychom pochopili relaΦnφ model ·pln∞, je pot°eba k tomuto nßzornΘmu p°φkladu "dobalit" trochu d∙le₧itΘ teorie. 
  217. </DIV></FONT></b></i>
  218. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  219.     Jak je z popisovanΘho principu patrnΘ, ka₧d² zam∞stnanec m∙₧e uΦit pouze jeden p°edm∞t, ale ka₧d² p°edm∞t m∙₧e b²t vyuΦovßn vφce lidmi. Takov²to vztah oznaΦujeme jako 1:N. Vedle toho existujφ jeÜt∞ dv∞ dalÜφ formßlnφ oznaΦenφ, jednoduÜÜφ 1:1 a slo₧it∞jÜφ N:M. Prvn∞ jmenovanΘmu vztahu odpovφdß situace dvou tabulek, ve kter²ch jsou v₧dy dva °ßdky jednoznaΦn∞ svßzßny. Uva₧me nap°φklad tabulku T╪═DY se sloupcem T°φdnφ_uΦitel. Nenφ mo₧nΘ, aby jedna t°φda m∞la t°φdnφch uΦitel∙ vφce a ka₧d² m∙₧e b²t t°φdnφ uΦitel maximßln∞ jednΘ t°φdy. Naopak vztah M:N popisuje p°esn∞ opaΦnou situaci. Zkusme poopravit p∙vodnφ dv∞ tabulky tak, aby ka₧d² vyuΦujφcφ mohl uΦit vφce p°edm∞t∙. N∞komu by se mohlo zdßt, ₧e nejde na nßÜ relaΦnφ model aplikovat, ale nenφ to pravda. Musφme akorßt pou₧φt mal² trik, kter²m spojenφ dvou relacφ 1:N v novΘ tabulce VYU╚UJE. Pokud nebude uvedeno jinak, tak se v textu se nadßle budu odvolßvat v₧dy na poslednφ uveden² p°φklad.
  220. </DIV></FONT></b></i>
  221. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  222.     Tabulka U╚ITEL╔ : 
  223. </DIV></FONT></b></i>
  224. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  225.     <PRE>
  226. ╚φslo    JmΘno    Plat    Narozenφ        Hodin
  227.  
  228. 1    Durych    8000    1954-11-05    35
  229. 2    Adßmek    8000    1967-05-03    32
  230. 3    Liborec    11000    1980-09-28    38
  231. 4    ╚ervenß    9000    1971-10-10    29
  232. 5    Hßjkovß    10500    1979-01-13    39
  233. </PRE>
  234. </DIV></FONT></b></i>
  235. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  236.     Tabulka P╪EDM╠TY: 
  237. </DIV></FONT></b></i>
  238. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  239.     <PRE>
  240. ╚φslo    Popis
  241.  
  242. 1    Matematika
  243. 2    Zem∞pis
  244. 3    D∞jepis
  245. 4    Fyzika
  246. </PRE>
  247. </DIV></FONT></b></i>
  248. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  249.     Tabulka VYU╚UJE: 
  250.  
  251. <PRE>
  252. UΦitel    P°edm∞t
  253. 1    1
  254. 1    4
  255. 2    1
  256. 3    2
  257. 4    3
  258. 4    1
  259. </PRE>
  260. </DIV></FONT></b></i>
  261. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  262.     
  263. Tabulka VYU╚UJE je zde nedφlnß spojovacφ Φßst. UrΦuje, ₧e uΦitel s Φφslem 1 uΦφ p°edm∞ty 1 a 4, uΦitel Φ. 2 uΦφ p°edm∞t Φ.3, Φ. 3 uΦφ p°edm∞t Φ.2 a  Φ. 4 uΦφ p°edm∞ty Φ.3 a Φ.1. Pro takov²to popis mezi vztahy tabulek se pou₧φvajφ identifikßtory, jejich₧ ·Φelem je jednoznaΦn∞ identifikovat dan² °ßdek tabulky. Jeho hodnota proto v rßmci jednΘ tabulky musφ b²t jedineΦnß, nesmφ se opakovat. NejΦast∞ji to b²vajφ Φφsla - v databßzφch se toti₧ dß nastavit automatickΘ zvyÜovßnφ a dopl≥ovßnφ hodnoty. P°i p°ijmutφ novΘho kantora by tak systΘm automaticky doplnil hodnotu 5 do identifikßtoru Φφslo v tabulce U╚ITEL╔. JednoznaΦn² a nem∞nn² identifikßtor, kter² mß navφc nejkratÜφ dΘlku, naz²vßme primßrnφ klφΦ. Pokud nenφ ₧ßdn² sloupec unikßtnφ, m∙₧e b²t primßrnφ klφΦ takΘ tzv. slo₧en², kdy ho jakoby tvo°φ vφce sloupc∙ najednou. Pou₧itφ  primßrnφho klφΦe v cizφ tabulce k vytvo°enφ vztahu naz²vßme cizφ klφΦ. V prvnφm p°φkladu je nap°φklad v tabulce uΦitel∙ sloupec ╚φslo klφΦem primßrnφm, zatφmco sloupec P°edm∞t klφΦem cizφm.
  264. </DIV></FONT></b></i>
  265. <A Name="Title2"><FONT Size=3><DIV Class=Headline>P°φkaz SELECT</DIV></font>
  266. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  267.     P°φkaz SELECT je jist∞ nejd∙le₧it∞jÜφ Φßstφ jazyka SQL, v knihßch o databßzφch obvykle takΘ zabφrß v∞tÜinu prostoru. V²sledkem vykonßnφ tohoto p°φkazu je tabulka vÜech °ßdk∙, kterß vyhovujφ dan²m kritΘriφm. Ta se potΘ p°edß programu, kter² dotaz vydal (nap°φklad PHP). Vlastnφ syntaxe mß n∞kolik Φßstφ, ze kter²ch jsou povinnΘ pouze dv∞. NejjednoduÜÜφ p°φklad m∙₧e vypadat nap°φklad takto :
  268. </DIV></FONT></b></i>
  269. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  270.     <SPAN Class=CODE>SELECT * FROM U╚ITEL╔</SPAN>
  271. </DIV></FONT></b></i>
  272. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  273.     Zde jsme tedy pou₧ili Φßsti SELECT a FROM. Hv∞zdiΦka zde zastupuje vÜechny sloupce tabulky, jak je z asi anglickΘ terminologie patrno, vybere se vÜe z tabulky uΦitel∙. V²slednß tabulka, kterou takov²to dotaz vyprodukuje se tedy bude shodovat s tabulkou uΦitel∙. Daleko v∞tÜφ sφla p°φkazu je ale v ostatnφch Φßstech. Uve∩me si proto nynφ p°φklad dalÜφ. 
  274. </DIV></FONT></b></i>
  275. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  276.     <SPAN Class=CODE>SELECT JmΘno, Plat FROM U╚ITEL╔ WHERE Plat<10000 ORDER BY JmΘno</SPAN>
  277. </DIV></FONT></b></i>
  278. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  279.     NejlepÜφ vysv∞tlenφ mnoha SQL p°φklad∙ je Φasto jejich "p°eklad" do ΦeÜtiny. Tento kup°φkladu °φkß "vyber sloupce JmΘno a Plat z tabulky U╚ITEL╔ a to pouze ty, kde Plat je menÜφ ne₧ 10000, v²sledek se°a∩ (vzestupn∞) podle jmΘna (tedy abecedn∞). V²slednß tabulka bude tedy vypadat takto :
  280. </DIV></FONT></b></i>
  281. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  282.     <PRE>
  283. JmΘno    Plat
  284.  
  285. Adßmek    8000
  286. ╚ervenß    9000
  287. Durych    8000
  288. </PRE>
  289. </DIV></FONT></b></i>
  290. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  291.     Tφm ale nekonΦφ ani zßkladnφ mo₧nosti p°φkazu SELECT. Je nutnΘ podotknout, ₧e v Φßstech WHERE a ORDER BY mohou b²t daleko delÜφ v²razy. Tak nap°φklad chceme vybrat vÜechny zam∞stnance, kte°φ se narodili p°ed rokem 1970 a majφ plat menÜφ ne₧ 10 tisφc. Vedle toho jeÜt∞ chceme zjistit jejich hodinovou sazbu zaokrouhlenou na celß Φφsla. V²sledek chceme se°adit podle platu vzestupn∞ a v p°φpad∞ shody podle data narozenφ sestupn∞. Na dotaz
  292. </DIV></FONT></b></i>
  293. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  294.     <SPAN Class=CODE>SELECT JmΘno, ROUND(Plat/Hodin) AS Na_Hodinu FROM U╚ITEL╔ WHERE (Plat<10000) AND (Narozenφ<'1970-01-01') ORDER BY Plat, Narozenφ DESC</SPAN>
  295. </DIV></FONT></b></i>
  296. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  297.     odpovφ databßzov² stroj nßsledujφcφ tabulkou: 
  298. </DIV></FONT></b></i>
  299. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  300.     
  301. <PRE>
  302. JmΘno    Na_Hodinu
  303.  
  304. Adßmek    250
  305. Durych    288
  306. ╚ervenß    310
  307. </PRE>
  308. </DIV></FONT></b></i>
  309. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  310.     Z tohoto dotazu jsme zjistili t°i novΘ poznatky. Jednak v Φßsti WHERE m∙₧e b²t jakkoliv dlouh² logick² v²rok, ve kterΘm je mo₧no pou₧φvat spojky jako AND, OR, XOR apod., dßle °adit se dß podle n∞kolika sloupc∙ a to sestupn∞ i vzestupn∞ (vÜimn∞te si, ₧e datov² typ datum mß syntaxi YYYY-MM-DD, aby se urychlilo °azenφ) a nakonec si m∙₧eme v Φφsti SELECT vytvo°it nov² sloupec z v²sledk∙ jakΘhokoliv matematickΘho v²razu. 
  311. </DIV></FONT></b></i>
  312. <A Name="Title3"><FONT Size=3><DIV Class=Headline>Zpracovßnφ °et∞zc∙</DIV></font>
  313. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  314.     Ka₧dß databßze samoz°ejm∞ takΘ musφ podporovat textovΘ datovΘ typy a to jak omezenΘ na dΘlku (varchar(dΘlka)) tak i "neomezen∞" dlouhΘ (text). Pro sloupce tohoto typu existuje specißlnφ operßtor LIKE, nebo¥ pou₧itφ klasickΘho rovnφtka nenφ v₧dy nejvhodn∞jÜφ. Typicky n∞kterΘ polo₧ky mohou b²t zapsßny velk²mi pφsmeny a p°esnΘ porovnßvßnφ by tedy shodu vyhodnotilo jako zßpornou. V²raz JmΘno LIKE 'Michal' je pravdiv² i pro hodnotu JmΘno='MICHAL'. Dßle se Φasto pou₧φvß wildcard (₧olφk) v podob∞ znaku % (procento) pro nahrazenφ jakΘkoliv mno₧iny znak∙ (i prßzdnΘho °et∞zce). Podmφnka JmΘno LIKE 'Michal %' vybere jak hodnotu "Michal", tak hodnotu "Michal Till" apod. JednotlivΘ znaky je mo₧nΘ nahradit otaznφkem (?). Ve v∞tÜin∞ databßzφ se °et∞zce uzavφrajφ do apostrof∙. Pokud je apostrof (pop°. jin² citliv² znak) souΦßstφ °et∞zce, je nutnΘ jej "vyescapovat" vlo₧enφm zp∞tnΘho lomφtka, tedy nap°φklad 'rock'n'roll'. DalÜφm typem, kter² je nutnΘ Φasto uzav°φt do apostrof∙ je typ datum. Podrobn∞jÜφ informace najdete v dokumentaci k vaÜemu databßzovΘmu systΘmu.
  315. </DIV></FONT></b></i>
  316. <A Name="Title4"><FONT Size=3><DIV Class=Headline>
  317. Modifikßtory</DIV></font>
  318. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  319.     Modifikßtory jsou specißlnφ parametry Φßsti SELECT a zapisujφ se p°φmo za toto slovo, tedy SELECT [modifikßtor] ...pokraΦovßnφ dotazu. Implicitnφ modifikßtor mß nßzev ALL a znaΦφ, ₧e ve v²sledku budou uvedeny vÜechny hodnoty odpovφdajφcφ podmφnkßm. Pokud bychom cht∞li vynechat duplicitnφ hodnoty, pou₧ijeme modifikßtor DISTINCT, dotaz SELECT DISTINCT Plat FROM U╚ITEL╔ tak odpovφ tabulkou s hodnotami 8000 a 9000 - druh²ch 8000 je vynechßno. Podobn∞ pracuje i modifikßtor DISTINCTROW, rozdφl je akorßt v tom, ₧e vynechßvß pouze ty °ßdky, kterΘ se shodujφ ve vÜech polφch, tj. ne jenom v t∞ch vypisovan²ch. DalÜφ modifikßtory jsou implementovßny pouze v n∞kter²ch S╪BD. V MS JDBE je to nap°φklad TOP pro v²pis prvnφch n polo₧ek, kter² nap°φklad v MySQL nahrazuje Φßst LIMIT from,count p°φkazu SELECT.
  320. </DIV></FONT></b></i>
  321. <A Name="Title5"><FONT Size=3><DIV Class=Headline>
  322. Spojovßnφ tabulek</DIV></font>
  323. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  324.     A₧ do te∩ se ka₧d² dotaz t²kal pouze jedinΘ tabulky. V SQL je mo₧nΘ tabulky libovoln∞ spojovat a konstruovat tak daleko slo₧it∞jÜφ dotazy. Co kdy₧ nap°φklad chceme zjistit, kter² vyuΦujφcφ uΦφ jak² p°edm∞t? Je nutnΘ spojit vÜechny t°i tabulky. Spojenφ v databßzovΘm slova smyslu je totΘ₧ co kartΘzsk² souΦin. Nap°φklad KartΘzsk² souΦin mno₧iny M={a; b; c} a N={1; 2} je roven mno₧in∞ K={(a;1); (a;2); (b;1); (b;2); (c;1); (c;2)}, jednß se tedy o soubor vÜech mo₧n²ch kombinacφ prvk∙ z obou mno₧in. Podobn²m zp∙sobem funguje spojovßnφ tabulek, prvky jednotliv²ch mno₧in jsou °ßdky tabulek. V²sledn² souΦin pro tabulky s k, l a m °ßdky m∙₧e mφt tedy maximßln∞ k*l*m °ßdk∙. Uka₧me si Φßst souΦinu U╚ITEL╔ x  P╪EDMETY x VYU╚UJE (byly vy°azeny irelevantnφ sloupce Plat, Narozenφ a Hodin)
  325. </DIV></FONT></b></i>
  326. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  327.     <PRE>
  328. U╚ITEL╔        VYU╚UJE        P╪EDM╠TY
  329. ╚φslo    JmΘno    UΦitel    P°edm∞t    ╚φslo    Popis
  330. ----------------------------------------------------
  331. 1    Durych    1    1    1    Matematika
  332. 1    Durych    1    4    2    Zem∞pis
  333. ...    ...    ...    ...    ...    ...
  334. ...    ...    ...    ...    ...    ...
  335. 2    Adßmek    2    1    1    Matematika        
  336. 2    Adßmek    2    1    2    Zem∞pis        
  337. 2    Adßmek    2    1    3    D∞jepis
  338. 2    Adßmek    2    1    4    Fyzika
  339. 2    Adßmek    3    2    1    Matematika
  340. ...    ...    ...    ...    ...    ...
  341. ...    ...    ...    ...    ...    ...
  342. 4    ╚ervenß    3    2    2    Zem∞pis
  343. 4    ╚ervenß    4    3    3    D∞jepis
  344. 4    ╚ervenß    4    1    1    Matematika
  345. ...    ...    ...    ...    ...    ...
  346. ...    ...    ...    ...    ...    ...
  347. </PRE>
  348. </DIV></FONT></b></i>
  349. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  350.     Jak je vid∞t, v tabulce je mnoho irelevantnφch souΦin∙, nebo¥ z povahy relace je nutnΘ, aby se rovnala jednak polo₧ka U╚ITEL╔.╚φslo s polo₧kou VYU╚UJE.UΦitel, jednak polo₧ka VYU╚UJE.P°edm∞t s polo₧kou P╪EDM╠TY.╚φslo. P°es tyto sloupce  tabulky spojφme. Ostatnφ °ßdky tedy nevyhovujφ reßlnΘ situaci a sprßvn² SQL dotaz (na jmΘno vyuΦujφcφho a nßzev p°edm∞tu) vypadß takto :
  351. </DIV></FONT></b></i>
  352. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  353.     <SPAN Class=CODE>SELECT JmΘno, Popis FROM U╚ITEL╔, VYU╚UJE, P╪EDM╠TY WHERE (U╚ITEL╔.╚φslo=VYU╚UJE.UΦitel) AND (VYU╚UJE.P°edm∞t=P╪EDM╠TY.╚φslo) ORDER BY JmΘno</SPAN>
  354. </DIV></FONT></b></i>
  355. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  356.     SystΘm by m∞l vrßtit sprßvnΘ p°i°azenφ jednotliv²ch p°edm∞t∙ k vyuΦujφcφm profesor∙m.
  357. </DIV></FONT></b></i>
  358. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  359.     <PRE>
  360. JmΘno    Popis
  361.  
  362. Adßmek    Matematika
  363. ╚ervenß    D∞jepis
  364. Durych    Matematika
  365. Durych    Fyzika
  366. Liborec    Zem∞pis
  367. </PRE>
  368. </DIV></FONT></b></i>
  369. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  370.     Specißln∞ p°i spojovßnφ tabulek je nutnΘ brßt v ohled urΦitou kolizi nßzv∙ sloupc∙, kdy dv∞ tabulky nap°φklad obsahujφ sloupec ╚φslo. V Φßsti SELECT musφme p°i explicitnφm v²b∞ru urΦit, o jakou tabulku jde, tedy nap°. SELECT U╚ITEL╔.╚φslo FROM U╚ITEL╔, P╪EDM╠TY. V p°φpad∞ pou₧itφ hv∞zdiΦky (*) je nutnΘ spornΘ sloupce explicitn∞ p°ejmenovat pomocφ klauzule AS (SELECT *, U╚ITEL╔.╚φslo AS CisloUcitele ... ). Obdobn∞ musφme postupovat v Φßsti WHERE, aby stroj v∞d∞l, kter² sloupec mßme na mysli. 
  371. </DIV></FONT></b></i>
  372. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  373.     DalÜφ typickß situace, kterß m∙₧e nastat, je spojenφ jednΘ tabulky s tou samou. To pou₧ijeme v p°φpad∞, ₧e se jeden sloupec odkazuje na jin² °ßdek tΘ samΘ tabulky. V²sledn² souΦin tak bude mφt maximßln∞ m*m °ßdek, kde m je poΦet °ßdk∙ tabulky p∙vodnφ. Uva₧me nap°φklad situaci tabulky ZAM╠STNANCI, kterß mß pole ╚φslo (integer), JmΘno (string) a Nad°φzen² (integer). Pokud chceme zφskat seznam vÜech pracovnφk∙ se jmΘny jejich nad°φzen²ch, musφme ale dvojφ pou₧itφ stejnΘ tabulky odd∞lit, tedy v Φßsti FROM odd∞lφme a jinak pojmenujeme pracovnφky a jejich nad°φzenΘ. Pou₧ijeme nßsledujφcφ dotaz: 
  374. </DIV></FONT></b></i>
  375. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  376.     <SPAN Class=CODE>SELECT PODRIZENI.JmΘno AS JmΘno, SEFOVE.JmΘno AS èΘf FROM ZAM╠STNANCI PODRIZENI, ZAM╠STNANCI SEFOVE WHERE PODRIZENI.Nad°φzen²=SEFOVE.╚φslo</SPAN>
  377. </DIV></FONT></b></i>
  378. <A Name="Title6"><FONT Size=3><DIV Class=Headline>
  379. AgregaΦnφ funkce a seskupovßnφ v²sledk∙</DIV></font>
  380. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  381.     Jazyk SQL podporuje velmi ÜirokΘ spektrum r∙zn²ch souhrnn²ch funkcφ, kterΘ se Φasto pou₧φvajφ v praxi. Mφsto dlouhΘho v²kladu si uve∩me jeden dotaz, kter² zodpovφ n∞kolik otßzek najednou.
  382. </DIV></FONT></b></i>
  383. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  384.     <SPAN Class=CODE>SELECT SUM(Plat), MIN(Plat), MAX(PLAT), AVG(Plat) FROM U╚ITEL╔</SPAN>
  385. </DIV></FONT></b></i>
  386. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  387.     Takov²to p°φkaz vybere celkovΘ platovΘ nßklady, minimßlnφ a maximßlnφ plat,  pr∙m∞rn² plat a to v tomto po°adφ (do pr∙m∞rnΘ hodnoty funkce AVG se nezapoΦφtßvajφ hodnoty NULL). DalÜφ velmi Φasto pou₧φvanou funkcφ je COUNT(), kterß vracφ poΦet °ßdk∙ v danΘm sloupci. Celkov² poΦet vÜech uΦitel∙ Ükoly tak zjistφme dotazem SELECT Count(╚φslo) FROM U╚ITEL╔ (jako poΦet unikßtnφch ╚φsel uΦitel∙).
  388. </DIV></FONT></b></i>
  389. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  390.     Tyto agregaΦnφ funkce majφ podobn∞ jako p°φkaz SELECT svoje modifikßtory a op∞t je implicitn∞ pou₧it ALL. Modifikßtor *, tedy nap°φklad COUNT(* P°edm∞t) znamenß, ₧e do v²sledku bude zapoΦφtßvßno vÜe, tedy i °ßdky s hodnotou NULL. Modifikßtor DISTICT mß obdobnou funkci jako u p°φkazu SELECT.
  391. </DIV></FONT></b></i>
  392. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  393.     ╚astß nßpl≥ prßce s databßzφ je zφskßvßnφ souhrnn²ch ·daj∙ urΦit²ch skupin, k Φemu₧ se pou₧φvß Φßst GROUP BY [v²raz]. Pro ka₧d² °ßdek v²pisu se [v²raz] vyhodnotφ a stejnΘ v²sledky se jakoby srazφ dohromady. Uva₧me nap°φklad dotaz na poΦet uΦitel∙ jednotliv²ch p°edm∞t∙, zde skupiny vytvo°φme podle stejn²ch Φφsel uΦitel∙. Nejprve spojφme dv∞ tabulky dohromady, obdobn∞ jako v jednom z p°edeÜl²ch p°φklad∙. Nßsledn∞ spoΦφtßme poΦet vÜech unikßtnφch uΦitel∙ pomocφ funkce COUNT(). 
  394. </DIV></FONT></b></i>
  395. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  396.     <SPAN Class=CODE>SELECT Popis, COUNT(VYU╚UJE.UΦitel) FROM VYU╚UJE, P╪EDM╠TY WHERE (VYU╚UJE.P°edm∞t=P╪EDM╠TY.╚φslo) GROUP BY VYU╚UJE.UΦitel</SPAN>
  397. </DIV></FONT></b></i>
  398. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  399.     SystΘm by m∞l odpov∞d∞t tabulkou jednotliv²ch p°edm∞t∙ a poΦtem uΦitel∙, kte°φ je uΦφ. S pou₧itφm GROUP BY se Φasto objevuje klauzule HAVING, kterß specifikuje dalÜφ podmφnku, kterou musφ v²b∞r spl≥ovat. Jejφ v²znam je obdobn² Φßsti WHERE ovÜem s tφm rozdφlem, ₧e p°i seskupovßnφ podmφnka HAVING omezuje jakoby ji₧ hotovß seskupeni, kdy₧to WHERE omezuje jednotlivΘ °ßdky jeÜt∞ p°ed jejich za°azenφm do skupin.
  400. </DIV></FONT></b></i>
  401. <A Name="Title7"><FONT Size=3><DIV Class=Headline>
  402. Stromovß struktura v databßzi</DIV></font>
  403. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  404.     P°φklad s nad°φzen²mi zam∞stnanci popisuje situaci, kdy n∞kterΘ objekty jsou pod°φzenΘ jin²m. Uva₧me, zda je mo₧nΘ totΘ₧ ud∞lat pro v∞tÜφ hierarchickou hloubku. Spojovßnφ tabulek nßm p°estßvß slou₧it, u₧ jenom proto, ₧e poΦet °ßdk∙ souΦinu exponencißln∞ nar∙stß a pro hloubku n je roven k^n, kde k je poΦet °ßdk∙ p∙vodnφ tabulky. Zde se velmi Φasto pou₧φvß tzv. omezenφ intervalem, p°esto₧e mß svΘ podstatnΘ nev²hody, nenφ toti₧ mo₧nΘ stromovou strukturu stavit do nekoneΦna "nahoru" (tedy je omezenß hloubka) ani "do stran", tedy pod jeden objekt m∙₧e pat°it maximßln∞ koneΦn² poΦet objekt∙ jin²ch. Zkusme nap°φklad jednou tabulkou popsat adresß°ovou strukturu disku. Pro ·plnΘ zjednoduÜenφ polo₧me maximßlnφ hloubku adresß°e jako 5 a maximßlnφ poΦet adresß°∙ v jednom podadresß°i na 9. Tabulka STRUKTURA bude mφt v naÜem p°φpad∞ dva sloupce : JmΘno (string) a Hierarchie (integer s implicitnφ hodnotou 100000).  Nejprve vlo₧φme domovsk² adresß° s p°ednastaven²m Φφslem hierarchie (dΘle jen Φφslo).  
  405. </DIV></FONT></b></i>
  406. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  407.     Dßle, pokud chceme p°idat slo₧ku pod tu domovskou (s Φφslem 100000), postupujeme nßsledovn∞. Deset podlo₧ek na tΘto ·rovni m∙₧e nab²vat Φφsel od 11...,12..,13... do 19... Tedy nejprve si zjistφme jejich poΦet (SELECT Count(╚φslo) from FROM STRUKTURA GROUP BY ╚φslo) a k n∞mu p°iΦteme jednu. PotΘ vezmeme Φφslo slo₧ky pod kterou chceme p°idßvat a prvnφ nenulovou Φφslici zleva nahradφme takto vypoΦten²m Φφslem. V²sledek s novou hodnotou zapφÜeme do databßze. Pokud se vßm zdß cel² mechanizmus slo₧it², podφvejte se, jak po napln∞nφ tabulky n∞kolika nßzorn²mi °ßdky bude vypadat v²pis SELECT * FROM STRUKTURA ORDER BY Hierarchie.
  408. </DIV></FONT></b></i>
  409. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  410.     
  411. <PRE>
  412. JmΘno        Hierarchie
  413. ---------------------------
  414. Home        100000
  415.   Software    110000
  416.     Windows    120000
  417.     Office    121000
  418.       Word    121100
  419.       Excel    121200
  420.   Data        120000
  421.     Dopisy    121000
  422.       Petr    121100
  423.       Michal    121200
  424. </PRE>
  425. </DIV></FONT></b></i>
  426. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  427.     Jak je vid∞t, Üest² znak zleva (jedniΦka) v implicitnφ hodnot∞ zajiÜ¥uje zachovßnφ pot°ebnΘ dΘlky. Pro vypsßnφ celΘho stromu struktury nynφ staΦφ vÜechny slo₧ky se°adit vzestupn∞ podle hierarchickΘho Φφsla. Pokud chceme v²pis zaΦφt nap°φklad od slo₧ky Dopisy, musφme si zjistit meznφ hodnoty. Ta menÜφ, A, je Φφslo poΦßteΦnφ slo₧ky, ta v∞tÜφ je pak Φφslo A, ve kterΘm je prvnφ nenulovß Φφslice zleva zv∞tÜena o 1 (s p°enosem na dalÜφ °ßd v p°φpad∞ 9+1=10). V p°φpad∞ dopis∙ by staΦilo zadat dotaz: 
  428. </DIV></FONT></b></i>
  429. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  430.     <SPAN Class=CODE>SELECT * FROM STRUKTURA WHERE (Hierarchy>=120000) AND (Hierarchy<130000) ORDER BY Hierarchy</SPAN>
  431. </DIV></FONT></b></i>
  432. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  433.     Jedin² problΘm tohoto schΘmatu je v p°φpad∞ odebφrßnφ prvk∙, respektive p°i nßsledujφcφm p°idßvßnφ. Pokud bychom odebrali slo₧ku Word, tak by nßsledn∞ p°idanß slo₧ka Access m∞la Φφslo 121300, Φφm₧ bychom mohli deset voln²ch mφst zanedlouho vyΦerpat. Proto je nutnΘ p°i p°idßvßnφ brßt jakΘkoliv nepou₧itΘ Φφslo, nikoliv to "dalÜφ", jak bylo v ·vodu pro zjednoduÜenφ uvedeno.
  434. </DIV></FONT></b></i>
  435. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  436.     Z vlastnφ programßtorskΘ praxe mohu potvrdit ·sp∞ÜnΘ pou₧itφ tΘto techniky, nap°φklad v redakΦnφm systΘmu ve stromovΘ struktu°e komentß°∙ k Φlßnk∙m. PotΘ, co jsem slo₧itΘ rekurzivnφ vypisovßnφ nahradil tφmto efektivnφm zp∙sobem, se prßce se Φlßnky podstatn∞ zrychlila a skripty majφ podstatn∞ menÜφ dΘlku. Tato technika lze navφc pou₧φt i na velmi velkß Φφsla, Hierarchy mß v mΘm p°φpad∞ dΘlku 38 mφst a indexy v jednotliv²ch slo₧kßch jsou po t°ech Φφslicφch (tedy max. 999 podlo₧ek).
  437. </DIV></FONT></b></i>
  438. <A Name="Title8"><FONT Size=3><DIV Class=Headline>
  439. Slo₧enΘ dotazy</DIV></font>
  440. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  441.     Za n∞kter²ch podmφnek je mo₧nΘ spojit dva dotazy v jeden. P°i takov²chto operacφch je p°edevÜφm nutnΘ, aby se jednotlivΘ sloupce shodovali typov∞ i co do poΦtu. Pro tyto ·Φely jsou v SQL MNOÄINOV╔ mno₧inovΘ operßtory. NejjednoduÜÜφm z nich je UNION, kter² zastupuje prostΘ sjednocenφ mno₧in, vΦetn∞ dodatku, ₧e duplicitnφ zßznamy se ve sjednocenφ berou jako jeden prvek. Pokud bychom cht∞li toto odstranit, pou₧ijeme operßtor UNION ALL. Pokud bychom m∞li nap°φklad v naÜφ imaginßrnφ Ükole v odd∞len²ch tabulkßch uΦitele a ostatnφ pracujφcφ, seznam vÜech zam∞stnanc∙ zφskßme nßsledujφcφm dotazem :
  442. </DIV></FONT></b></i>
  443. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  444.     <SPAN Class=CODE>SELECT JmΘno FROM U╚ITEL╔  UNION  SELECT JmΘno FROM OSTATN═_ZAM</SPAN>
  445. </DIV></FONT></b></i>
  446. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  447.     Obdobn²m zp∙sobem (pochopiteln∞ ovÜem v jinΘ situaci) lze pou₧φt operßtor INTERSECT pro pr∙nik mno₧in (tabulek) nebo MINUS (n∞kdy EXCEPT), p°i kterΘm jsou do v²sledku za°azeny v²sledky z prvnφho dotazu, kterΘ se nevyskytly v dotazu druhΘm.
  448. </DIV></FONT></b></i>
  449. <A Name="Title9"><FONT Size=3><DIV Class=Headline>
  450. Zßv∞rem</DIV></font>
  451. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  452.     To by bylo pro tentokrßt z SQL praxe vÜe. Rßd bych Φtenß°e upozornil, ₧e jednotlivΘ databßzovΘ programy (SystΘmy °φzenφ bßze dat, S╪BD) se Φasto svojφ implementacφ SQL liÜφ. P°edevÜφm jsou Φasto odliÜnΘ profesionßlnφ aplikace (Oracle apod...) od t∞ch "amatΘrsk²ch" (nap°. MySQL ve svΘ poslednφ kompletnφ verzi nemß v∙bec slo₧enΘ dotazy implementovßny), kterΘ na druhou stranu vedou co do poΦtu nasazen²ch aplikacφ na internetu a Φasto p°ekvapujφ nevφdanou rychlostφ. Pokud zkopφrujete zde uvedenΘ p°φklady do SQL konzole, je vφce ne₧ mo₧nΘ, ₧e prßv∞ vßÜ systΘm bude pro tu Φi onu vlastnost po₧adovat mφrn∞ odliÜnou syntaxi.
  453. </DIV></FONT></b></i>
  454. <FONT Size=2><DIV Align=Justify Class=Paragraph>
  455.      
  456. </DIV></FONT></b></i>
  457. </DIV>
  458. <SCRIPT>
  459. TextEnd('')
  460. </SCRIPT><OL Class=None Type=Disc></OL><SCRIPT>
  461. nie('<br>');AdditionalTablesBegin();
  462.  
  463. CommentsBegin('SQL v praxi aneb bezpeΦnostnφ oddech',2);
  464.  
  465. Comment('87','                                 <IMG Src=images/sub.gif valign=top> super clanok','MiKRO','11');
  466. Comment('96','                                 <IMG Src=images/sub.gif valign=top> Par poznamek','Dusan Bolek','11');
  467. CommentsEnd();
  468. </SCRIPT><SCRIPT>
  469. ArticleEnd()
  470. </SCRIPT></TABLE>
  471. <!-- /Prostredni sloupec -->
  472.  
  473.  
  474. <!-- Mezera 3 -->
  475.  
  476. <td width=5><img src="images/spacer.gif" width="5" height="1" border="0" alt=""></td>
  477. <!-- /Mezera 3-->
  478.  
  479. <!-- Mezera 2 -->
  480. <td width=1 bgcolor=#1063A5><img src="images/spacer.gif" width="1" height="1" border="0" alt=""></td>
  481. <!-- /Mezera 2-->
  482.  
  483. <!-- Mezera 1-->
  484. <td width=13 bgcolor="#006792" ><img src="images/spacer.gif" width="13" height="1" border="0" alt=""></td>
  485. <!-- /Mezera 1-->
  486.  
  487. <!-- Pravy sloupec -->
  488. <td bgcolor=#006792 width="0" align="center" valign="top">
  489. <SCRIPT SRC=server/right_js.php@version=1621></SCRIPT><br>
  490. </td>
  491. <!-- /Pravy sloupec -->
  492.  
  493.  
  494. </tr>
  495.  
  496. <!-- Bilo -->
  497. <tr>
  498. <td bgcolor=#000000><img src=space.gif height=1 width=1></td>
  499. <td bgcolor=#000000></td>
  500. <td bgcolor=#000000></td>
  501. <td bgcolor=#FFFFFF></td>
  502. <td bgcolor=#FFFFFF></td>
  503. <td bgcolor=#FFFFFF></td>
  504. <td colspan=5 bgcolor=#000000></td>
  505. </tr>
  506. <tr  bgcolor=#FFFFFF>
  507. <td><img src=space.gif height=20 width=1></td>
  508. <td></td>
  509. <td></td>
  510. <td></td>
  511. <td></td>
  512. <td></td>
  513. <td colspan=5></td>
  514. </tr>
  515. <!-- /Bilo-->
  516.  
  517.  
  518.  
  519. </table>
  520. <!-- /Rozdeleni na sloupce -->
  521.  
  522. <SCRIPT>
  523.     Exec(ToExecute);
  524.     ToExecute="";
  525. </SCRIPT>
  526.  
  527. <!-- Dolni lista -->
  528.  
  529.  
  530. <!-- Paticka -->
  531. <TABLE cellspacing="0" cellpadding="0" border="0" width="100%" bgcolor=#ffffff>
  532. <TR><td colspan=5 align="center" bgcolor=#000000><img src=space.gif height=1 width=1></td></TR>
  533. <TR bgcolor=#f0f0f0>
  534. <td align="center">
  535. <IMG Src=images/logo2.gif hspace=10 vspace=5>
  536. </td>
  537. <td>
  538. <DIV Style="margin-top:4px;margin-bottom:4px;" Class=Copyright><FONT Face=Arial Size=1>
  539.  
  540. <b><u>Krypta.cz</u></b> -  Magazφn o informaΦnφ bezpeΦnosti.<br>
  541. Copyright (C) 2000-2002 Krypta.cz - <a href=mailto:michal.till@krypta.cz>Michal Till</a> a <a href=mailto:jan.kulveit@krypta.cz>Jan Kulveit</a>. VÜechna prßva vyhrazena. <br>
  542. Tento server dodr₧uje prßvnφ p°edpisy o ochran∞ osobnφch ·daj∙, vΦetn∞ standardu P3P (<a href=server/policy.xml>policy</a>). </FONT></DIV>
  543. </td>
  544. <td>
  545. <IMG Src=geronimo.gif hspace=10 vspace=5>
  546. </td>
  547. <td>
  548. <DIV Style="margin-top:4px;margin-bottom:4px;" Class=Copyright><FONT Face=Arial Size=1>
  549. RedakΦnφ systΘm Geronimo<br>
  550. Copyright (C) 2001-2002 <a href=mailto:michal.till@krypta.cz>Michal Till</a>
  551. </FONT></DIV>
  552. </td>
  553. </td></tr></table>
  554. <!-- Paticka -->
  555.  
  556. <!-- /Dolni lista -->
  557.  
  558. </body>
  559. </html>