{"id":241,"date":"2021-03-05T15:40:05","date_gmt":"2021-03-05T15:40:05","guid":{"rendered":"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/?post_type=chapter&#038;p=241"},"modified":"2021-05-06T15:10:53","modified_gmt":"2021-05-06T15:10:53","slug":"tulemuste-jarjestamine-valisvotmed-ja-paringud-mitme-tabeli-pohjal","status":"publish","type":"chapter","link":"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/chapter\/tulemuste-jarjestamine-valisvotmed-ja-paringud-mitme-tabeli-pohjal\/","title":{"raw":"Tulemuste j\u00e4rjestamine, v\u00e4lisv\u00f5tmed ja p\u00e4ringud mitme tabeli p\u00f5hjal","rendered":"Tulemuste j\u00e4rjestamine, v\u00e4lisv\u00f5tmed ja p\u00e4ringud mitme tabeli p\u00f5hjal"},"content":{"raw":"<h2>J\u00e4rjestamine<\/h2>\r\nSeni koostatud p\u00e4ringute tulemusi oleks tihtipeale mugavam vaadata, kui need oleks millegi alusel j\u00e4rjestatud. N\u00e4iteks, eelmises peat\u00fckis p\u00e4risime populaarseid Netflixi n\u00e4itlejaid ning saime tulemusse v\u00e4ga palju kirjeid. Tulemus oleks kenam v\u00e4lja n\u00e4inud, kui n\u00e4itlejad oleksid teostes n\u00e4itlemiste arvu alusel j\u00e4rjestatud olnud.\r\n\r\nJ\u00e4rjestamiseks kasutame m\u00e4rks\u00f5napaari <code><span style=\"color: #970000\"><strong>ORDER BY<\/strong><\/span><\/code>, mis k\u00e4ib seni\u00f5pitud p\u00e4ringulause kuju l\u00f5ppu.\r\n\r\nJooksuta j\u00e4rgnevat p\u00e4ringut:\r\n<ul>\r\n \t<li><code><span style=\"color: #970000\"><strong>SELECT<\/strong><\/span> naitleja_id, <\/code><strong><code><span style=\"color: #000080\">COUNT<\/span><\/code><\/strong><code>(*) <span style=\"color: #970000\"><strong>FROM<\/strong><\/span> naitlemine <span style=\"color: #970000\"><strong>GROUP BY<\/strong><\/span> naitleja_id <span style=\"color: #970000\"><strong>HAVING<\/strong><\/span> <span style=\"color: #000080\"><strong>COUNT<\/strong><\/span>(*) &gt;= <span style=\"color: #0000ff\">25<\/span> <span style=\"color: #970000\"><strong>ORDER BY<\/strong><\/span> <span style=\"color: #000080\"><strong>COUNT<\/strong><\/span>(*)<span style=\"color: #ff0000\"><strong>;<\/strong><\/span><\/code><\/li>\r\n<\/ul>\r\nN\u00e4eme, et seekord on n\u00e4itlejate ID-d n\u00e4itlemiste arvu p\u00f5hjal j\u00e4rjestatud. Seega on p\u00e4ringu tulemusest m\u00e4rksa lihtsam \u00fclevaadet saada.\r\n\r\nSelle saavutasime kirjutades <code><span style=\"color: #970000\"><strong>ORDER BY<\/strong><\/span> <\/code><strong><code><span style=\"color: #000080\">COUNT<\/span><\/code><\/strong><code>(*)<\/code>. Sama h\u00e4sti oleks v\u00f5inud kirjutada <code><span style=\"color: #970000\"><strong>ORDER BY<\/strong><\/span> <span style=\"color: #0000ff\">2<\/span><\/code>, mis t\u00e4hendaks seda, et j\u00e4rjestamine tehakse <strong><code><span style=\"color: #970000\">SELECT<\/span><\/code><\/strong> osas oleva 2. tunnuse, avaldise v\u00f5i funktsiooni p\u00f5hjal, milleks oligi hetkel <span style=\"color: #000080\"><code><\/code><strong><code><span style=\"color: #000080\">COUNT<\/span><\/code><\/strong><\/span><code>(*)<\/code>.\r\n\r\n[h5p id=\"43\"]\r\n\r\nNagu n\u00e4gime n\u00e4idete p\u00f5hjal, siis vaikimisi toimub PostgreSQL's j\u00e4rjestamine kasvavalt. J\u00e4rjestamise loogikat saab ka ise t\u00e4psustada, kasutades selleks abim\u00e4rks\u00f5nu <code><\/code><strong><code><span style=\"color: #970000\">ASC<\/span><\/code><\/strong> (<em>ascending<\/em>, ee kasvav) ja <code><span style=\"color: #970000\"><strong>DESC<\/strong><\/span><\/code> (<em>descending<\/em>, ee kahanev). T\u00e4psustavad m\u00e4rks\u00f5nad tuleb kirjutada terve <code><\/code><strong><code><span style=\"color: #970000\">ORDER BY<\/span><\/code><\/strong> osa l\u00f5ppu ehk \u00fcldse terve p\u00e4ringulause l\u00f5ppu.\r\n\r\n[h5p id=\"44\"]\r\n\r\nP\u00e4ringu tulemusi v\u00f5ib j\u00e4rjestada ka mitmel alusel ning sellisel juhul on nende kirja paneku j\u00e4rjekord (p\u00e4rast m\u00e4rks\u00f5napaari <code><span style=\"color: #970000\"><strong>ORDER BY<\/strong><\/span><\/code>) oluline.\r\n\r\n[h5p id=\"45\"]\r\n\r\nTasub teada, et grupeerimise aluse ehk m\u00e4rks\u00f5nadele <strong><code><span style=\"color: #970000\">GROUP BY<\/span><\/code><\/strong> vahetult j\u00e4rgneva osa v\u00f5ib samuti asendada mingi sobiva arvuga, t\u00e4pselt nii nagu oleme teinud <code><span style=\"color: #970000\"><strong>ORDER BY<\/strong><\/span><\/code> puhul. See on mugav abivahend p\u00e4ringute kiiremaks kirjutamiseks. Samas on niiviisi vead kergemad tekkima, mis t\u00e4hendab, et tuleb t\u00e4helepanelik olla.\r\n<h2>Suurimad ja v\u00e4himad<\/h2>\r\nIsegi kui tulemusi piirata ja j\u00e4rjestada v\u00f5ib neid m\u00f5nikord ikkagi liiga palju olla, et nende p\u00f5hjal mugavalt j\u00e4reldusi teha saaks. Seega on vahepeal oluline, et p\u00e4ringu tulemus oleks v\u00f5imalikult l\u00fchike ja kokkuv\u00f5tlik.\r\n\r\nSiinkohal on abiks PostgreSQL'i m\u00e4rks\u00f5na <strong><code><span style=\"color: #970000\">LIMIT<\/span><\/code><\/strong>., mille abil saab otseselt piirata, mitut kirjet p\u00e4ringu tulemuses n\u00e4idatakse. M\u00e4rks\u00f5na k\u00e4ib taaskord terve seni\u00f5pitud p\u00e4ringu kuju l\u00f5ppu. Koos m\u00e4rks\u00f5naga <code><\/code><strong><code><span style=\"color: #970000\">LIMIT<\/span><\/code><\/strong> tuleb kirjutada ka arv, millega t\u00e4psustatakse, mitut tulemust alles soovitakse j\u00e4tta.\r\n\r\nJooksuta j\u00e4rgnevat p\u00e4ringut:\r\n<ul>\r\n \t<li><code><span style=\"color: #970000\"><strong>SELECT<\/strong><\/span> nimi, rahvastikuarv <span style=\"color: #970000\"><strong>FROM<\/strong><\/span> riigid <span style=\"color: #970000\"><strong>LIMIT<\/strong><\/span> <span style=\"color: #0000ff\">3<\/span><span style=\"color: #ff0000\"><strong>;<\/strong><\/span><\/code><\/li>\r\n<\/ul>\r\nN\u00e4eme, et p\u00e4ringu tulemuses on vaid kolme riigi nimi ja rahvastikuarv.\r\n\r\n\u00c4ra ole eksitatud sellest, et p\u00e4ringu tulemuses on riikide nimed t\u00e4hestiku j\u00e4rjekorras. M\u00e4rks\u00f5na <strong><code><span style=\"color: #970000\">LIMIT<\/span><\/code><\/strong><code>\u00a0<\/code>omaette ei tegele p\u00e4ringu j\u00e4rjestamisega. Siinkohal lihtsalt juhtus, et tabelis Riigid on riigid juba algselt nimede alusel t\u00e4hestiku j\u00e4rjekorras.\r\n\r\nTasub teada, et m\u00e4rks\u00f5na <strong><code><span style=\"color: #970000\">LIMIT<\/span><\/code><\/strong> korrektseks kasutamiseks tuleb see alati kombineerida m\u00e4rks\u00f5napaariga <code><span style=\"color: #970000\"><strong>ORDER BY<\/strong><\/span><\/code>. Vastasel juhul on p\u00e4ringu tulemuses p\u00f5him\u00f5tteliselt piiratud arv suvalisi kirjeid.\r\n\r\n[h5p id=\"46\"]\r\n<h2>V\u00e4lisv\u00f5tmed<\/h2>\r\nKuigi v\u00e4lisv\u00f5tmeid k\u00e4sitleti p\u00f5gusalt juba <a href=\"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/part\/main-body\/\">eelmises moodulis<\/a>, uurime neid siinkohal veidi t\u00e4psemalt.\r\n\r\nV\u00e4lisv\u00f5tme loomine kahe tabeli vahele annab andmebaasi juhtimiss\u00fcsteemile teada, et need tabelid on omavahel seotud. Seose olemus t\u00e4psustatakse v\u00f5tme sees. Seostest andmebaasi juhtimiss\u00fcsteemile teada andmine aitab tabeleid paremini hallata ning kontrollida. Seda just olukordades, kui tabelites olevaid andmeid v\u00f5i ka tabeleid ise muutma v\u00f5i kustutama hakatakse.\r\n\r\nV\u00e4lisv\u00f5tmed tagavad selle, et \u00fches tabelis leiduvad v\u00e4\u00e4rtused, mis viitavad teisele tabelile, t\u00f5epoolest eksisteerivad ka teises tabelis. Seega aitavad v\u00e4lisv\u00f5tmed kaudselt kaasa mitme tabeli p\u00f5hjal p\u00e4ringute loomisele, mida \u00f5pime juba selles samas peat\u00fckis.\r\n\r\nV\u00e4lisv\u00f5tme loomisel tuleb SQL lauses t\u00e4psustada, et \u00fche tabeli mingi tunnus ja selle v\u00e4\u00e4rtused viitavad tegelikult teise tabeli tunnusele ja selle v\u00e4\u00e4rtustele. V\u00e4lisv\u00f5tme loomiseks peavad seotavate tunnuste andmet\u00fc\u00fcbid t\u00e4pselt kattuma, n\u00e4iteks peavad m\u00f5lemad olema t\u00fc\u00fcpi <span style=\"color: #000080\"><code><\/code><strong><code><span style=\"color: #970000\">INTEGER<\/span><\/code><\/strong><\/span>.\r\n\r\nMeie andmebaasis on vajalikud v\u00e4lisv\u00f5tmed juba loodud. Seega, juurde pole neid tarvis lisada. Vaatame siiski teadmiseks \u00fchte olemasolevat v\u00e4lisv\u00f5tit, kuidas seda loodi ning mida see nii\u00f6elda \u00fctleb.\r\n\r\nVaatame v\u00e4lisv\u00f5tit <code>naitlemine2isikud<\/code>, mis on tabeli Naitlemine tunnuse <code>naitleja_id<\/code> ja tabeli Isikud tunnuse <code>id<\/code> vahel ning mis loodi j\u00e4rgneva lausega:\r\n<ul>\r\n \t<li><code><span style=\"color: #970000\"><strong>ALTER TABLE<\/strong><\/span> naitlemine <span style=\"color: #970000\"><strong>ADD CONSTRAINT<\/strong><\/span> naitlemine2isikud <span style=\"color: #970000\"><strong>FOREIGN KEY<\/strong><\/span> (naitleja_id) <span style=\"color: #970000\"><strong>REFERENCES<\/strong><\/span> isikud(id) <span style=\"color: #970000\"><strong>ON DELETE CASCADE<\/strong> <strong>ON UPDATE CASCADE<\/strong><\/span><span style=\"color: #ff0000\"><strong>;<\/strong><\/span><\/code><\/li>\r\n<\/ul>\r\nVaatame selle lause osi ning nende t\u00e4hendusi l\u00e4hemalt:\r\n<table class=\"grid\" style=\"border-collapse: collapse;width: 100%\" border=\"0\">\r\n<tbody>\r\n<tr>\r\n<td><code><span style=\"color: #970000\"><strong>ALTER TABLE<\/strong><\/span> naitlemine<\/code><\/td>\r\n<td style=\"width: 50%\">Muudame tabelit Naitlemine<\/td>\r\n<\/tr>\r\n<tr>\r\n<td><code><span style=\"color: #970000\"><strong>ADD CONSTRAINT<\/strong><\/span> naitlemine2isikud<\/code><\/td>\r\n<td style=\"width: 50%\">Lisame tabelile kitsenduse nimega <code>naitlemine2isikud<\/code><\/td>\r\n<\/tr>\r\n<tr>\r\n<td><code><span style=\"color: #970000\"><strong>FOREIGN KEY<\/strong><\/span> (naitleja_id)<\/code><\/td>\r\n<td style=\"width: 50%\">Loodav kitsendus olgu v\u00e4lisv\u00f5ti, mis luuakse tabeli Naitlemine tunnuse <code>naitleja_id<\/code> p\u00f5hjal<\/td>\r\n<\/tr>\r\n<tr>\r\n<td><code><span style=\"color: #970000\"><strong>REFERENCES<\/strong><\/span> isikud(id)<\/code><\/td>\r\n<td style=\"width: 50%\">V\u00e4lisv\u00f5ti viitab tabeli Isikud tunnusele <code>id<\/code><\/td>\r\n<\/tr>\r\n<tr>\r\n<td><code><span style=\"color: #970000\"><strong>ON DELETE CASCADE<\/strong><\/span><\/code><\/td>\r\n<td style=\"width: 50%\">Tabelis Isikud mingi andmerea kustutamisel kustutame ka tabelis Naitlemine need andmeread, kus tunnuse <code>naitleja_id<\/code> v\u00e4\u00e4rtus kattus tabelis Isikud kustutatud andmerea tunnuse <code>id<\/code> v\u00e4\u00e4rtusega<\/td>\r\n<\/tr>\r\n<tr>\r\n<td><code><span style=\"color: #970000\"><strong>ON UPDATE CASCADE<\/strong><\/span><span style=\"color: #ff0000\"><strong>;<\/strong><\/span><\/code><\/td>\r\n<td style=\"width: 50%\">Tabelis Isikud mingi andmerea tunnuse <code>id<\/code> uuendamisel uuendame ka tabeli Naitlemine neid ridu, kus tunnuse <code>naitleja_id<\/code> v\u00e4\u00e4rtus kattus tabelis Isikud uuendatud andmerea tunnuse <code>id<\/code> v\u00e4\u00e4rtusega<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\nTuleta meelde, et juba mooduli <a href=\"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/part\/main-body\/\">Andmebaaside tutvustus<\/a> peat\u00fckis <a href=\"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/chapter\/vaikevaartused-ja-kitsendused\/\">Vaikev\u00e4\u00e4rtused ja kitsendused<\/a> oli juttu kitsendustest. Nagu n\u00e4ha, on ka v\u00e4lisv\u00f5tmed omamoodi kitsendused (vt lause <code><span style=\"color: #970000\"><strong>ADD CONSTRAINT<\/strong><\/span><\/code> osa), kuna nad m\u00e4\u00e4ravad, kuidas andmebaasi juhtimiss\u00fcsteem tabelite muutmise ja kustutamise korral toimima peaks.\r\n\r\nTabelite olemasolevaid v\u00e4lisv\u00f5tmeid saab tabelite kaupa ka ise l\u00e4hemalt uurida. Selleks tuleb <em>Projects<\/em> vaates navigeeruda vastava tabeli nimeni ning avada selle alamkaust <em>Foreign Keys<\/em>. Seal on n\u00e4ha k\u00f5iki vastava tabeli v\u00e4lisv\u00f5tmeid ning neile klikates saab ka nende sisu n\u00e4ha.\r\n\r\nKa k\u00f5iki \u00fche skeema tabelite v\u00e4lisv\u00f5tmeid on v\u00f5imalik korraga n\u00e4ha. Selleks tuleb navigeeruda vastava skeema alamkaustani <em>Tables<\/em>, teha sellele topeltklikk ning valida \u00fclevalt men\u00fc\u00fcst alamvaade <em>ER Diagram<\/em>. Seej\u00e4rel peaks avanema sarnane vaade.\r\n\r\n<img class=\"alignnone size-full wp-image-307\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/03\/9.png\" alt=\"Andmebaasi ER Diagram\" width=\"1024\" height=\"768\" \/>\r\n\r\nPildil olevad tabelitevahelised katkendjooned t\u00e4histavad olemasolevaid v\u00e4lisv\u00f5tmeid. Nende kohal hiirekursorit hoides on v\u00f5imalik n\u00e4ha ka nende nimesid.\r\n\r\nV\u00e4lisv\u00f5tmete uurimine n\u00e4idatud meetoditel on hea viis v\u00f5\u00f5ra andmebaasi \u00fclesehituse ja tabelite vaheliste seostega tutvumiseks.\r\n<h2>P\u00e4ringud mitme tabeli p\u00f5hjal<\/h2>\r\nVaatamegi l\u00f5puks, kuidas koostada p\u00e4ringuid mitme tabeli p\u00f5hjal. Nii saame p\u00e4ringu tulemuses kombineerida erinevate tabelite andmeid, mis aitab meil luua huvitavamaid ja kasulikemaid p\u00e4ringuid. N\u00e4iteks, mitme tabeli p\u00f5hjal loodud p\u00e4ringu tulemuses on korraga v\u00f5imalik kuvada nii riikide kui ka teoste nimesid. Seni \u00f5pitu p\u00f5hjal me seda teha ei saanud, kuna vastavad andmed asuvad erinevates tabelites.\r\n\r\nVaatame lihtsat n\u00e4idet, mis demonstreerib mitme tabeli p\u00f5hjal p\u00e4ringute loomise kasulikkust.\r\n\r\nOletame, et me soovime leida k\u00f5iki Soomes tehtud teoseid. Selleks peaksime esmalt tabelist Riigid leidma Soomele vastava ID (mis on 19). Seda saame teha kas <em>Data<\/em> vaate abil tabelit Riigid vaadeldes v\u00f5i jooksutades j\u00e4rgnevat p\u00e4ringut:\r\n<ul>\r\n \t<li><code><span style=\"color: #970000\"><strong>SELECT<\/strong><\/span> id <span style=\"color: #970000\"><strong>FROM<\/strong><\/span> riigid <span style=\"color: #970000\"><strong>WHERE<\/strong><\/span> nimi = <span style=\"color: #008000\">'Finland'<\/span><span style=\"color: #ff0000\"><strong>;<\/strong><\/span><\/code><\/li>\r\n<\/ul>\r\nSeej\u00e4rel saame Soomes tehtud filme leida kas <em>Data<\/em> vaates <a href=\"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/chapter\/grupeerimine-ja-gruppide-piiramine\/\">eelmises peat\u00fckis<\/a> \u00f5pitud meetodil andmeid filtreerides v\u00f5i jooksutades j\u00e4rgnevat p\u00e4ringut:\r\n<ul>\r\n \t<li><code><span style=\"color: #970000\"><strong>SELECT<\/strong><\/span> pealkiri <span style=\"color: #970000\"><strong>FROM<\/strong><\/span> teosed <span style=\"color: #970000\"><strong>WHERE<\/strong><\/span> id = <span style=\"color: #0000ff\">19<\/span><span style=\"color: #ff0000\"><strong>;<\/strong><\/span><\/code><\/li>\r\n<\/ul>\r\nKuigi lihtsamaid \u00fclesandeid saab niimoodi mitme sammuga t\u00e4ita k\u00fcll, on see suures plaanis kohmakas ning liialt aegan\u00f5udev.\r\n\r\nSama \u00fclesannet t\u00e4itev mitme tabeli p\u00f5hjal loodud p\u00e4ring n\u00e4eb v\u00e4lja j\u00e4rgnev:\r\n<ul>\r\n \t<li><code><span style=\"color: #970000\"><strong>SELECT<\/strong><\/span> teosed.pealkiri, riigid.nimi <\/code><strong><code><span style=\"color: #970000\">FROM<\/span><\/code><\/strong><code> teosed, riigid <span style=\"color: #970000\"><strong>WHERE<\/strong><\/span> teosed.riigi_id = riigid.id <span style=\"color: #970000\"><strong>AND<\/strong><\/span> riigid.nimi = <span style=\"color: #008000\">'Finland'<\/span><span style=\"color: #ff0000\"><strong>;<\/strong><\/span><\/code><\/li>\r\n<\/ul>\r\nEelolevas p\u00e4ringus on k\u00f5igi tunnuste puhul v\u00e4lja toodud ka see, millisest tabelist see p\u00e4rit on. Nagu n\u00e4ha, saab seda teha kujul <code>&lt;tabeli_nimi&gt;.&lt;tunnuse_nimi&gt;<\/code>. Siin on seda tehtud peamiselt selleks, et p\u00e4ringulause inimeste jaoks selgem oleks.\r\n\r\n[h5p id=\"47\"]\r\n\r\nVaatame n\u00fc\u00fcd, kuidas see p\u00e4ring t\u00e4pselt t\u00f6\u00f6tas.\r\n\r\nK\u00f5igepealt t\u00e4psustasime tunnused, mida soovime p\u00e4rida \u2013 teoste pealkirjad ja riikide nimed \u2013 ning ka tabelid, millest p\u00e4rime \u2013 Teosed ja Riigid.\r\n\r\nN\u00e4eme, et p\u00e4rides mitme tabeli p\u00f5hjal, tuleb tabelite nimed komadega eraldada, nii nagu eraldame omavahel ka tunnuseid.\r\n\r\nSeej\u00e4rel t\u00e4psustasime <code><span style=\"color: #970000\"><strong>WHERE<\/strong><\/span><\/code> osas esmalt seda, et <code>riigi_id<\/code> v\u00e4\u00e4rtus peab olema v\u00f5rdne <code>riigid.id<\/code> v\u00e4\u00e4rtusega. Selle tulemusena \u00fchendati k\u00f5igi teoste pealkirjad ID-de v\u00f5rdumise alusel vastavate riikide nimedega. L\u00f5puks piirasime <strong><code><span style=\"color: #970000\">WHERE<\/span><\/code><\/strong> osas p\u00e4ringu tulemust veel nii, et alles j\u00e4\u00e4ks vaid Soome teosed.\r\n\r\nVaatame uut n\u00e4idet. Oletame, et soovime leida, mitu korda on TOP 10 enim lavastanud lavastajat lavastanud ning j\u00e4rjestame nad lavastamiste arvu alusel kahanevalt.\r\n\r\nSeda k\u00f5ike saame leida jooksutades j\u00e4rgnevat p\u00e4ringut:\r\n<ul>\r\n \t<li><code><span style=\"color: #970000\"><strong>SELECT<\/strong><\/span> nimi, <span style=\"color: #000080\"><strong>COUNT<\/strong><\/span>(lavastamine.*) <span style=\"color: #970000\"><strong>FROM<\/strong><\/span> isikud, lavastamine <span style=\"color: #970000\"><strong>WHERE<\/strong><\/span> lavastamine.lavastaja_id = isikud.id <span style=\"color: #970000\"><strong>GROUP BY<\/strong><\/span> nimi <span style=\"color: #970000\"><strong>ORDER BY<\/strong><\/span> <span style=\"color: #000080\"><strong>COUNT<\/strong><\/span>(lavastamine.*) <\/code><strong><code><span style=\"color: #970000\">DESC LIMIT<\/span><\/code><\/strong><code> <span style=\"color: #0000ff\">10<\/span><\/code><strong><code><span style=\"color: #ff0000\">;<\/span><\/code><\/strong><\/li>\r\n<\/ul>\r\nVaatame ka selle p\u00e4ringu osade haaval \u00fcle.\r\n\r\nTaaskord andsime k\u00f5igepealt teada, mida soovime p\u00e4rida \u2013 lavastajate nimed ja lavastamiste arvud \u2013 ning ka tabelid, millest p\u00e4rime \u2013 Isikud ja Lavastamine.\r\n\r\nSeej\u00e4rel t\u00e4psustasime <code><span style=\"color: #970000\"><strong>WHERE<\/strong><\/span><\/code> osas seda, et <code>lavastaja_id<\/code> peab olema v\u00f5rdne <code>isikud.id<\/code> v\u00e4\u00e4rtusega, mille tulemusena \u00fchendati k\u00f5ik lavastamised ID-de v\u00f5rdumise alusel vastavate lavastajate nimedega.\r\n\r\nJ\u00e4rgmisena grupeerisime v\u00e4\u00e4rtused lavastajate nimede alusel selleks, et iga lavastaja nime k\u00f5rval n\u00e4idataks agregeeriva funktsiooni <code><span style=\"color: #000080\"><strong>COUNT<\/strong><\/span><\/code> abil leitud arv, mitu korda ta lavastanud on.\r\n\r\nL\u00f5puks j\u00e4rjestasime tulemused lavastamiste arvu alusel kahanevalt ning j\u00e4tsime neist alles vaid 10 esimest tulemust.\r\n\r\n[h5p id=\"48\"]\r\n\r\nMitme tabeli p\u00f5hjal p\u00e4ringuid luues ei pea kindlasti piirduma vaid kahe tabeliga. Tabeleid v\u00f5ib p\u00e4ringusse kaasata teoreetiliselt nii palju, kui neid andmebaasis leidub. Seda siiski eeldusel, et tabelid on omavahel sobivalt seotud.\r\n\r\nN\u00e4iteks, k\u00e4esolevas andmebaasis saab luua j\u00e4rgneva neljal tabelil p\u00f5hineva p\u00e4ringu:\r\n<ul>\r\n \t<li><code><span style=\"color: #970000\"><strong>SELECT<\/strong><\/span> pealkiri, riigid.nimi <span style=\"color: #970000\"><strong>AS<\/strong><\/span> riik, isikud.nimi <span style=\"color: #970000\"><strong>AS<\/strong><\/span> n\u00e4itleja <span style=\"color: #970000\"><strong>FROM<\/strong><\/span> teosed, riigid, naitlemine, isikud <span style=\"color: #970000\"><strong>WHERE<\/strong><\/span> teosed.riigi_id = riigid.id <span style=\"color: #970000\"><strong>AND<\/strong><\/span> naitlemine.teose_id = teosed.id <span style=\"color: #970000\"><strong>AND<\/strong><\/span> naitlemine.naitleja_id = isikud.id<span style=\"color: #ff0000\"><strong>;<\/strong><\/span><\/code><\/li>\r\n<\/ul>\r\nUuri p\u00f5hjalikult \u00fclalolevat p\u00e4ringut ning proovi m\u00f5ista, kuidas see t\u00e4pselt t\u00f6\u00f6tab ning mis on selle p\u00e4ringu tulemuses.\r\n\r\n[h5p id=\"49\"]\r\n\r\nProovi ka ise huvitavaid mitmel tabelil p\u00f5hinevaid p\u00e4ringuid v\u00e4lja m\u00f5elda. Katseta neis siiani \u00f5pitud tehteid, funktsioone, grupeerimist ja k\u00f5ike muud.\r\n\r\nN\u00fc\u00fcd oleme \u00f5ppinud p\u00e4ringute tulemusi j\u00e4rjestama ja nende seast suurimaid ja v\u00e4himaid leidma. Uurisime, mis on v\u00e4lisv\u00f5tmed ning \u00f5ppisime ka mitme tabeli p\u00f5hjal huvitavaid p\u00e4ringuid looma. J\u00e4rgmisena looma otsingumoorit sisaldava veebirakenduse Netflixi teoste otsimiseks.","rendered":"<h2>J\u00e4rjestamine<\/h2>\n<p>Seni koostatud p\u00e4ringute tulemusi oleks tihtipeale mugavam vaadata, kui need oleks millegi alusel j\u00e4rjestatud. N\u00e4iteks, eelmises peat\u00fckis p\u00e4risime populaarseid Netflixi n\u00e4itlejaid ning saime tulemusse v\u00e4ga palju kirjeid. Tulemus oleks kenam v\u00e4lja n\u00e4inud, kui n\u00e4itlejad oleksid teostes n\u00e4itlemiste arvu alusel j\u00e4rjestatud olnud.<\/p>\n<p>J\u00e4rjestamiseks kasutame m\u00e4rks\u00f5napaari <code><span style=\"color: #970000\"><strong>ORDER BY<\/strong><\/span><\/code>, mis k\u00e4ib seni\u00f5pitud p\u00e4ringulause kuju l\u00f5ppu.<\/p>\n<p>Jooksuta j\u00e4rgnevat p\u00e4ringut:<\/p>\n<ul>\n<li><code><span style=\"color: #970000\"><strong>SELECT<\/strong><\/span> naitleja_id, <\/code><strong><code><span style=\"color: #000080\">COUNT<\/span><\/code><\/strong><code>(*) <span style=\"color: #970000\"><strong>FROM<\/strong><\/span> naitlemine <span style=\"color: #970000\"><strong>GROUP BY<\/strong><\/span> naitleja_id <span style=\"color: #970000\"><strong>HAVING<\/strong><\/span> <span style=\"color: #000080\"><strong>COUNT<\/strong><\/span>(*) &gt;= <span style=\"color: #0000ff\">25<\/span> <span style=\"color: #970000\"><strong>ORDER BY<\/strong><\/span> <span style=\"color: #000080\"><strong>COUNT<\/strong><\/span>(*)<span style=\"color: #ff0000\"><strong>;<\/strong><\/span><\/code><\/li>\n<\/ul>\n<p>N\u00e4eme, et seekord on n\u00e4itlejate ID-d n\u00e4itlemiste arvu p\u00f5hjal j\u00e4rjestatud. Seega on p\u00e4ringu tulemusest m\u00e4rksa lihtsam \u00fclevaadet saada.<\/p>\n<p>Selle saavutasime kirjutades <code><span style=\"color: #970000\"><strong>ORDER BY<\/strong><\/span> <\/code><strong><code><span style=\"color: #000080\">COUNT<\/span><\/code><\/strong><code>(*)<\/code>. Sama h\u00e4sti oleks v\u00f5inud kirjutada <code><span style=\"color: #970000\"><strong>ORDER BY<\/strong><\/span> <span style=\"color: #0000ff\">2<\/span><\/code>, mis t\u00e4hendaks seda, et j\u00e4rjestamine tehakse <strong><code><span style=\"color: #970000\">SELECT<\/span><\/code><\/strong> osas oleva 2. tunnuse, avaldise v\u00f5i funktsiooni p\u00f5hjal, milleks oligi hetkel <span style=\"color: #000080\"><code><\/code><strong><code><span style=\"color: #000080\">COUNT<\/span><\/code><\/strong><\/span><code>(*)<\/code>.<\/p>\n<div id=\"h5p-43\">\n<div class=\"h5p-iframe-wrapper\"><iframe id=\"h5p-iframe-43\" class=\"h5p-iframe\" data-content-id=\"43\" style=\"height:1px\" src=\"about:blank\" frameBorder=\"0\" scrolling=\"no\" title=\"AP_18_kontrollk\u00fcsimus_1\"><\/iframe><\/div>\n<\/div>\n<p>Nagu n\u00e4gime n\u00e4idete p\u00f5hjal, siis vaikimisi toimub PostgreSQL&#8217;s j\u00e4rjestamine kasvavalt. J\u00e4rjestamise loogikat saab ka ise t\u00e4psustada, kasutades selleks abim\u00e4rks\u00f5nu <code><\/code><strong><code><span style=\"color: #970000\">ASC<\/span><\/code><\/strong> (<em>ascending<\/em>, ee kasvav) ja <code><span style=\"color: #970000\"><strong>DESC<\/strong><\/span><\/code> (<em>descending<\/em>, ee kahanev). T\u00e4psustavad m\u00e4rks\u00f5nad tuleb kirjutada terve <code><\/code><strong><code><span style=\"color: #970000\">ORDER BY<\/span><\/code><\/strong> osa l\u00f5ppu ehk \u00fcldse terve p\u00e4ringulause l\u00f5ppu.<\/p>\n<div id=\"h5p-44\">\n<div class=\"h5p-iframe-wrapper\"><iframe id=\"h5p-iframe-44\" class=\"h5p-iframe\" data-content-id=\"44\" style=\"height:1px\" src=\"about:blank\" frameBorder=\"0\" scrolling=\"no\" title=\"AP_18_kontrollk\u00fcsimus_2\"><\/iframe><\/div>\n<\/div>\n<p>P\u00e4ringu tulemusi v\u00f5ib j\u00e4rjestada ka mitmel alusel ning sellisel juhul on nende kirja paneku j\u00e4rjekord (p\u00e4rast m\u00e4rks\u00f5napaari <code><span style=\"color: #970000\"><strong>ORDER BY<\/strong><\/span><\/code>) oluline.<\/p>\n<div id=\"h5p-45\">\n<div class=\"h5p-iframe-wrapper\"><iframe id=\"h5p-iframe-45\" class=\"h5p-iframe\" data-content-id=\"45\" style=\"height:1px\" src=\"about:blank\" frameBorder=\"0\" scrolling=\"no\" title=\"AP_18_kontrollk\u00fcsimus_3\"><\/iframe><\/div>\n<\/div>\n<p>Tasub teada, et grupeerimise aluse ehk m\u00e4rks\u00f5nadele <strong><code><span style=\"color: #970000\">GROUP BY<\/span><\/code><\/strong> vahetult j\u00e4rgneva osa v\u00f5ib samuti asendada mingi sobiva arvuga, t\u00e4pselt nii nagu oleme teinud <code><span style=\"color: #970000\"><strong>ORDER BY<\/strong><\/span><\/code> puhul. See on mugav abivahend p\u00e4ringute kiiremaks kirjutamiseks. Samas on niiviisi vead kergemad tekkima, mis t\u00e4hendab, et tuleb t\u00e4helepanelik olla.<\/p>\n<h2>Suurimad ja v\u00e4himad<\/h2>\n<p>Isegi kui tulemusi piirata ja j\u00e4rjestada v\u00f5ib neid m\u00f5nikord ikkagi liiga palju olla, et nende p\u00f5hjal mugavalt j\u00e4reldusi teha saaks. Seega on vahepeal oluline, et p\u00e4ringu tulemus oleks v\u00f5imalikult l\u00fchike ja kokkuv\u00f5tlik.<\/p>\n<p>Siinkohal on abiks PostgreSQL&#8217;i m\u00e4rks\u00f5na <strong><code><span style=\"color: #970000\">LIMIT<\/span><\/code><\/strong>., mille abil saab otseselt piirata, mitut kirjet p\u00e4ringu tulemuses n\u00e4idatakse. M\u00e4rks\u00f5na k\u00e4ib taaskord terve seni\u00f5pitud p\u00e4ringu kuju l\u00f5ppu. Koos m\u00e4rks\u00f5naga <code><\/code><strong><code><span style=\"color: #970000\">LIMIT<\/span><\/code><\/strong> tuleb kirjutada ka arv, millega t\u00e4psustatakse, mitut tulemust alles soovitakse j\u00e4tta.<\/p>\n<p>Jooksuta j\u00e4rgnevat p\u00e4ringut:<\/p>\n<ul>\n<li><code><span style=\"color: #970000\"><strong>SELECT<\/strong><\/span> nimi, rahvastikuarv <span style=\"color: #970000\"><strong>FROM<\/strong><\/span> riigid <span style=\"color: #970000\"><strong>LIMIT<\/strong><\/span> <span style=\"color: #0000ff\">3<\/span><span style=\"color: #ff0000\"><strong>;<\/strong><\/span><\/code><\/li>\n<\/ul>\n<p>N\u00e4eme, et p\u00e4ringu tulemuses on vaid kolme riigi nimi ja rahvastikuarv.<\/p>\n<p>\u00c4ra ole eksitatud sellest, et p\u00e4ringu tulemuses on riikide nimed t\u00e4hestiku j\u00e4rjekorras. M\u00e4rks\u00f5na <strong><code><span style=\"color: #970000\">LIMIT<\/span><\/code><\/strong><code>\u00a0<\/code>omaette ei tegele p\u00e4ringu j\u00e4rjestamisega. Siinkohal lihtsalt juhtus, et tabelis Riigid on riigid juba algselt nimede alusel t\u00e4hestiku j\u00e4rjekorras.<\/p>\n<p>Tasub teada, et m\u00e4rks\u00f5na <strong><code><span style=\"color: #970000\">LIMIT<\/span><\/code><\/strong> korrektseks kasutamiseks tuleb see alati kombineerida m\u00e4rks\u00f5napaariga <code><span style=\"color: #970000\"><strong>ORDER BY<\/strong><\/span><\/code>. Vastasel juhul on p\u00e4ringu tulemuses p\u00f5him\u00f5tteliselt piiratud arv suvalisi kirjeid.<\/p>\n<div id=\"h5p-46\">\n<div class=\"h5p-iframe-wrapper\"><iframe id=\"h5p-iframe-46\" class=\"h5p-iframe\" data-content-id=\"46\" style=\"height:1px\" src=\"about:blank\" frameBorder=\"0\" scrolling=\"no\" title=\"AP_18_kontrollk\u00fcsimus_4\"><\/iframe><\/div>\n<\/div>\n<h2>V\u00e4lisv\u00f5tmed<\/h2>\n<p>Kuigi v\u00e4lisv\u00f5tmeid k\u00e4sitleti p\u00f5gusalt juba <a href=\"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/part\/main-body\/\">eelmises moodulis<\/a>, uurime neid siinkohal veidi t\u00e4psemalt.<\/p>\n<p>V\u00e4lisv\u00f5tme loomine kahe tabeli vahele annab andmebaasi juhtimiss\u00fcsteemile teada, et need tabelid on omavahel seotud. Seose olemus t\u00e4psustatakse v\u00f5tme sees. Seostest andmebaasi juhtimiss\u00fcsteemile teada andmine aitab tabeleid paremini hallata ning kontrollida. Seda just olukordades, kui tabelites olevaid andmeid v\u00f5i ka tabeleid ise muutma v\u00f5i kustutama hakatakse.<\/p>\n<p>V\u00e4lisv\u00f5tmed tagavad selle, et \u00fches tabelis leiduvad v\u00e4\u00e4rtused, mis viitavad teisele tabelile, t\u00f5epoolest eksisteerivad ka teises tabelis. Seega aitavad v\u00e4lisv\u00f5tmed kaudselt kaasa mitme tabeli p\u00f5hjal p\u00e4ringute loomisele, mida \u00f5pime juba selles samas peat\u00fckis.<\/p>\n<p>V\u00e4lisv\u00f5tme loomisel tuleb SQL lauses t\u00e4psustada, et \u00fche tabeli mingi tunnus ja selle v\u00e4\u00e4rtused viitavad tegelikult teise tabeli tunnusele ja selle v\u00e4\u00e4rtustele. V\u00e4lisv\u00f5tme loomiseks peavad seotavate tunnuste andmet\u00fc\u00fcbid t\u00e4pselt kattuma, n\u00e4iteks peavad m\u00f5lemad olema t\u00fc\u00fcpi <span style=\"color: #000080\"><code><\/code><strong><code><span style=\"color: #970000\">INTEGER<\/span><\/code><\/strong><\/span>.<\/p>\n<p>Meie andmebaasis on vajalikud v\u00e4lisv\u00f5tmed juba loodud. Seega, juurde pole neid tarvis lisada. Vaatame siiski teadmiseks \u00fchte olemasolevat v\u00e4lisv\u00f5tit, kuidas seda loodi ning mida see nii\u00f6elda \u00fctleb.<\/p>\n<p>Vaatame v\u00e4lisv\u00f5tit <code>naitlemine2isikud<\/code>, mis on tabeli Naitlemine tunnuse <code>naitleja_id<\/code> ja tabeli Isikud tunnuse <code>id<\/code> vahel ning mis loodi j\u00e4rgneva lausega:<\/p>\n<ul>\n<li><code><span style=\"color: #970000\"><strong>ALTER TABLE<\/strong><\/span> naitlemine <span style=\"color: #970000\"><strong>ADD CONSTRAINT<\/strong><\/span> naitlemine2isikud <span style=\"color: #970000\"><strong>FOREIGN KEY<\/strong><\/span> (naitleja_id) <span style=\"color: #970000\"><strong>REFERENCES<\/strong><\/span> isikud(id) <span style=\"color: #970000\"><strong>ON DELETE CASCADE<\/strong> <strong>ON UPDATE CASCADE<\/strong><\/span><span style=\"color: #ff0000\"><strong>;<\/strong><\/span><\/code><\/li>\n<\/ul>\n<p>Vaatame selle lause osi ning nende t\u00e4hendusi l\u00e4hemalt:<\/p>\n<table class=\"grid\" style=\"border-collapse: collapse;width: 100%\">\n<tbody>\n<tr>\n<td><code><span style=\"color: #970000\"><strong>ALTER TABLE<\/strong><\/span> naitlemine<\/code><\/td>\n<td style=\"width: 50%\">Muudame tabelit Naitlemine<\/td>\n<\/tr>\n<tr>\n<td><code><span style=\"color: #970000\"><strong>ADD CONSTRAINT<\/strong><\/span> naitlemine2isikud<\/code><\/td>\n<td style=\"width: 50%\">Lisame tabelile kitsenduse nimega <code>naitlemine2isikud<\/code><\/td>\n<\/tr>\n<tr>\n<td><code><span style=\"color: #970000\"><strong>FOREIGN KEY<\/strong><\/span> (naitleja_id)<\/code><\/td>\n<td style=\"width: 50%\">Loodav kitsendus olgu v\u00e4lisv\u00f5ti, mis luuakse tabeli Naitlemine tunnuse <code>naitleja_id<\/code> p\u00f5hjal<\/td>\n<\/tr>\n<tr>\n<td><code><span style=\"color: #970000\"><strong>REFERENCES<\/strong><\/span> isikud(id)<\/code><\/td>\n<td style=\"width: 50%\">V\u00e4lisv\u00f5ti viitab tabeli Isikud tunnusele <code>id<\/code><\/td>\n<\/tr>\n<tr>\n<td><code><span style=\"color: #970000\"><strong>ON DELETE CASCADE<\/strong><\/span><\/code><\/td>\n<td style=\"width: 50%\">Tabelis Isikud mingi andmerea kustutamisel kustutame ka tabelis Naitlemine need andmeread, kus tunnuse <code>naitleja_id<\/code> v\u00e4\u00e4rtus kattus tabelis Isikud kustutatud andmerea tunnuse <code>id<\/code> v\u00e4\u00e4rtusega<\/td>\n<\/tr>\n<tr>\n<td><code><span style=\"color: #970000\"><strong>ON UPDATE CASCADE<\/strong><\/span><span style=\"color: #ff0000\"><strong>;<\/strong><\/span><\/code><\/td>\n<td style=\"width: 50%\">Tabelis Isikud mingi andmerea tunnuse <code>id<\/code> uuendamisel uuendame ka tabeli Naitlemine neid ridu, kus tunnuse <code>naitleja_id<\/code> v\u00e4\u00e4rtus kattus tabelis Isikud uuendatud andmerea tunnuse <code>id<\/code> v\u00e4\u00e4rtusega<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Tuleta meelde, et juba mooduli <a href=\"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/part\/main-body\/\">Andmebaaside tutvustus<\/a> peat\u00fckis <a href=\"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/chapter\/vaikevaartused-ja-kitsendused\/\">Vaikev\u00e4\u00e4rtused ja kitsendused<\/a> oli juttu kitsendustest. Nagu n\u00e4ha, on ka v\u00e4lisv\u00f5tmed omamoodi kitsendused (vt lause <code><span style=\"color: #970000\"><strong>ADD CONSTRAINT<\/strong><\/span><\/code> osa), kuna nad m\u00e4\u00e4ravad, kuidas andmebaasi juhtimiss\u00fcsteem tabelite muutmise ja kustutamise korral toimima peaks.<\/p>\n<p>Tabelite olemasolevaid v\u00e4lisv\u00f5tmeid saab tabelite kaupa ka ise l\u00e4hemalt uurida. Selleks tuleb <em>Projects<\/em> vaates navigeeruda vastava tabeli nimeni ning avada selle alamkaust <em>Foreign Keys<\/em>. Seal on n\u00e4ha k\u00f5iki vastava tabeli v\u00e4lisv\u00f5tmeid ning neile klikates saab ka nende sisu n\u00e4ha.<\/p>\n<p>Ka k\u00f5iki \u00fche skeema tabelite v\u00e4lisv\u00f5tmeid on v\u00f5imalik korraga n\u00e4ha. Selleks tuleb navigeeruda vastava skeema alamkaustani <em>Tables<\/em>, teha sellele topeltklikk ning valida \u00fclevalt men\u00fc\u00fcst alamvaade <em>ER Diagram<\/em>. Seej\u00e4rel peaks avanema sarnane vaade.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-307\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/03\/9.png\" alt=\"Andmebaasi ER Diagram\" width=\"1024\" height=\"768\" srcset=\"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/03\/9.png 1024w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/03\/9-300x225.png 300w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/03\/9-768x576.png 768w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/03\/9-65x49.png 65w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/03\/9-225x169.png 225w, https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-content\/uploads\/sites\/21\/2021\/03\/9-350x263.png 350w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>Pildil olevad tabelitevahelised katkendjooned t\u00e4histavad olemasolevaid v\u00e4lisv\u00f5tmeid. Nende kohal hiirekursorit hoides on v\u00f5imalik n\u00e4ha ka nende nimesid.<\/p>\n<p>V\u00e4lisv\u00f5tmete uurimine n\u00e4idatud meetoditel on hea viis v\u00f5\u00f5ra andmebaasi \u00fclesehituse ja tabelite vaheliste seostega tutvumiseks.<\/p>\n<h2>P\u00e4ringud mitme tabeli p\u00f5hjal<\/h2>\n<p>Vaatamegi l\u00f5puks, kuidas koostada p\u00e4ringuid mitme tabeli p\u00f5hjal. Nii saame p\u00e4ringu tulemuses kombineerida erinevate tabelite andmeid, mis aitab meil luua huvitavamaid ja kasulikemaid p\u00e4ringuid. N\u00e4iteks, mitme tabeli p\u00f5hjal loodud p\u00e4ringu tulemuses on korraga v\u00f5imalik kuvada nii riikide kui ka teoste nimesid. Seni \u00f5pitu p\u00f5hjal me seda teha ei saanud, kuna vastavad andmed asuvad erinevates tabelites.<\/p>\n<p>Vaatame lihtsat n\u00e4idet, mis demonstreerib mitme tabeli p\u00f5hjal p\u00e4ringute loomise kasulikkust.<\/p>\n<p>Oletame, et me soovime leida k\u00f5iki Soomes tehtud teoseid. Selleks peaksime esmalt tabelist Riigid leidma Soomele vastava ID (mis on 19). Seda saame teha kas <em>Data<\/em> vaate abil tabelit Riigid vaadeldes v\u00f5i jooksutades j\u00e4rgnevat p\u00e4ringut:<\/p>\n<ul>\n<li><code><span style=\"color: #970000\"><strong>SELECT<\/strong><\/span> id <span style=\"color: #970000\"><strong>FROM<\/strong><\/span> riigid <span style=\"color: #970000\"><strong>WHERE<\/strong><\/span> nimi = <span style=\"color: #008000\">'Finland'<\/span><span style=\"color: #ff0000\"><strong>;<\/strong><\/span><\/code><\/li>\n<\/ul>\n<p>Seej\u00e4rel saame Soomes tehtud filme leida kas <em>Data<\/em> vaates <a href=\"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/chapter\/grupeerimine-ja-gruppide-piiramine\/\">eelmises peat\u00fckis<\/a> \u00f5pitud meetodil andmeid filtreerides v\u00f5i jooksutades j\u00e4rgnevat p\u00e4ringut:<\/p>\n<ul>\n<li><code><span style=\"color: #970000\"><strong>SELECT<\/strong><\/span> pealkiri <span style=\"color: #970000\"><strong>FROM<\/strong><\/span> teosed <span style=\"color: #970000\"><strong>WHERE<\/strong><\/span> id = <span style=\"color: #0000ff\">19<\/span><span style=\"color: #ff0000\"><strong>;<\/strong><\/span><\/code><\/li>\n<\/ul>\n<p>Kuigi lihtsamaid \u00fclesandeid saab niimoodi mitme sammuga t\u00e4ita k\u00fcll, on see suures plaanis kohmakas ning liialt aegan\u00f5udev.<\/p>\n<p>Sama \u00fclesannet t\u00e4itev mitme tabeli p\u00f5hjal loodud p\u00e4ring n\u00e4eb v\u00e4lja j\u00e4rgnev:<\/p>\n<ul>\n<li><code><span style=\"color: #970000\"><strong>SELECT<\/strong><\/span> teosed.pealkiri, riigid.nimi <\/code><strong><code><span style=\"color: #970000\">FROM<\/span><\/code><\/strong><code> teosed, riigid <span style=\"color: #970000\"><strong>WHERE<\/strong><\/span> teosed.riigi_id = riigid.id <span style=\"color: #970000\"><strong>AND<\/strong><\/span> riigid.nimi = <span style=\"color: #008000\">'Finland'<\/span><span style=\"color: #ff0000\"><strong>;<\/strong><\/span><\/code><\/li>\n<\/ul>\n<p>Eelolevas p\u00e4ringus on k\u00f5igi tunnuste puhul v\u00e4lja toodud ka see, millisest tabelist see p\u00e4rit on. Nagu n\u00e4ha, saab seda teha kujul <code>&lt;tabeli_nimi&gt;.&lt;tunnuse_nimi&gt;<\/code>. Siin on seda tehtud peamiselt selleks, et p\u00e4ringulause inimeste jaoks selgem oleks.<\/p>\n<div id=\"h5p-47\">\n<div class=\"h5p-iframe-wrapper\"><iframe id=\"h5p-iframe-47\" class=\"h5p-iframe\" data-content-id=\"47\" style=\"height:1px\" src=\"about:blank\" frameBorder=\"0\" scrolling=\"no\" title=\"AP_18_kontrollk\u00fcsimus_5\"><\/iframe><\/div>\n<\/div>\n<p>Vaatame n\u00fc\u00fcd, kuidas see p\u00e4ring t\u00e4pselt t\u00f6\u00f6tas.<\/p>\n<p>K\u00f5igepealt t\u00e4psustasime tunnused, mida soovime p\u00e4rida \u2013 teoste pealkirjad ja riikide nimed \u2013 ning ka tabelid, millest p\u00e4rime \u2013 Teosed ja Riigid.<\/p>\n<p>N\u00e4eme, et p\u00e4rides mitme tabeli p\u00f5hjal, tuleb tabelite nimed komadega eraldada, nii nagu eraldame omavahel ka tunnuseid.<\/p>\n<p>Seej\u00e4rel t\u00e4psustasime <code><span style=\"color: #970000\"><strong>WHERE<\/strong><\/span><\/code> osas esmalt seda, et <code>riigi_id<\/code> v\u00e4\u00e4rtus peab olema v\u00f5rdne <code>riigid.id<\/code> v\u00e4\u00e4rtusega. Selle tulemusena \u00fchendati k\u00f5igi teoste pealkirjad ID-de v\u00f5rdumise alusel vastavate riikide nimedega. L\u00f5puks piirasime <strong><code><span style=\"color: #970000\">WHERE<\/span><\/code><\/strong> osas p\u00e4ringu tulemust veel nii, et alles j\u00e4\u00e4ks vaid Soome teosed.<\/p>\n<p>Vaatame uut n\u00e4idet. Oletame, et soovime leida, mitu korda on TOP 10 enim lavastanud lavastajat lavastanud ning j\u00e4rjestame nad lavastamiste arvu alusel kahanevalt.<\/p>\n<p>Seda k\u00f5ike saame leida jooksutades j\u00e4rgnevat p\u00e4ringut:<\/p>\n<ul>\n<li><code><span style=\"color: #970000\"><strong>SELECT<\/strong><\/span> nimi, <span style=\"color: #000080\"><strong>COUNT<\/strong><\/span>(lavastamine.*) <span style=\"color: #970000\"><strong>FROM<\/strong><\/span> isikud, lavastamine <span style=\"color: #970000\"><strong>WHERE<\/strong><\/span> lavastamine.lavastaja_id = isikud.id <span style=\"color: #970000\"><strong>GROUP BY<\/strong><\/span> nimi <span style=\"color: #970000\"><strong>ORDER BY<\/strong><\/span> <span style=\"color: #000080\"><strong>COUNT<\/strong><\/span>(lavastamine.*) <\/code><strong><code><span style=\"color: #970000\">DESC LIMIT<\/span><\/code><\/strong><code> <span style=\"color: #0000ff\">10<\/span><\/code><strong><code><span style=\"color: #ff0000\">;<\/span><\/code><\/strong><\/li>\n<\/ul>\n<p>Vaatame ka selle p\u00e4ringu osade haaval \u00fcle.<\/p>\n<p>Taaskord andsime k\u00f5igepealt teada, mida soovime p\u00e4rida \u2013 lavastajate nimed ja lavastamiste arvud \u2013 ning ka tabelid, millest p\u00e4rime \u2013 Isikud ja Lavastamine.<\/p>\n<p>Seej\u00e4rel t\u00e4psustasime <code><span style=\"color: #970000\"><strong>WHERE<\/strong><\/span><\/code> osas seda, et <code>lavastaja_id<\/code> peab olema v\u00f5rdne <code>isikud.id<\/code> v\u00e4\u00e4rtusega, mille tulemusena \u00fchendati k\u00f5ik lavastamised ID-de v\u00f5rdumise alusel vastavate lavastajate nimedega.<\/p>\n<p>J\u00e4rgmisena grupeerisime v\u00e4\u00e4rtused lavastajate nimede alusel selleks, et iga lavastaja nime k\u00f5rval n\u00e4idataks agregeeriva funktsiooni <code><span style=\"color: #000080\"><strong>COUNT<\/strong><\/span><\/code> abil leitud arv, mitu korda ta lavastanud on.<\/p>\n<p>L\u00f5puks j\u00e4rjestasime tulemused lavastamiste arvu alusel kahanevalt ning j\u00e4tsime neist alles vaid 10 esimest tulemust.<\/p>\n<div id=\"h5p-48\">\n<div class=\"h5p-iframe-wrapper\"><iframe id=\"h5p-iframe-48\" class=\"h5p-iframe\" data-content-id=\"48\" style=\"height:1px\" src=\"about:blank\" frameBorder=\"0\" scrolling=\"no\" title=\"AP_18_kontrollk\u00fcsimus_6\"><\/iframe><\/div>\n<\/div>\n<p>Mitme tabeli p\u00f5hjal p\u00e4ringuid luues ei pea kindlasti piirduma vaid kahe tabeliga. Tabeleid v\u00f5ib p\u00e4ringusse kaasata teoreetiliselt nii palju, kui neid andmebaasis leidub. Seda siiski eeldusel, et tabelid on omavahel sobivalt seotud.<\/p>\n<p>N\u00e4iteks, k\u00e4esolevas andmebaasis saab luua j\u00e4rgneva neljal tabelil p\u00f5hineva p\u00e4ringu:<\/p>\n<ul>\n<li><code><span style=\"color: #970000\"><strong>SELECT<\/strong><\/span> pealkiri, riigid.nimi <span style=\"color: #970000\"><strong>AS<\/strong><\/span> riik, isikud.nimi <span style=\"color: #970000\"><strong>AS<\/strong><\/span> n\u00e4itleja <span style=\"color: #970000\"><strong>FROM<\/strong><\/span> teosed, riigid, naitlemine, isikud <span style=\"color: #970000\"><strong>WHERE<\/strong><\/span> teosed.riigi_id = riigid.id <span style=\"color: #970000\"><strong>AND<\/strong><\/span> naitlemine.teose_id = teosed.id <span style=\"color: #970000\"><strong>AND<\/strong><\/span> naitlemine.naitleja_id = isikud.id<span style=\"color: #ff0000\"><strong>;<\/strong><\/span><\/code><\/li>\n<\/ul>\n<p>Uuri p\u00f5hjalikult \u00fclalolevat p\u00e4ringut ning proovi m\u00f5ista, kuidas see t\u00e4pselt t\u00f6\u00f6tab ning mis on selle p\u00e4ringu tulemuses.<\/p>\n<div id=\"h5p-49\">\n<div class=\"h5p-iframe-wrapper\"><iframe id=\"h5p-iframe-49\" class=\"h5p-iframe\" data-content-id=\"49\" style=\"height:1px\" src=\"about:blank\" frameBorder=\"0\" scrolling=\"no\" title=\"AP_18_kontrollk\u00fcsimus_7\"><\/iframe><\/div>\n<\/div>\n<p>Proovi ka ise huvitavaid mitmel tabelil p\u00f5hinevaid p\u00e4ringuid v\u00e4lja m\u00f5elda. Katseta neis siiani \u00f5pitud tehteid, funktsioone, grupeerimist ja k\u00f5ike muud.<\/p>\n<p>N\u00fc\u00fcd oleme \u00f5ppinud p\u00e4ringute tulemusi j\u00e4rjestama ja nende seast suurimaid ja v\u00e4himaid leidma. Uurisime, mis on v\u00e4lisv\u00f5tmed ning \u00f5ppisime ka mitme tabeli p\u00f5hjal huvitavaid p\u00e4ringuid looma. J\u00e4rgmisena looma otsingumoorit sisaldava veebirakenduse Netflixi teoste otsimiseks.<\/p>\n","protected":false},"author":32,"menu_order":8,"template":"","meta":{"pb_show_title":"on","pb_short_title":"","pb_subtitle":"","pb_authors":[],"pb_section_license":""},"chapter-type":[],"contributor":[],"license":[],"class_list":["post-241","chapter","type-chapter","status-publish","hentry"],"part":31,"_links":{"self":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-json\/pressbooks\/v2\/chapters\/241","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-json\/pressbooks\/v2\/chapters"}],"about":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-json\/wp\/v2\/types\/chapter"}],"author":[{"embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-json\/wp\/v2\/users\/32"}],"version-history":[{"count":99,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-json\/pressbooks\/v2\/chapters\/241\/revisions"}],"predecessor-version":[{"id":1366,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-json\/pressbooks\/v2\/chapters\/241\/revisions\/1366"}],"part":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-json\/pressbooks\/v2\/parts\/31"}],"metadata":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-json\/pressbooks\/v2\/chapters\/241\/metadata\/"}],"wp:attachment":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-json\/wp\/v2\/media?parent=241"}],"wp:term":[{"taxonomy":"chapter-type","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-json\/pressbooks\/v2\/chapter-type?post=241"},{"taxonomy":"contributor","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-json\/wp\/v2\/contributor?post=241"},{"taxonomy":"license","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-json\/wp\/v2\/license?post=241"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}