{"id":644,"date":"2023-05-21T22:13:49","date_gmt":"2023-05-21T22:13:49","guid":{"rendered":"https:\/\/tarkvara.thkit.ee\/veeb\/?page_id=644"},"modified":"2023-06-08T12:45:00","modified_gmt":"2023-06-08T12:45:00","slug":"edasijoudnutele","status":"publish","type":"page","link":"https:\/\/tarkvara.thkit.ee\/veeb\/edasijoudnutele\/","title":{"rendered":"Edasij\u00f5udnutele"},"content":{"rendered":"\n<h4 class=\"wp-block-heading\">Tingimuste kombineerimine<\/h4>\n\n\n\n<p>Olemasolevaid tingimusi saab alati omavahel kombineerida. AND n\u00f5uab, et m\u00f5lemad tingimuse pooled oleksid t\u00e4idetud, OR seevastu piirdub n\u00f5udega, et v\u00e4hemalt \u00fcks tingimustest oleks t\u00f5ene. K\u00f5igepealt siis nimed, mis l\u00f5ppevad i-ga ning s\u00fcnnilinn on Tartu (kood 2)<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"383\" height=\"320\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-28.png\" alt=\"\" class=\"wp-image-654\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-28.png 383w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-28-300x251.png 300w\" sizes=\"auto, (max-width: 383px) 100vw, 383px\" \/><\/figure>\n\n\n\n<p>Edasi k\u00f5ik i-l\u00f5pulised nimed pluss veel lisaks k\u00f5ik, kes s\u00fcndinud Tartus. Nimesid korduvalt siiski ei n\u00e4idata. Kuigi Siiri ja Mari vastavad m\u00f5lemale tingimusele, on nad nimekirjas siiski ainult \u00fche korra.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"355\" height=\"328\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-29.png\" alt=\"\" class=\"wp-image-656\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-29.png 355w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-29-300x277.png 300w\" sizes=\"auto, (max-width: 355px) 100vw, 355px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">IN<\/h4>\n\n\n\n<p>Tahtes ette anda lubatud v\u00e4\u00e4rtuste hulka, millele otsitav peab vastama, aitab k\u00e4sklus IN. J\u00e4rgnevalt siis tegelased, kelle s\u00fcnniaastaks on kas 1995 v\u00f5i 1997.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"332\" height=\"379\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-30.png\" alt=\"\" class=\"wp-image-659\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-30.png 332w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-30-263x300.png 263w\" sizes=\"auto, (max-width: 332px) 100vw, 332px\" \/><\/figure>\n\n\n\n<p>Sama tulemuse saab ka kombineerides OR operaatoriga otsesed v\u00f5rdused:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nSELECT LapsID, Nimi, Synniaasta\nFROM dbo.Laps_tbl\nWHERE synniaasta = 1995 OR synniaasta = 1997\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"377\" height=\"369\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-31.png\" alt=\"\" class=\"wp-image-662\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-31.png 377w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-31-300x294.png 300w\" sizes=\"auto, (max-width: 377px) 100vw, 377px\" \/><\/figure>\n\n\n\n<p>Kuigi tulemus on sama ja SQL Server k\u00e4sitleb neid p\u00e4ringuid \u00fchtemoodi on IN operaatori kasutamine \u00fclevaatlikum.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><a><\/a><a><\/a> NOT<\/h4>\n\n\n\n<p>NOT p\u00f6\u00f6rab tulemuse \u00fcmber. Ehk siis k\u00f5ik need lapsed, kes ei ole s\u00fcndinud aastal 1996.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"302\" height=\"357\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-32.png\" alt=\"\" class=\"wp-image-664\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-32.png 302w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-32-254x300.png 254w\" sizes=\"auto, (max-width: 302px) 100vw, 302px\" \/><\/figure>\n\n\n\n<p>V\u00f5imaluse korral soovitatakse NOTi mitte pruukida, sest enamasti peab sel juhul andmebaasimootor vaatama l\u00e4bi tabeli k\u00f5ik read, mis on suurte andmemahtude juures k\u00fcllalt suur t\u00f6\u00f6. Aga kui muidu l\u00e4bi ei saa, eks siis peab ikka selle s\u00f5na kirjutama.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">TOP, p\u00e4ringu algusosa<\/h4>\n\n\n\n<p>Lihtsalt andmetest \u00fclevaate saamiseks ei ole vaja sageli k\u00f5ike n\u00e4ha. Samuti, kui soovime viite kiiremat jooksjat v\u00f5i viite vanemat autot, siis on mugav, kui p\u00e4ring kohe annabki meile soovitu k\u00e4tte, mitte ei pea hakkama ise pead vaevama, kuidas soovitud kohast andmeid v\u00f5tma hakata. Laste tabelist t\u00e4hestiku j\u00e4rjekorras kolm esimest nime n\u00e4iteks saab k\u00e4tte nii.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"340\" height=\"323\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-34.png\" alt=\"\" class=\"wp-image-669\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-34.png 340w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-34-300x285.png 300w\" sizes=\"auto, (max-width: 340px) 100vw, 340px\" \/><\/figure>\n\n\n\n<p>Tahtes saada neli vanemat last, tuleb andmed sorteerida s\u00fcnniaasta j\u00e4rgi.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"313\" height=\"349\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-36.png\" alt=\"\" class=\"wp-image-672\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-36.png 313w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-36-269x300.png 269w\" sizes=\"auto, (max-width: 313px) 100vw, 313px\" \/><\/figure>\n\n\n\n<p>Tekib aga probleem: kuna andmed on salvestatud aasta t\u00e4psusega, siis v\u00f5etakse 1996ndal aastal s\u00fcndinutest lihtsalt juhuslik komplekt ning \u00fclej\u00e4\u00e4nud j\u00e4\u00e4vad n\u00e4itamata. M\u00f5nikord pole sellest hullu \u2013 saadi juhuslikud tegelased kokku ja sobib k\u00fcll. Teinekord aga v\u00f5ivad samade tunnustega osalejad porisema hakata, kui \u00fcks neist kaasa v\u00f5eti ja teine mitte. Et saaks k\u00f5ik ausalt kaasa, kes teistega v\u00f5rdsed, selleks saab TOP k\u00e4sklusele lisada WITH TIES. Nii v\u00f5etakse siin n\u00e4ites v\u00e4hemalt kolm. Ning kui jagub j\u00e4rjestatava tunnuse alusel viimasega v\u00f5rdseid mahaj\u00e4\u00e4jaid, v\u00f5etakse ka nemad kaasa.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"402\" height=\"380\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-37.png\" alt=\"\" class=\"wp-image-674\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-37.png 402w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-37-300x284.png 300w\" sizes=\"auto, (max-width: 402px) 100vw, 402px\" \/><\/figure>\n\n\n\n<p>Lisaks fikseeritud ridade arvule v\u00f5ime m\u00e4\u00e4rata ridade arvu ka proportsionaalselt kogu ridade hulgast e. kasutada protsenti. N\u00e4iteks v\u00f5ime v\u00e4lja tuua neli protsenti k\u00f5ige vanemaid lapsi:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"371\" height=\"298\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-38.png\" alt=\"\" class=\"wp-image-676\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-38.png 371w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-38-300x241.png 300w\" sizes=\"auto, (max-width: 371px) 100vw, 371px\" \/><\/figure>\n\n\n\n<p>4 protsenti kuuest lapsest on k\u00fcll suhteliselt tilluke arv. Aga et n\u00e4idates \u00fcmardatakse arve \u00fclespoole, siis n\u00e4eme ikkagi v\u00e4hemasti \u00fche lapse andmeid.<\/p>\n\n\n\n<p>SQL Server 2005 t\u00e4iendab TOP k\u00e4su s\u00fcntaksid \u00fche v\u00e4ikese, kuid \u00e4\u00e4rmiselt olulise v\u00f5imalusega: nimelt on v\u00f5imalik ridu piirava konstandi asemel kasutada ka muutujat v\u00f5i isegi alamp\u00e4ringut! See annab juurde v\u00e4ga palju uusi v\u00f5imalusi p\u00e4ringute ja ka salvestatud protseduuride loomisel. Nii saab luua rakenduse, kus kasutaja ise \u00fctleb, mitut rida ta soovib n\u00e4ha. N\u00e4iteks loome protseduuri, mis tagastab soovitud hulga vanimaid lapsi:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nCREATE PROC VanimadLapsed_proc\n\t@LasteArv int\nAS\n\tIF (@LasteArv &gt;0)\nSELECT TOP (@LasteArv) nimi, synniaasta \nFROM dbo.Laps_tbl\nORDER BY synniaasta\n\tELSE\n\t\tPRINT &#039;L\u00e4hteandmed p\u00e4ringu tegemiseks on vigased!&#039;\n<\/pre><\/div>\n\n\n<p>Enne SQL 2005 puudus ka v\u00f5imalus vahepealt valimiseks e. kui soovite tuua alates 3ndast kuni 5nda reani. SQL 2005 on tekitada tulemusse reanumbrid ning nende j\u00e4rgi ka filtreerida. Selleks saab kasutada ROW_NUMBER() funktsiooni.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"648\" height=\"363\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-39.png\" alt=\"\" class=\"wp-image-681\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-39.png 648w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-39-300x168.png 300w\" sizes=\"auto, (max-width: 648px) 100vw, 648px\" \/><\/figure>\n\n\n\n<p>S\u00fcntaks on siis j\u00e4rgmine: ROW_NUMBER() OVER (partitsioon) st OVER m\u00e4rks\u00f5na j\u00e4rgi sulgudes tuleb \u00f6elda, mis moodi on read nummerdatud. Antud n\u00e4ites nummerdatakse s\u00fcnniaastate j\u00e4rgi kasvavasse j\u00e4rjekorda.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Grupeerimine<\/h4>\n\n\n\n<p>Eelnevalt uurisime agregaatfunktsioone suurima, v\u00e4hima, keskmise, summa ja koguse leidmiseks. Nad on kogu tabeli kohta head abilised. WHERE-tingimuse abil saab filtreerida sobiva tunnuse v\u00e4\u00e4rtuse alusel read v\u00e4lja ning siis nende p\u00f5hjal kokkuv\u00f5tteid teha. N\u00e4iteks leida k\u00f5ikide nende laste keskmise pikkuse, kes s\u00fcndinud aastal 1996. Selgub aga, et k\u00e4sklus lubab veelgi peenema statistika ette v\u00f5tta.<\/p>\n\n\n\n<p>Seik autori oma kogemusest. Kord oli vaja \u00fchele firmale teha veebip\u00f5hine rakendus komandeeringuaruannete sisestamiseks ning kokkuv\u00f5tete vaatamiseks. Iseenesest pealtn\u00e4ha lihtne \u00fclesanne: iga\u00fcks annab teada, kus ta k\u00e4is, mida tegi ning kui palju raha kulus ja p\u00e4rast loetakse n\u00e4dalate, kuude, aastate ja isikute l\u00f5ikes k\u00f5ikv\u00f5imalikud andmed kokku. Muuhulgas oli vaja teada, mitu korda konkreetsel aastal millist linna on komandeeringu raames k\u00fclastatud. SQL oli tuttav ligikaudu samapalju, kuiv\u00f5rd lugeja kirjutises siiamaani j\u00f5udes. Et ka paarilt tuttavalt n\u00f5u k\u00fcsimine ei aidanud edasi, tuli ise vastav programmike kirjutada. Pool p\u00e4eva t\u00f6\u00f6d, paar lehek\u00fclge koodi ning tulemus oli valmis ja sobis t\u00f6\u00f6andjale. Suur oli aga \u00fcllatus, kui paar p\u00e4eva hiljem SQLi manuaale uurides leidus v\u00f5imalus seesama t\u00f6\u00f6 \u00fche suhteliselt lihtsa lausega kirja panna.<\/p>\n\n\n\n<p>N\u00fc\u00fcd siis m\u00f5ned n\u00e4ited ja seletused, et siinse kirjutise lugejad ei peaks sama pikka ja okkalist teed l\u00e4bi k\u00e4ima. Algul meeldetuletuseks laste andmed, et oleks n\u00e4ha, mida ja kuidas grupeeritakse.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"424\" height=\"388\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-40.png\" alt=\"\" class=\"wp-image-685\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-40.png 424w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-40-300x275.png 300w\" sizes=\"auto, (max-width: 424px) 100vw, 424px\" \/><\/figure>\n\n\n\n<p>Tahtes iga aasta kohta teada, mitu last meie nimekirjast vastaval aastal s\u00fcndinud on, aitab j\u00e4rgnev lause. COUNT(*) loeb kokku plokis olevad read. Et p\u00e4ringu l\u00f5pus on GROUP BY synniaasta, siis loetakse iga erinev s\u00fcnniaasta omaette plokiks. Tahtes s\u00fcnniaastat ka ennast n\u00e4ha, tuleb ka see SELECT\u00b4i j\u00e4rele tulpade loetellu kirjutada. Grupeerimisfunktsioonide puhul tohibki vastusesse k\u00fcsida v\u00e4\u00e4rtusi vaid nendest tulpadest, mille j\u00e4rgi grupeeritakse. Muidu tekiks ju segadus, sest kui tahaks v\u00f5tta v\u00e4ljundisse ka pikkust, aga iga s\u00fcnniaasta juurde v\u00f5ib kuuluda lapsi ja seega ka pikkusi mitu, siis ei tuleks vastus tabeli kujuline ning seet\u00f5ttu ei sobiks relatsioonilise ehk tabelitel p\u00f5hineva andmebaasi juurde. Kui aga s\u00fcnniaasta j\u00e4rele grupeeritakse ja viimane ka ilusti n\u00e4ha on \u2013 siis p\u00fcsib k\u00f5ik korras. Pigem tunduks imelik, kui n\u00e4idataks k\u00fcll loendamise tulemusi 1, 3 ja 3, aga poleks n\u00e4ha, millise aasta juurde milline arv k\u00e4ib.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"367\" height=\"331\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-41.png\" alt=\"\" class=\"wp-image-688\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-41.png 367w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-41-300x271.png 300w\" sizes=\"auto, (max-width: 367px) 100vw, 367px\" \/><\/figure>\n\n\n\n<p>Sarnaselt nagu v\u00f5ib ridu kokku lugeda, saab ka teisi grupeerimisfunktsioone kasutada. Siin leitakse iga s\u00fcnniaasta kohta sealsete laste keskmine pikkus.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"373\" height=\"318\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-42.png\" alt=\"\" class=\"wp-image-691\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-42.png 373w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-42-300x256.png 300w\" sizes=\"auto, (max-width: 373px) 100vw, 373px\" \/><\/figure>\n\n\n\n<p>Kui rakendame p\u00e4ringule piiranguid WHERE abil siis esmalt filtreeritakse l\u00e4hteandmed ning alles peale seda hakatakse gruppe looma:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"378\" height=\"324\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-43.png\" alt=\"\" class=\"wp-image-694\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-43.png 378w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-43-300x257.png 300w\" sizes=\"auto, (max-width: 378px) 100vw, 378px\" \/><\/figure>\n\n\n\n<p>Kui soovime juba grupeeritud tulemusele piiranguid seada siis saame kasutada HAVING lauseosa. N\u00e4iteks soovime moodustada korvpallimeeskonda ning tahame teada, milliste vanusegruppide keskmine pikkus on \u00fcle 165 cm<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"378\" height=\"298\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-44.png\" alt=\"\" class=\"wp-image-697\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-44.png 378w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-44-300x237.png 300w\" sizes=\"auto, (max-width: 378px) 100vw, 378px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">ROLLUP, gruppide koondinfo<\/h4>\n\n\n\n<p>Grupeerimise juures on vahel v\u00f5imalik ja vajalik p\u00e4ris mitmesuguseid andmeid koguda. Ja m\u00f5nikord on mugav, kui ei pea iga v\u00e4\u00e4rtuse jaoks omaette p\u00e4ringut tegema, vaid v\u00f5ib k\u00f5ik andmed tulemusplokis ette v\u00f5tta ja nendega toimetama asuda. Lihtsama n\u00e4ite puhul loendatakse lapsi aastate kaupa ning l\u00f5puks v\u00f5etakse kokku, palju neid \u00fcldse nimekirjas oli. Nagu alt n\u00e4ha \u2013 6. Koguhulga juures pannakse s\u00fcnniaasta kohale NULL, sest see ei k\u00e4i enam mitte \u00fche konkreetse s\u00fcnniaasta kohta, vaid k\u00f5igi peale kokku. Sellise lisarea annab k\u00e4skluse osa WITH ROLLUP.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"343\" height=\"333\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-45.png\" alt=\"\" class=\"wp-image-700\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-45.png 343w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-45-300x291.png 300w\" sizes=\"auto, (max-width: 343px) 100vw, 343px\" \/><\/figure>\n\n\n\n<p>Kui grupeeritavaid tulpasid on rohkem, siis saab ka sellist lisastatistikat rohkem v\u00e4lja lugeda. J\u00e4rgnevas n\u00e4ites grupeeriti lapsed s\u00fcnnilinna ja s\u00fcnniaasta j\u00e4rgi. See t\u00e4hendab, et \u00fchte gruppi sattunuksid nad vaid juhul, kui nad s\u00fcndinuksid samal aastal ja oleksid \u00fchepikkused. Iga muu kombinatsioon annab uue grupi. Nii see loend siis ka tuleb, kui algusest lugema hakata.<\/p>\n\n\n\n<p>K\u00f5igepealt esimeses reas teatatakse k\u00f5igi laste keskmine pikkus 167. Seej\u00e4rel j\u00e4rgmises reas on esimese linna e. Tallinna laste keskmine pikkus 171. Seej\u00e4rel tulevad keskmised pikkused Tallinna lastel, kes s\u00fcndinud aastatel 1996 ja 1997. Viiendas reas on Tartu laste keskmine pikkus ning see j\u00e4rel aastatel 1995 ja 1997 s\u00fcndinud Tartu laste keskmised pikkused.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"374\" height=\"417\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-46.png\" alt=\"\" class=\"wp-image-703\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-46.png 374w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-46-269x300.png 269w\" sizes=\"auto, (max-width: 374px) 100vw, 374px\" \/><\/figure>\n\n\n\n<p>Nagu n\u00e4ha t\u00e4histatakse \u00fcldkokkuv\u00f5tted m\u00e4\u00e4ramata e. NULL v\u00e4\u00e4rtusega kokku v\u00f5etud v\u00e4ljal. V\u00f5ib tekkida olukord kus kokkuv\u00f5etav v\u00e4li ise v\u00f5ib sisaldada m\u00e4\u00e4ramata v\u00e4\u00e4rtuseid. N\u00e4iteks meie tabelis on \u00fchel lapsel s\u00fcnnilinn teadmata. Kui n\u00fc\u00fcd leida grupid saame tulemuseks kaks v\u00e4ga sarnast rida:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"454\" height=\"411\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-47.png\" alt=\"\" class=\"wp-image-706\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-47.png 454w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-47-300x272.png 300w\" sizes=\"auto, (max-width: 454px) 100vw, 454px\" \/><\/figure>\n\n\n\n<p>Tekib k\u00fcsimus kus on k\u00f5igi laste keskmine ning kus on teadmata s\u00fcnnilinnaga laste keskmine pikkus. Selle probleemi lahendamiseks saame probleemsele v\u00e4ljale rakendada GROUPING funktsiooni:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"653\" height=\"410\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-48.png\" alt=\"\" class=\"wp-image-709\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-48.png 653w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-48-300x188.png 300w\" sizes=\"auto, (max-width: 653px) 100vw, 653px\" \/><\/figure>\n\n\n\n<p>GROUPING funktsioon tekitab meile veeru, kus on 1 juhul kui on tegemist \u00fcldkokkuv\u00f5ttega ning vastasel juhul on v\u00e4\u00e4rtus 0. Seega saame teada, et lastel kelle s\u00fcnnilinna me ei tea on keskmine pikkus 165, k\u00f5igi laste keskmine pikkus on 166 ning lastel, kelle s\u00fcnnilinna me ei tea ja s\u00fcnniaasta on 1996 on keskmine pikkus 165.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">CUBE, t\u00e4iendatud koondinfo<\/h4>\n\n\n\n<p>Kui eelmises p\u00e4ringus olnud WITH ROLLUP asendada reaga WITH CUBE, siis tehakse grupeerimist kaks korda vastupidistes suundades ning n\u00e4idatakse tulemuseks neid kahte tulemust \u00fchendatuna. Seega saame lisaks teada, et 1995 s\u00fcndinute keskmine pikkus on 171, 1996 s\u00fcndinutel 161 ning 1997 s\u00fcndinutel 168.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"662\" height=\"464\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-50.png\" alt=\"\" class=\"wp-image-714\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-50.png 662w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-50-300x210.png 300w\" sizes=\"auto, (max-width: 662px) 100vw, 662px\" \/><\/figure>\n\n\n\n<p>Et \u00fche sentimeetri kaupa grupeering on nii v\u00e4ikese inimeste arvu puhul ilmselt liiast, v\u00f5ib v\u00f5tta inimeste jaotuse m\u00f5nev\u00f5rra suurema piirkonna ehk detsimeetri j\u00e4rgi. Avaldis pikkus\/10 annab t\u00e4isarvude puhul jagatise t\u00e4isosa. Ehk siis 157\/10 annab tulemuseks 15 ja 163\/10 tuleb 16. Selliselt saab lapsed 10 sentimeetri kaupa gruppidesse jagada ning grupi andmetel on juba m\u00f5nev\u00f5rra m\u00f5istlikum sisu. Et v\u00e4ljatr\u00fckil poleks n\u00e4ha mitte 15 ja 16, vaid 150 ja 160, selleks korrutati SELECT real t\u00e4isarvuks muutunud jagatis uuesti k\u00fcmnega. Saadud tulemustest v\u00f5ib v\u00e4lja lugeda, et 1996ndal s\u00fcndinute hulgas on kaks last 150ndates ning \u00fcks 160ndates. Ning k\u00f5igi aastate peale kokku on 4 inimest 150 ja 160 vahel ning 3 inimest 160 ja 170 vahel.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Keerukamad seosed tabelite vahel<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\"><a><\/a><a><\/a> LEFT ja RIGHT JOIN<\/h4>\n\n\n\n<p>K\u00f5ige tavalisema \u00fchendamise puhul saime kahest tabelist k\u00e4tte need read, mis m\u00f5lemas olemas olid. Ehk siis loetelus olid vaid lemmikloomaga lapsed ning samuti igas loetelus olnud lemmikloomal oli k\u00f5rval peremees. Et praeguses n\u00e4ites ei lubata peremeheta lemmikloomi tabelisse lisada, siis j\u00e4\u00e4b \u00e4ra ka v\u00f5imalus \u00fclej\u00e4\u00e4nud lemmikloomade n\u00e4itamiseks. K\u00fcll aga v\u00f5ib m\u00f5nikord olla soov n\u00e4ha ka neid lapsi, kel pole oma koera v\u00f5i kassi. Ning samas loomaomanikele panna k\u00f5rvale ka loomade andmed. Sellise t\u00f6\u00f6ga saab hakkama LEFT JOIN. Loetelus esimesena olnud tabelist ehk vasakust n\u00e4idatakse v\u00e4lja k\u00f5ik read. Paremast aga vaid need, kus seos vasaku tabeliga olemas. Kel looma pole, sel tuleb loomanime kohale t\u00fchiv\u00e4\u00e4rtus NULL.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nSELECT eesnimi, loomanimi FROM lapsed\nLEFT JOIN lemmikloomad \nON lemmikloomad.peremehe_id=lapsed.id\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"363\" height=\"493\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-60.png\" alt=\"\" class=\"wp-image-791\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-60.png 363w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-60-221x300.png 221w\" sizes=\"auto, (max-width: 363px) 100vw, 363px\" \/><\/figure>\n\n\n\n<p>Sarnaselt t\u00f6\u00f6tab RIGHT JOIN. Ainult selle vahega, et n\u00e4idatakse v\u00e4lja k\u00f5ik parempoolses tabelis olevad andmed. Kui m\u00f5nele reale ei vasta kirjet vasakpoolses tabelis, siis n\u00e4idatakse selle koha peal vasakpoolse tabeli v\u00e4ljade kohal NULL. Et siin aga on igal loomal peremees, siis t\u00fchiv\u00e4\u00e4rtusi ei teki.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nSELECT eesnimi, loomanimi FROM lapsed\nRIGHT JOIN lemmikloomad \nON lemmikloomad.peremehe_id=lapsed.id\nSiiri\tMiisu\nSiim\tPauka\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"378\" height=\"426\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-61.png\" alt=\"\" class=\"wp-image-793\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-61.png 378w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-61-266x300.png 266w\" sizes=\"auto, (max-width: 378px) 100vw, 378px\" \/><\/figure>\n\n\n\n<p>LEFT JOINi ja RIGHT JOINi pikem kuju on LEFT OUTER JOIN ning RIGHT OUTER JOIN. Aga nagu n\u00e4ha, tulemus j\u00e4\u00e4b samaks.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nSELECT eesnimi, loomanimi FROM lapsed\nRIGHT OUTER JOIN lemmikloomad \nON lemmikloomad.peremehe_id=lapsed.id\nSiiri\tMiisu\nSiim\tPauka\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"324\" height=\"429\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-62.png\" alt=\"\" class=\"wp-image-795\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-62.png 324w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-62-227x300.png 227w\" sizes=\"auto, (max-width: 324px) 100vw, 324px\" \/><\/figure>\n\n\n\n<p>Nende \u00fchendamiste puhul peab kindlasti silmas pidama tabelite j\u00e4rjekorda. Kui panna lemmikloomad vasakuks tabeliks ja lapsed parempoolseks tabeliks ning \u00fchendamisel kasutada RIGHT JOINi ning tulbad nime j\u00e4rgi v\u00e4lja kutsuda, siis on tulemus sama, kui oleks kasutanud tabeleid teises j\u00e4rjekorras ning \u00fchendamiseks LEFT JOINi.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nSELECT eesnimi, loomanimi FROM lemmikloomad\nRIGHT JOIN lapsed \nON lemmikloomad.peremehe_id=lapsed.id\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"350\" height=\"484\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-63.png\" alt=\"\" class=\"wp-image-797\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-63.png 350w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-63-217x300.png 217w\" sizes=\"auto, (max-width: 350px) 100vw, 350px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">CROSS JOIN<\/h4>\n\n\n\n<p>K\u00f5ikide v\u00f5imalike kombinatsioonide v\u00e4ljatr\u00fckiks sobib CROSS JOIN. Sel juhul v\u00f5tmeid tabelite \u00fchendamiseks ei kasutata, vaid tr\u00fckitakse v\u00e4lja k\u00f5ik v\u00f5imalikud kombinatsioonid, kuidas esimese tabeli read saavad olla \u00fchendatud teise tabeli ridadega. Ehk siis siin n\u00e4ites pakutakse v\u00e4lja k\u00f5ik kombinatsioonid, milline laps saab millise lemmikloomaga koos olla.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nSELECT eesnimi, loomanimi FROM lemmikloomad\nCROSS JOIN lapsed\n\nJuku\tMiisu\nKati\tMiisu\nMati\tMiisu\nAts\tMiisu\nSiiri\tMiisu\nSiim\tMiisu\nMari\tMiisu\nJuku\tPauka\nKati\tPauka\nMati\tPauka\nAts\tPauka\nSiiri\tPauka\nSiim\tPauka\nMari\tPauka\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"408\" height=\"649\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-64.png\" alt=\"\" class=\"wp-image-799\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-64.png 408w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-64-189x300.png 189w\" sizes=\"auto, (max-width: 408px) 100vw, 408px\" \/><\/figure>\n\n\n\n<p>Eks sellist segapudru l\u00e4heb suhteliselt harvem vaja, aga ilus on vaadata, kes v\u00f5ib kellega koos olla. Samuti sobib CROSS JOIN olukordade jaoks, kui tahetakse k\u00f5ikide v\u00f5imalike variantide hulgast sobivat v\u00e4lja otsida. N\u00e4iteks soovitakse otsida kombinatsioonid, kus lapse ja looma nimed algavad sama t\u00e4hega, v\u00f5i siis on nad s\u00fcndinud samas kuus. Siinse n\u00e4ite puhul on tingimused pastakast v\u00e4lja imetud, aga m\u00f5ne tutvumis\u00f5htu puhul v\u00f5i laborikatsete juures v\u00f5ivad sellised valikud t\u00e4iesti omal kohal olla.<\/p>\n\n\n\n<p>CROSS JOINiga sama tulemuse annab, kui p\u00e4ringusse kirjutada lihtsalt tabelite nimed ilma t\u00e4iendavaid tingimusi seadmata.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nSELECT eesnimi, loomanimi FROM lemmikloomad, lapsed\n\nJuku\tMiisu\nKati\tMiisu\nMati\tMiisu\nAts\tMiisu\nSiiri\tMiisu\nSiim\tMiisu\nMari\tMiisu\nJuku\tPauka\nKati\tPauka\nMati\tPauka\nAts\tPauka\nSiiri\tPauka\nSiim\tPauka\nMari\tPauka\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"407\" height=\"611\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-65.png\" alt=\"\" class=\"wp-image-801\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-65.png 407w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-65-200x300.png 200w\" sizes=\"auto, (max-width: 407px) 100vw, 407px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Seos sama tabeliga<\/h4>\n\n\n\n<p>Esimese hooga v\u00f5ib tunduda imelik, miks peaks olema vaja siduda tabelit iseenesega. Aga rakendusi kirjutades tekib selliseid seostamiskohti \u00fcllatavalt palju. N\u00e4iteks kui kataloogid on kataloogipuus, siis seda struktuuri saab tabelisse salvestada nii, et iga kataloogi puhul kirjutatakse eraldi tulpa tema \u00fclemkataloogi ID. Ning juurkataloogi puhul see arv n\u00e4itab iseenesele v\u00f5i ei n\u00e4ita kuhugi. Samuti foorumi kirjade puhul, kui tahetakse meeles pidada, milline kiri millisele vastab. Siin aga vaatame, kuidas seos sama tabeliga toimub s\u00fcnniaastate kaudu. Esialgu koostatakse p\u00e4ring, kus n\u00e4idatakse k\u00f5ikide laste paarid nendega samal aastal s\u00fcndinud lastega. Et saaks tabelit iseenesega seostada, tuleb tabelist teha p\u00e4ringu ajaks kaks koopiat. Nii nagu sai p\u00e4ringus tulpasid \u00fcmber nimetada, nii saab \u00fcmber nimetada ka tabeleid.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nSELECT * FROM lapsed as tabel1, lapsed as tabel2\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"664\" height=\"649\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-66.png\" alt=\"\" class=\"wp-image-803\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-66.png 664w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-66-300x293.png 300w\" sizes=\"auto, (max-width: 664px) 100vw, 664px\" \/><\/figure>\n\n\n\n<p>\u00fctleb, et v\u00f5ta tabel lapsed k\u00f5igepealt m\u00e4rks\u00f5na all tabel1 ning seej\u00e4rel tabel lapsed ka m\u00e4rks\u00f5na all tabel2. Edasi juba v\u00f5ib need tabelid tingimus(t)e abil kokku siduda, sest muidu n\u00e4idataks k\u00f5ikide ridade omavahelised v\u00f5imalikud kombinatsioonid. Et siin aga soovime paare vaid s\u00fcnniaastate kaupa, siis n\u00f5uame, et eri tabeli ridade k\u00f5rvuti panekuks peavad nende laste s\u00fcnniaastad kattuma.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nSELECT * FROM lapsed as tabel1, lapsed as tabel2\nWHERE tabel1.synniaasta=tabel2.synniaasta\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"703\" height=\"531\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-67.png\" alt=\"\" class=\"wp-image-804\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-67.png 703w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-67-300x227.png 300w\" sizes=\"auto, (max-width: 703px) 100vw, 703px\" \/><\/figure>\n\n\n\n<p>\u00dcllatusena avastame, et Juku paariliseks on pandud ka Juku ise. Ning paarina on olemas nii Juku Katiga kui Kati Jukuga. Selliseid anomaaliaid saab tingimuste t\u00e4psustamisega v\u00e4hendada v\u00f5i kaotada.<\/p>\n\n\n\n<p>Kui soovida, et sama isik ei oleks iseenesega k\u00f5rvuti, siis aitab tingimus, et k\u00f5rvuti seatud tabelikoopiate id-numbrite v\u00e4\u00e4rtused ei oleks v\u00f5rdsed. Kui soovida, et sama paari korduvalt ei n\u00e4idataks, siis v\u00f5ib seada n\u00e4iteks tingimuse, et teisest tabelist tuleva inimese id-number oleks suurem kui esimesest tabelist tulev id-number. Sellisel juhul j\u00e4\u00e4b igast paarist alles vaid \u00fcks v\u00e4ljatr\u00fckk \u2013 selline, mis vastab tingimustele.<\/p>\n\n\n\n<p>Tahame ainult \u00fche konkreetse isiku eakaaslasi k\u00e4tte saada, v\u00f5ib tema eraldi \u00e4ra m\u00e4\u00e4rata. Kindlam oleks k\u00fcll id kaudu, sest mitme Juku puhul v\u00f5ivad tekkida segadused. Meil aga on vaid \u00fcks Juku, seet\u00f5ttu on loota, et vastus sobib ning tema eakaaslasteks on siin tabelis vaid Kati ja Siim.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nSELECT tabel2.eesnimi from lapsed as tabel1, lapsed as tabel2\nWHERE tabel1.synniaasta=tabel2.synniaasta \nAND tabel1.id&lt;&gt;tabel2.id and tabel1.eesnimi=&#039;Juku&#039;\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"487\" height=\"250\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-68.png\" alt=\"\" class=\"wp-image-806\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-68.png 487w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-68-300x154.png 300w\" sizes=\"auto, (max-width: 487px) 100vw, 487px\" \/><\/figure>\n\n\n\n<p>Vastuses oleva tulba nimi v\u00f5etakse esimese p\u00e4ringu j\u00e4rgi. Ja ongi k\u00f5ik erinevad nimed siin.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"347\" height=\"395\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-69.png\" alt=\"\" class=\"wp-image-808\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-69.png 347w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-69-264x300.png 264w\" sizes=\"auto, (max-width: 347px) 100vw, 347px\" \/><\/figure>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nselect nimi, synniaasta AS AASTA, &#039;LAPS&#039; AS LIIK\nFROM DBO.Laps_tbl\nUNION\nSELECT MARK, AASTA, &#039;AUTO&#039;\nFROM DBO.AUTO_TBL\nORDER BY 1\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"389\" height=\"450\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-72.png\" alt=\"\" class=\"wp-image-815\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-72.png 389w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-72-259x300.png 259w\" sizes=\"auto, (max-width: 389px) 100vw, 389px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Sarnase pikkusega lapsed<\/h4>\n\n\n\n<p>J\u00e4rgnevalt m\u00f5ned n\u00e4ited, kuidas sama \u00fclesannet saab alamp\u00e4ringute abil mitmel moel rakendada. Lisatud n\u00e4ited on tehtud \u00fche tabeli andmete p\u00f5hjal. V\u00e4hegi suuremas andmebaasis aga k\u00e4iakse v\u00e4\u00e4rtusi sageli k\u00fcllalt kaugelt k\u00fcsimas.<\/p>\n\n\n\n<p>L\u00e4bim\u00e4ngitava \u00fclesandena otsitakse tabelist iga lapse kohta, kui palju on temaga sarnase pikkusega teisi lapsi. See t\u00e4hendab arvuti keeles, et otsitakse iga lapse puhul, mitu on neid lapsi, kelle pikkus erineb temast mitte rohkem kui \u00fche sentimeetri v\u00f5rra. \u00dcheks v\u00f5imaluseks on teha lihtsalt eraldi tulp. Selles tulbas v\u00e4\u00e4rtuse leidmiseks tuleb andmebaasimootoril igal korral vastav p\u00e4ring uuesti k\u00e4ivitada. Iga kord, kui v\u00e4limises p\u00e4ringus v\u00f5etakse ette uus inimene, loetakse kolmanda tulba ehk sarnase pikkusega laste leidmiseks uuesti kokku k\u00f5ik lapsed, kelle pikkuse erinevust just sellest konkreetsest tr\u00fckitavast lapsest on 1 sentimeeter v\u00f5i v\u00e4hem. ABS t\u00e4hendab absoluutv\u00e4\u00e4rtust. Miinus \u00fcks tulbaavaldise l\u00f5pus on vajalik, kuna tr\u00fckitav laps loetakse alamp\u00e4ringu abil ka ise iseendaga \u00fchepikkuste laste hulka. Et iga\u00fcks on enesega sama pikk, saabki lahutamistehte abil v\u00e4\u00e4rtuse \u00f5igeks.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nSELECT eesnimi, pikkus, \n       (\n           SELECT COUNT(*) FROM lapsed as tabel2 \n           WHERE ABS(tabel2.pikkus-tabel1.pikkus)&lt;=1\n       )-1 as sarnaseid\nFROM lapsed as tabel1\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"433\" height=\"373\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-54.png\" alt=\"\" class=\"wp-image-754\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-54.png 433w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-54-300x258.png 300w\" sizes=\"auto, (max-width: 433px) 100vw, 433px\" \/><\/figure>\n\n\n\n<p>Tollest miinus \u00fchest saab vabaneda, kui eraldi tingimusse lisada, et tr\u00fckitavat last ennast samapikkade laste kokku lugemisel ei arvestata. Ehk siis tr\u00fckitava lapse id (tabel1.id) ning loetava lapse id (tabel2.id) ei tohi kattuda.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nSELECT eesnimi, pikkus, \n       (\n           SELECT COUNT(*) FROM lapsed as tabel2 \n           WHERE ABS(tabel2.pikkus-tabel1.pikkus)&lt;=1\n                 AND tabel1.id&lt;&gt;tabel2.id\n       ) as sarnaseid\nFROM lapsed as tabel1\n<\/pre><\/div>\n\n\n<p>Ehkki kood l\u00e4ks veidi pikemaks, v\u00f5ib see hiljem paremini loetav olla. Sest salap\u00e4rane -1 v\u00f5ib v\u00f5\u00f5rale lugedes p\u00e4ris palju peavalu valmistada. Kui aga ilusti tingimuse abil kontrollitakse, et tr\u00fckitav tegelane ei oleks kokkuloetavate hulgas \u2013 see on loodetavasti kergemini m\u00f5istetav. Tulemused on samad nagu eelmise p\u00e4ringu korral.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"442\" height=\"380\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-55.png\" alt=\"\" class=\"wp-image-758\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-55.png 442w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-55-300x258.png 300w\" sizes=\"auto, (max-width: 442px) 100vw, 442px\" \/><\/figure>\n\n\n\n<p>Ehkki kood l\u00e4ks veidi pikemaks, v\u00f5ib see hiljem paremini loetav olla. Sest salap\u00e4rane -1 v\u00f5ib v\u00f5\u00f5rale lugedes p\u00e4ris palju peavalu valmistada. Kui aga ilusti tingimuse abil kontrollitakse, et tr\u00fckitav tegelane ei oleks kokkuloetavate hulgas \u2013 see on loodetavasti kergemini m\u00f5istetav. Tulemused on samad nagu eelmise p\u00e4ringu korral.<\/p>\n\n\n\n<p>J\u00e4rgnevalt kasutame pikkuskaimude leidmiseks EXISTS-lauset p\u00e4ringu tingimusosas. Kui ennist loeti kokku, mitu sobiva pikkusega kaaslast leiti, siis siin k\u00fcsitakse iga uuritava lapse puhul soovitud tingimusele vastavad kaaslased. Pikkuskaimu leidumise korral on EXISTS-kontrolli tingimus t\u00f5ene ning vastava eesnime ja s\u00fcnniaasta v\u00f5ib v\u00e4lja kirjutada.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"441\" height=\"366\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-56.png\" alt=\"\" class=\"wp-image-762\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-56.png 441w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-56-300x249.png 300w\" sizes=\"auto, (max-width: 441px) 100vw, 441px\" \/><\/figure>\n\n\n\n<p>Sama \u00fclesande v\u00f5ib lahendada veel kolme SELECT\u00b4i abil. Algus on sarnane nagu esimeses n\u00e4ites, kus tr\u00fckkimise kolmandas tulbas arvutati v\u00e4lja, mitu pikkuskaimu iga lapse puhul on. Kuid kui n\u00fc\u00fcd me ei taha saada mitte arvu, vaid loetelu nendest, kel kaimud olemas, siis saab v\u00e4ljastatud tabelile lihtsalt veel \u00fche p\u00e4ringu \u00fcmber panna. Eesnimi ja pikkus v\u00e4ljastatakse ka v\u00e4limises p\u00e4ringus. Kolmanda tulba ehk &#8220;sarnaseid&#8221; v\u00e4\u00e4rtust aga kasutatakse otsustamiseks, kas vastavat rida n\u00e4idata v\u00f5i mitte.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nSELECT eesnimi, pikkus FROM\n   (SELECT eesnimi, pikkus, \n       (\n           SELECT COUNT(*) FROM lapsed as tabel2 \n           WHERE ABS(tabel2.pikkus-tabel1.pikkus)&lt;=1\n                 AND tabel1.id&lt;&gt;tabel2.id\n       ) as sarnaseid\n     FROM lapsed as tabel1\n   )as tabel3\nWHERE tabel3.sarnaseid&gt;0\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"448\" height=\"371\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-57.png\" alt=\"\" class=\"wp-image-766\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-57.png 448w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-57-300x248.png 300w\" sizes=\"auto, (max-width: 448px) 100vw, 448px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Veeru asendaja<\/h4>\n\n\n\n<p>Kontroll IN v\u00f5imaldab tingimuses uurida, kas otsitav v\u00e4\u00e4rtus kattub m\u00f5nega teises p\u00e4ringus v\u00e4ljastatud v\u00e4\u00e4rtustest. Siinsel juhul siis sisemises p\u00e4ringus leitakse k\u00f5ik 1997. aastal s\u00fcndinud laste pikkused. Edasi v\u00e4limises p\u00e4ringus v\u00e4ljastatakse k\u00f5ikide laste andmed, kelle pikkus kattub kasv\u00f5i \u00fchega eelpoolleitud pikkustest.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nSELECT eesnimi, synniaasta FROM lapsed \nWHERE pikkus IN (\n   SELECT pikkus FROM lapsed \n   WHERE synniaasta=1997\n)\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"368\" height=\"312\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-58.png\" alt=\"\" class=\"wp-image-770\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-58.png 368w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-58-300x254.png 300w\" sizes=\"auto, (max-width: 368px) 100vw, 368px\" \/><\/figure>\n\n\n\n<p>Nagu tulemustest n\u00e4ha, on tulemusridade hulgas lisaks 1997. s\u00fcndinutele ka \u00fcks 1996. aastal s\u00fcndinu, kel pikkust samapalju kui m\u00f5nel aasta nooremal. T\u00f5epoolest \u2013 Mari ja Kati on \u00fchepikkused. Ehkki esimene neist s\u00fcndinud 1996. ning teine 1997. aastal.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Tekkinud tabelite \u00fchendamine<\/h4>\n\n\n\n<p>Ka alamp\u00e4ringus tekkinud tabeleid saab teistega \u00fchendada sarnaselt tavalistele v\u00f5imalustele. Siin leitakse tagumises p\u00e4ringus iga s\u00fcnniaasta kohta suurim pikkus. Ning tabelite \u00fchendamise kaudu (ehkki praegu \u00fchendatakse laste tabelist saadud tulemus algse tabeli enesega) leitakse iga suurima pikkuse kohta inimese nimi ja s\u00fcnniaasta, kellel selline pikkus on. Juhul, kui juhtuks aastak\u00e4igu suurima pikkusega olema v\u00f5rdselt mitu inimest, siis tr\u00fckitaks nad k\u00f5ik nagu tabelite \u00fchendamise puhul kombeks.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nSELECT eesnimi, synniaasta, pikkus FROM lapsed as tabel1\nINNER JOIN\n(SELECT MAX(pikkus) as suurim FROM lapsed\nGROUP BY synniaasta)as tabel2\nON tabel1.pikkus=tabel2.suurim\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"466\" height=\"329\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-59.png\" alt=\"\" class=\"wp-image-774\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-59.png 466w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/05\/image-59-300x212.png 300w\" sizes=\"auto, (max-width: 466px) 100vw, 466px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Common Table Expression<\/h4>\n\n\n\n<p>Common Table Expression CTE on v\u00e4ga sarnane ajutisele vaatele, mida saab kasutada p\u00e4ringu FROM lauseosas.<\/p>\n\n\n\n<p>\u00dcldine s\u00fcntaks n\u00e4eb v\u00e4lja j\u00e4rgmine:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nWITH &lt;CTE nimi&gt;(&lt;v\u00e4ljanimed&gt;)\nAS \n(\n\t&lt;tegelik p\u00e4ring&gt;\n)\nSELECT * FROM &lt;CTE nimi&gt;\n<\/pre><\/div>\n\n\n<p>CTE abil on v\u00f5imalik v\u00e4ltida ajutiste tabelite ning alamp\u00e4ringute kasutamist. See omakorda muudab p\u00e4ringu \u00fclevaatlikumaks ning lihtsamaks.<\/p>\n\n\n\n<p>N\u00e4iteks soovime tegelda ainult Tallinnas (kood 1) s\u00fcndinud lastega. Sellisel juhul saame endale kirjeldada CTE, milles sisalduvad vaid Tallinna lapsed ning kasutada seda oma p\u00e4ringus nagu iga teist tabelit v\u00f5i vaadet:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nWITH TallinnaLapsed\nAS\n(\n\tSELECT *\n\tFROM dbo.Laps_tbl\n\tWHERE SynniLinn = 1\n)\nSELECT *\nFROM TallinnaLapsed\nORDER BY Nimi\n<\/pre><\/div>\n\n\n<p><strong>tulemus:<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"395\" height=\"350\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/06\/image-3.png\" alt=\"\" class=\"wp-image-844\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/06\/image-3.png 395w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/06\/image-3-300x266.png 300w\" sizes=\"auto, (max-width: 395px) 100vw, 395px\" \/><\/figure>\n\n\n\n<p>CTE t\u00f5eline j\u00f5ud tuleb aga ilmsiks kui l\u00e4bi rekursiivsete p\u00e4ringute. Rekursiivsed SQL p\u00e4ringud olid ka p\u00f5hiline idee CTE loomise taga.<\/p>\n\n\n\n<p>Rekursiivse p\u00e4ringu loomiseks tuleb CTE tekitada UNION p\u00e4ringu abil, milles on kaks liiget ankur (alguspunkt p\u00e4ringule) ning rekursiivne liig (iseendale viitav p\u00e4ring).<\/p>\n\n\n\n<p>Et seda katsetada teeme m\u00f5ned t\u00e4iendused oma Laste tabelisse ning lisame sinna uue v\u00e4lja R\u00fchmajuht ning m\u00e4\u00e4rame igale lapsele sobiva juhi:<\/p>\n\n\n\n<p>&#8212; Lisame tabelisse uue v\u00e4lja<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nALTER TABLE dbo.Laps_tbl\nADD Ryhmajuht INT NULL REFERENCES dbo.Laps_tbl (LapsID)\nGO\n<\/pre><\/div>\n\n\n<p>&#8212; paneme r\u00fchmajuhtideks igas linnas esimese k\u00f5ige vanemate linnakodanike hulgast<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nWITH VanimSynniA AS \n( -- Iga linna varaseim s\u00fcnniaasta\n\tSELECT SynniLinn, MIN(SYNNIAASTA) AS Aasta\n\tFROM dbo.Laps_tbl AS L1\n\tGROUP BY SynniLinn\n),\nPealikud AS \n( -- esimene v\u00e4ikseima s\u00fcnniaastaga laps\n\tSELECT L2.SynniLinn, MIN(L2.LapsID) AS LapsID\n\tFROM dbo.Laps_tbl AS L2\n\t\tINNER JOIN VanimSynniA as VA ON L2.SynniLinn = VA.SynniLinn AND L2.SynniAasta = VA.Aasta\n\tGROUP BY L2.SynniLinn\n)\nUPDATE dbo.Laps_tbl\nSET Ryhmajuht = P.LapsID\nFROM dbo.Laps_tbl AS L3\n\tINNER JOIN Pealikud AS P ON L3.SynniLinn = P.SynniLinn\nWHERE L3.LapsID &lt;&gt; P.LapsID\nGO\n-- M\u00e4\u00e4rame ka peetri kahe lapse r\u00fchmajuhiks\nUPDATE dbo.Laps_tbl\nSET RyhmaJuht = 12\nWHERE LapsID IN (2,10)\n-- lisame uue Lapse, kellest saab suurib pealik\nDECLARE @UusLapsID INT\nINSERT INTO dbo.Laps_tbl (Nimi, Synniaasta)\nVALUES (&#039;Roobert&#039;, 1988)\nSET @UusLapsID = @@identity\nUPDATE dbo.Laps_tbl\nSET Ryhmajuht = @UusLapsID\nWHERE Ryhmajuht IS NULL AND LapsID &lt;&gt; @UusLapsID\n<\/pre><\/div>\n\n\n<p>Kui k\u00f5ik tehtud on meie tabel j\u00e4rgmine:<\/p>\n\n\n\n<p>Alustame h\u00e4sti lihtsast rekursiivsest p\u00e4ringust p\u00fc\u00fcdes v\u00e4lja selgitada, kes alluvad Matile:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nWITH Alluvad\nAS\n(\n\tSELECT LapsID, Nimi, Ryhmajuht\n\tFROM dbo.Laps_tbl\n\tWHERE LapsID = 3\n\tUNION ALL\n\tSELECT L.LapsID, L.Nimi, L.Ryhmajuht\n\tFROM dbo.Laps_tbl AS L\n\t\tINNER JOIN Alluvad AS A ON L.RyhmaJuht = A.LapsID\n)\nSELECT A.LapsID, A.Nimi, L.Nimi AS Ryhmajuht\nFROM Alluvad AS A\n\tINNER JOIN dbo.Laps_tbl AS L ON A.RyhmaJuht = L.LapsID\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"466\" height=\"520\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/06\/image-4.png\" alt=\"\" class=\"wp-image-851\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/06\/image-4.png 466w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/06\/image-4-269x300.png 269w\" sizes=\"auto, (max-width: 466px) 100vw, 466px\" \/><\/figure>\n\n\n\n<p>J\u00e4rgmisena alustame uuringut k\u00f5ige suurematest pealikest e. kellel R\u00fchmajuht puudub ning p\u00fc\u00fcame v\u00e4lja selgitada mitmenda taseme alluvaga on tegemist:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nWITH Alluvad\nAS\n(\n\tSELECT LapsID, Nimi, Ryhmajuht, 0 AS Tase\n\tFROM dbo.Laps_tbl\n\tWHERE RyhmaJuht IS NULL\n\tUNION ALL\n\tSELECT L.LapsID, L.Nimi, L.Ryhmajuht, A.Tase + 1\n\tFROM dbo.Laps_tbl AS L\n\t\tINNER JOIN Alluvad AS A ON L.RyhmaJuht = A.LapsID\n)\nSELECT A.Tase, A.LapsID, A.Nimi, L.Nimi AS Ryhmajuht\nFROM Alluvad AS A\n\tLEFT OUTER JOIN dbo.Laps_tbl AS L ON A.RyhmaJuht = L.LapsID\nORDER BY A.Tase\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/06\/image-5.png\" alt=\"\" class=\"wp-image-855\" width=\"490\" height=\"582\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/06\/image-5.png 490w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/06\/image-5-253x300.png 253w\" sizes=\"auto, (max-width: 490px) 100vw, 490px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">APPLY<\/h4>\n\n\n\n<p>APPLY on uus operaator FROM lauseosas, mis v\u00f5imaldab Teil teha v\u00e4ljakutseid tabelit tagastavatele funktsioonile iga rea kohta peap\u00e4ringus.<\/p>\n\n\n\n<p>N\u00e4iteks huvitavad, meid iga linna k\u00f5ige pikemad lapsed. Selleks loome funktsiooni, mis loetleb meile \u00fclesse konkreetse linna k\u00f5ige pikemad lapsed:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nCREATE FUNCTION dbo.fn_Pikimad (@LinnID int, @Top int)\nRETURNS TABLE\nAS \n\tRETURN SELECT TOP (@Top) *\n\t\t   FROM dbo.Laps_tbl \n\t\t   WHERE SynniLinn = @LinnID \n\t\t   ORDER BY Pikkus DESC\n<\/pre><\/div>\n\n\n<p>Selleks, et vaadata seda infot konkreetsete linnade kaupa saame kirjutada p\u00e4ringu:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"585\" height=\"500\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/06\/image-8.png\" alt=\"\" class=\"wp-image-866\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/06\/image-8.png 585w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/06\/image-8-300x256.png 300w\" sizes=\"auto, (max-width: 585px) 100vw, 585px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Nummerdamised<\/h4>\n\n\n\n<p>ROW_NUMBER() \u2013 nummerdab k\u00f5ik read tulemuses<\/p>\n\n\n\n<p>RANK() \u2013 \u00fctleb, mitmes on loetelus antud v\u00e4\u00e4rtus<\/p>\n\n\n\n<p>DENSE_RANK() \u2013 analoogne RANK funktsiooniga, kuid ei j\u00e4ta numbreid vahele<\/p>\n\n\n\n<p>NTILE(n) \u2013 jagab tulemuse N grupiks<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nSELECT *\n, ROW_NUMBER() OVER (ORDER BY Pikkus DESC) AS jrk\n, RANK() OVER (ORDER BY Pikkus DESC) AS koht\n, DENSE_RANK() OVER (ORDER BY PIKKUS DESC) AS koht2\n, NTILE(3) OVER (ORDER BY PIKKUS DESC) AS grupp\nFROM dbo.Laps_tbl\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"596\" height=\"493\" src=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/06\/image-9.png\" alt=\"\" class=\"wp-image-869\" srcset=\"https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/06\/image-9.png 596w, https:\/\/tarkvara.thkit.ee\/veeb\/wp-content\/uploads\/2023\/06\/image-9-300x248.png 300w\" sizes=\"auto, (max-width: 596px) 100vw, 596px\" \/><\/figure>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nSELECT *\n, ROW_NUMBER() OVER (partition BY RymnaJuht order by pikkus DESC) AS jrk\n, RANK() OVER (partition BY RyhmaJuht order by Pikkus DESC) AS koht\n, DENSE_RANK() OVER (partition BY RyhmaJuht order by PIKKUS DESC) AS koht2\n, NTILE(3) OVER (ORDER BY PIKKUS DESC) AS grupp\nFROM dbo.Laps_tbl\nORDER BY RyhmaJuht, pikkus desc\n<\/pre><\/div>","protected":false},"excerpt":{"rendered":"<p>Tingimuste kombineerimine Olemasolevaid tingimusi saab alati omavahel kombineerida. AND n\u00f5uab, et m\u00f5lemad tingimuse pooled oleksid t\u00e4idetud, OR seevastu piirdub n\u00f5udega, et v\u00e4hemalt \u00fcks tingimustest oleks t\u00f5ene. K\u00f5igepealt siis nimed, mis l\u00f5ppevad i-ga ning s\u00fcnnilinn on Tartu (kood 2) Edasi k\u00f5ik i-l\u00f5pulised nimed pluss veel lisaks k\u00f5ik, kes s\u00fcndinud Tartus. Nimesid korduvalt siiski ei n\u00e4idata. Kuigi &hellip; <a href=\"https:\/\/tarkvara.thkit.ee\/veeb\/edasijoudnutele\/\" class=\"more-link\">Loe edasi <span class=\"screen-reader-text\">Edasij\u00f5udnutele<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-644","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/tarkvara.thkit.ee\/veeb\/wp-json\/wp\/v2\/pages\/644","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tarkvara.thkit.ee\/veeb\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/tarkvara.thkit.ee\/veeb\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/tarkvara.thkit.ee\/veeb\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tarkvara.thkit.ee\/veeb\/wp-json\/wp\/v2\/comments?post=644"}],"version-history":[{"count":198,"href":"https:\/\/tarkvara.thkit.ee\/veeb\/wp-json\/wp\/v2\/pages\/644\/revisions"}],"predecessor-version":[{"id":1075,"href":"https:\/\/tarkvara.thkit.ee\/veeb\/wp-json\/wp\/v2\/pages\/644\/revisions\/1075"}],"wp:attachment":[{"href":"https:\/\/tarkvara.thkit.ee\/veeb\/wp-json\/wp\/v2\/media?parent=644"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}