{"id":41,"date":"2021-03-04T07:31:41","date_gmt":"2021-03-04T07:31:41","guid":{"rendered":"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/?post_type=chapter&#038;p=41"},"modified":"2021-05-07T13:49:01","modified_gmt":"2021-05-07T13:49:01","slug":"aritmeetilised-tehted-ja-mitteagregeerivad-funktsioonid-veeruavaldistena","status":"publish","type":"chapter","link":"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/chapter\/aritmeetilised-tehted-ja-mitteagregeerivad-funktsioonid-veeruavaldistena\/","title":{"raw":"Aritmeetilised tehted ja mitteagregeerivad funktsioonid veeruavaldistena","rendered":"Aritmeetilised tehted ja mitteagregeerivad funktsioonid veeruavaldistena"},"content":{"raw":"<h2>Aritmeetilised tehted veeruavaldistena<\/h2>\r\n\u00dcldiselt p\u00e4ritakse andmebaasist k\u00f5igepealt sobivad andmed k\u00e4tte ning alles siis tehakse nende abil tehteid. Siiski, vahel on mugav v\u00f5i lausa vajalik teha tehteid juba p\u00e4rimise ajal. N\u00e4iteks, aritmeetilisi tehteid saab kasutada veeruavaldistena selleks, et p\u00e4ringuid uutmoodi piirata. Vaatame peatselt ka n\u00e4idete p\u00f5hjal, kuidas see k\u00e4ib.\r\n\r\nJooksuta j\u00e4rgnevat p\u00e4ringut ning m\u00f5tiskle, mida sa p\u00e4ringu tulemuses n\u00e4ed:\r\n<ul>\r\n \t<li><code><span style=\"color: #970000\"><strong>SELECT<\/strong><\/span> nimi, rahvastikuarv\/pindala <\/code><strong><code><span style=\"color: #970000\">FROM<\/span><\/code><\/strong><code> riigid<span style=\"color: #ff0000\"><strong>;<\/strong><\/span><\/code><\/li>\r\n<\/ul>\r\nPane t\u00e4hele, et kuigi me kasutasime kolme erinevat tabelis olevat tunnust (<code>nimi<\/code>, <code>rahvastikuarv<\/code> ja <code>pindala<\/code>), on p\u00e4ringu tulemuses veerge vaid kaks.\r\n\r\nV\u00f5isid ka m\u00e4rgata, et teisel veerul pole korralikku pealkirja. Seda seet\u00f5ttu, et PostgreSQL, DBeaver ega miski muu tarkvara ei oska ennustada, mida t\u00e4histavad tehete tulemusena tekkivad veerud. Meie ise siiski m\u00f5istame, et rahvastikuarvu pindalaga jagades saame rahvastikutiheduse.\r\n\r\nSelleks, et teisel veerul oleks inimeste jaoks loetaval ja kenal kujul pealkiri, kirjutame eelneva p\u00e4ringu \u00fcmber nii:\r\n<ul>\r\n \t<li><code><span style=\"color: #970000\"><strong>SELECT<\/strong><\/span> nimi, rahvastikuarv\/pindala <span style=\"color: #970000\"><strong>AS<\/strong><\/span> <span style=\"color: #008000\">'rahvastikutihedus'<\/span> <span style=\"color: #970000\"><strong>FROM<\/strong><\/span> riigid<span style=\"color: #ff0000\"><strong>;<\/strong><\/span><\/code><\/li>\r\n<\/ul>\r\n\u00d5ppisime siinkohal \u00e4ra uue m\u00e4rks\u00f5na <code><span style=\"color: #970000\"><strong>AS<\/strong><\/span><\/code>. Selle kasutus ei piirdu aritmeetiliste tehetega, vaid seda v\u00f5ib kasutada \u00fcksk\u00f5ik milliste veergude \u00fcmber nimetamiseks.\r\n\r\nN\u00e4iteks, kui me oleks eelmise p\u00e4ringu alguses kirjutanud <code>nimi<\/code> asemel <code>nimi <span style=\"color: #970000\"><strong>AS<\/strong><\/span> riigi_nimi<\/code> paistaksid p\u00e4ringu tulemuses veerud <code>riigi_nimi<\/code> ja <code>rahvastikutihedus<\/code>.\r\n\r\n[h5p id=\"12\"]\r\n\r\nPane t\u00e4hele, et jagasime tunnuse <code>rahvastikuarv<\/code> v\u00e4\u00e4rtusi arvuga <code><span style=\"color: #0000ff\">1000000.0<\/span><\/code>, mitte <code><span style=\"color: #0000ff\">1000000<\/span><\/code>. Tegime seda seet\u00f5ttu, et tunnuse <code>rahvastikuarv<\/code> andmet\u00fc\u00fcp on <strong><code><span style=\"color: #970000\">BIGINT<\/span><\/code><\/strong> ehk suur t\u00e4isarv. Sama loogika kehtiks ka andmet\u00fc\u00fcpidega <code><span style=\"color: #970000\"><strong>INTEGER<\/strong><\/span><\/code> ja <code><span style=\"color: #970000\"><strong>SMALLINT<\/strong><\/span><\/code>. Jagades PostgreSQL's omavahel kahte t\u00e4isarvu toimub t\u00e4isarvuline jagamine, mis t\u00e4hendab seda, et n\u00e4iteks avaldise <code><span style=\"color: #0000ff\">50<\/span>\/<span style=\"color: #0000ff\">100<\/span><\/code> v\u00e4\u00e4rtus on <code><span style=\"color: #0000ff\">0<\/span><\/code>, sest arv <code><span style=\"color: #0000ff\">50<\/span><\/code> sisaldab arvu <code><span style=\"color: #0000ff\">10<\/span><span style=\"color: #0000ff\">0<\/span><\/code> null korda.\r\n\r\nKatsetage, mis juhtub, kui jagada eelnevas p\u00e4ringus tunnuse <code>rahvastikuarv<\/code> v\u00e4\u00e4rtusi t\u00e4isarvuga <code><span style=\"color: #0000ff\">1000000<\/span><\/code>.\r\n\r\nTasub teada, et m\u00e4rks\u00f5naga <code><span style=\"color: #970000\"><strong>AS<\/strong><\/span><\/code> m\u00e4\u00e4ratud veeru pealkirja on m\u00f5nes SQL-i implementatsioonis v\u00f5imalik kasutada sama p\u00e4ringu piiramiseks p\u00e4ringu <code><span style=\"color: #970000\"><strong>WHERE<\/strong><\/span><\/code> osas, kuid PostgreSQL'i puhul see v\u00f5imalik ei ole. Seda seet\u00f5ttu, et lihtsalt \u00f6eldes t\u00e4idetakse p\u00e4ringut jooksutades k\u00f5igepealt p\u00e4ringu <code><span style=\"color: #970000\"><strong>WHERE<\/strong><\/span><\/code> osa ja alles siis <code><span style=\"color: #970000\"><strong>SELECT<\/strong><\/span><\/code> osa. Vaatame j\u00e4rgnevat illustreerivat n\u00e4idet.\r\n\r\nOletame, et me soovime leida vaeseid riike ning et meie m\u00f5iste vaesusest on see, et riigi SKP elaniku kohta on v\u00e4hemalt 10 korda v\u00e4iksem kui 50000.\r\n\r\nPostgreSQL'i kasutades saame selliste riikide andmed ja k\u00fcmnekordse SKP k\u00e4tte j\u00e4rgneva p\u00e4ringuga:\r\n<ul>\r\n \t<li><code><span style=\"color: #970000\"><strong>SELECT<\/strong><\/span> nimi, skp_elaniku_kohta * <span style=\"color: #0000ff\">10<\/span> <span style=\"color: #970000\"><strong>AS<\/strong><\/span> kumnekordne_skp <span style=\"color: #970000\"><strong>FROM<\/strong><\/span> riigid <span style=\"color: #970000\"><strong>WHERE<\/strong><\/span> skp_elaniku_kohta * <span style=\"color: #0000ff\">10<\/span> &lt;= <span style=\"color: #0000ff\">50000<\/span><span style=\"color: #ff0000\">;<\/span><\/code><\/li>\r\n<\/ul>\r\nM\u00f5nes SQL-i implementatsioonis saaks <code><span style=\"color: #970000\"><strong>WHERE<\/strong><\/span><\/code> j\u00e4rel oleva avaldise <code>skp_elaniku_kohta * <span style=\"color: #0000ff\">10<\/span><\/code> asendada eelnevalt m\u00e4\u00e4ratud veeru pealkirjaga <code>kumnekordne_skp<\/code>. Selle funktsionaalsuse tugi teeb laused paremini loetavaks ning aitab v\u00e4hendada p\u00e4ringute kirjutamisel tekkivate vigade arvu, eriti keerukamate tehete korral.\r\n<h2>Mitteagregeerivad funktsioonid<\/h2>\r\nPeale aritmeetiliste tehete saab veeruavaldistena kasutada ka erinevaid PostgreSQL's olemasolevaid funktsioone. Neid funktsioone jaotatakse kaheks \u2013 mitteagregeerivad ja agregeerivad.\r\n\r\nKa andmebaasi kasutajatel on v\u00f5imalik uusi funktsioone luua, kuid seda me selles moodulis ei k\u00e4sitle.\r\n\r\nSiin peat\u00fckis alustame mitteagregeerivate funktsioonide uurimisega, agregeerivaid vaatame j\u00e4rgmises. M\u00f5lemad m\u00f5isted seletame samuti alles j\u00e4rgmises peat\u00fckis lahti. Seniks v\u00f5ib mitteagreegerivaid funktsioone vaadata kui viise p\u00e4ritavate tunnuste mingitmoodi t\u00f6\u00f6tlemiseks.\r\n\r\nPostgreSQL's on mitteagregeerivaid funktsioone v\u00e4ga palju ning neid k\u00f5iki ei j\u00f5ua me siinkohal k\u00e4sitleda. Seega, keskendume m\u00f5ningale kasulikemale neist.\r\n\r\nSoovi korral saab k\u00f5igi funktsioonide kohta t\u00e4psemalt lugeda PostgreSQL'i ametlikust dokumentatsioonist. N\u00e4iteks <a href=\"https:\/\/www.postgresql.org\/docs\/13\/functions-string.html\">siit<\/a> leiab s\u00f5nedele m\u00f5eldud funktsioonide dokumentatsiooni. Kasulikku infot ja abimaterjale leiab kindlasti ka muudest veebiallikatest, kuid enne tasub veenduda nende usaldusv\u00e4\u00e4rsuses.\r\n\r\nVaatame esmalt \u00fchte \u00fclesannet ja selle lahendust ning seej\u00e4rel esimest kasulikku mitteagregeerivat funktsiooni, mis selle lahendamise m\u00e4rksa lihtsamaks teeb.\r\n\r\n[h5p id=\"13\"]\r\n\r\nEelolevale kirjeldusele vastavat p\u00e4ringut on v\u00f5imalik kirja panna ka palju l\u00fchemalt. Selleks saame kasutada mitteagregeerivat funktsiooni <code><span style=\"color: #970000\"><strong><span style=\"color: #000080\">LENGTH<\/span><\/strong><\/span><\/code>, mida kasutav p\u00e4ring n\u00e4eb v\u00e4lja j\u00e4rgnev:\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> <\/code><strong><code><span style=\"color: #000080\">LENGTH<\/span><\/code><\/strong><code>(pealkiri) &lt;= <span style=\"color: #0000ff\">3<\/span><span style=\"color: #ff0000\"><strong>;<\/strong><\/span><\/code><\/li>\r\n<\/ul>\r\nN\u00e4eme, et \u00f5igete t\u00f6\u00f6riistade (funktsioonide) teadmisest on palju kasu, kuna see v\u00f5imaldab meil p\u00e4ringuid lihtsamini moodustada. Samuti s\u00e4ilitame niiviisi p\u00e4ringute loetavuse.\r\n\r\nKuigi me kasutasime eelnevas n\u00e4ites mitteagregeerivat funktsiooni p\u00e4ringu piiramiseks, v\u00f5ib neid vabalt ka <code><span style=\"color: #970000\"><strong>SELECT<\/strong><\/span><\/code> osas kasutada.\r\n\r\nOletame, et me soovime leida k\u00f5igi riikide (mitteametlikke) kolmet\u00e4helisi l\u00fchendid, j\u00e4ttes iga riigi nime puhul alles selle kolm esimest t\u00e4hte. Seda saame teha j\u00e4rgneva p\u00e4ringuga:\r\n<ul>\r\n \t<li><strong><code><span style=\"color: #970000\">SELECT<\/span><\/code><\/strong><code> <span style=\"color: #000080\"><strong>LEFT<\/strong><\/span>(nimi, <span style=\"color: #0000ff\">3<\/span>) <span style=\"color: #970000\"><strong>FROM<\/strong><\/span> riigid<span style=\"color: #ff0000\"><strong>;<\/strong><\/span><\/code><\/li>\r\n<\/ul>\r\nNagu n\u00e4ha, siis funktsioonile <code><span style=\"color: #000080\"><strong>LEFT<\/strong><\/span><\/code> j\u00e4rgnevad sulud, nii nagu ka funktsiooni <code><span style=\"color: #000080\"><strong>LENGTH<\/strong><\/span><\/code> puhul. Siinkohal on sulgude sees aga kaks elementi \u2013 esimene on t\u00f6\u00f6deldav s\u00f5ne, siinkohal riigi nimi ning teine on arv, mitu s\u00fcmbolit vasakult lugedes alles j\u00e4tta.\r\n\r\nNagu v\u00f5ib arvata, on olemas ka funktsioon <code><span style=\"color: #000080\"><strong>RIGHT<\/strong><\/span><\/code>. See t\u00f6\u00f6tab vastupidiselt ehk alles j\u00e4etakse s\u00f5nede parempoolsed s\u00fcmbolid.\r\n\r\n[h5p id=\"14\"]\r\n\r\nTasub teada, et kui tunnuse v\u00e4\u00e4rtuse pikkus (eelnevate n\u00e4idete puhul riigi nime pikkus) on v\u00e4iksem kui arv, mis n\u00e4itab mitu s\u00fcmbolit alles j\u00e4tta, ei teki viga, vaid j\u00e4etakse alles k\u00f5ik selle v\u00e4\u00e4rtuse s\u00fcmbolid.\r\n\r\nKuigi eelmise p\u00e4ringu tulemus oli \u00fcpriski huvitav ning kasulik, tahame me \u00fcldjuhul, et riikide l\u00fchendid oleks \u00fcleni suurt\u00e4htedega.\r\n\r\nSeda saame teha j\u00e4rgneva modifitseeritud p\u00e4ringuga:\r\n<ul>\r\n \t<li><code><span style=\"color: #800000\"><strong>SELECT<\/strong><\/span> <span style=\"color: #000080\"><strong>UPPER<\/strong><\/span>(<\/code><strong><code><span style=\"color: #000080\">LEFT<\/span><\/code><\/strong><code>(nimi, <span style=\"color: #0000ff\">3<\/span>)) <\/code><strong><code><span style=\"color: #970000\">FROM<\/span><\/code><\/strong><code> riigid<span style=\"color: #ff0000\"><strong>;<\/strong><\/span><\/code><\/li>\r\n<\/ul>\r\nN\u00e4eme, et funktsioon <strong><code><span style=\"color: #000080\">UPPER<\/span><\/code><\/strong> teisendab sellele j\u00e4rgnevate sulgude sisu \u00fcleni suurt\u00e4heliseks. Siinkohal v\u00f5iks kirjutada <strong><code><span style=\"color: #000080\">UPPER<\/span><\/code><\/strong> ka tunnuse <code>nimi<\/code> \u00fcmber, kuid j\u00f5udluse poolest on \u00fclal esitatud versioon parem, kuna teisendamist rakendatakse vaid 3 s\u00fcmboli, mitte terve s\u00f5ne peal.\r\n\r\nTaaskord, nagu v\u00f5ib arvata, on olemas ka m\u00e4rks\u00f5na <code><span style=\"color: #000080\"><strong>LOWER<\/strong><\/span><\/code>, mis t\u00f6\u00f6tab vastupidiselt ehk muudab ette antud tunnuse v\u00e4\u00e4rtused \u00fcleni v\u00e4iket\u00e4heliseks.\r\n\r\nSelleks, et s\u00f5nesi paindlikumalt t\u00fckeldada, kui v\u00f5imaldavad funktsioonid <code><span style=\"color: #000080\"><strong>LEFT<\/strong><\/span><\/code> ja <code><span style=\"color: #000080\"><strong>RIGHT<\/strong><\/span><\/code>, saame kasutada uut funktsiooni <code><span style=\"color: #000080\"><strong>SUBSTRING<\/strong><\/span><\/code>, mis t\u00f6\u00f6tab neile \u00fcpriski sarnaselt.\r\n\r\nVaatame taaskord riigi nimede l\u00fchendite n\u00e4idet. Seekord soovime, et l\u00fchend algaks nime 2. s\u00fcmbolist, oleks 5 s\u00fcmbolit pikk ning et k\u00f5ik l\u00fchendi t\u00e4hed oleks v\u00e4ikesed.\r\n\r\nSeda saame teha j\u00e4rgneva p\u00e4ringuga:\r\n<ul>\r\n \t<li><code><span style=\"color: #970000\"><strong>SELECT<\/strong><\/span> <span style=\"color: #000080\"><strong>LOWER<\/strong><\/span>(<\/code><strong><code><span style=\"color: #000080\">SUBSTRING<\/span><\/code><\/strong><code>(nimi, <span style=\"color: #0000ff\">2<\/span>, <span style=\"color: #0000ff\">5<\/span>)) <span style=\"color: #970000\"><strong>FROM<\/strong><\/span> riigid<span style=\"color: #ff0000\"><strong>;<\/strong><\/span><\/code><\/li>\r\n<\/ul>\r\nN\u00e4eme, et funktsioon <code><span style=\"color: #000080\"><strong>SUBSTRING<\/strong><\/span><\/code> v\u00f5tab samuti esimese elemendina t\u00f6\u00f6deldava tunnuse. Teine element on aga indeks, mis n\u00e4itab, mis on esimene alles j\u00e4etav s\u00fcmbol ning kolmas element on arv, mis n\u00e4itab, mitu s\u00fcmbolit tuleb alates indeksist (kaasa arvatud) alles j\u00e4tta.\r\n\r\nTasub teada, et erinevalt enamustest programmeerimiskeeltest, \u00b4kus indekseerimine algab 0-st, algavad PostgreSQL's indeksid 1-st. Seega oligi eelnevas n\u00e4ites esimene alles j\u00e4etav s\u00fcmbol riigi nime teine, mitte kolmas s\u00fcmbol.\r\n\r\nSiiani oleme p\u00e4ringutes kasutanud erinevaid tehteid ja funktsioone nii arvu kui ka s\u00f5ne kujul olevate tunnuste t\u00f6\u00f6tlemiseks. Funktsioone aga leidub ka paljude teiste andmet\u00fc\u00fcpide jaoks, nagu <code><span style=\"color: #000080\"><strong>TIMESTAMP<\/strong><\/span><\/code>.\r\n\r\n[h5p id=\"15\"]\r\n\r\nPostgreSQL's on tehtud kuup\u00e4evade t\u00f6\u00f6tlemine v\u00e4ga lihtsaks funktsiooni <strong><code><span style=\"color: #000080\">DATE_PART<\/span><\/code><\/strong> abil. Jooksuta j\u00e4rgnevat p\u00e4ringut ning proovi m\u00f5ista, kuidas <code><span style=\"color: #000080\"><strong>DATE_PART<\/strong><\/span><\/code> t\u00f6\u00f6tab ning kuidas seda veel kasutada saaks:\r\n<ul>\r\n \t<li><code><span style=\"color: #970000\"><strong>SELECT<\/strong><\/span> pealkiri, vanusepiirang, zanr, <\/code><strong><code><span style=\"color: #000080\">DATE_PART<\/span><\/code><\/strong><code>(<span style=\"color: #008000\">'year'<\/span>, lisamise_kuupaev) <span style=\"color: #970000\"><strong>FROM<\/strong><\/span> teosed<span style=\"color: #ff0000\"><strong>;<\/strong><\/span><\/code><\/li>\r\n<\/ul>\r\n[h5p id=\"16\"]\r\n\r\nTasub teada, et <strong><code><span style=\"color: #000080\">DATE_PART<\/span><\/code><\/strong> aktsepteerib t\u00e4psustava argumendina veel n\u00e4iteks s\u00f5nesid <code>hour<\/code>, <code>minute<\/code> ja <code>second<\/code>. Kuna tunnuse <code>lisamise_kuupaev<\/code> v\u00e4\u00e4rtused hetkel nii t\u00e4psed ei ole ehk need ei sisalda tunde, minuteid ja sekundeid, siis tagastatakse nende argumentide kasutamisel alati 0-i, sest vaikev\u00e4\u00e4rtusena on kellaaeg 00:00:00.\r\n\r\nTasub ka teada, et funktsioon <code><span style=\"color: #000080\"><strong>DATE_PART<\/strong><\/span><\/code> aktsepteerib kuup\u00e4evana spetsiaalset m\u00e4rks\u00f5na <code><span style=\"color: #000080\"><strong>CURRENT_DATE<\/strong><\/span><\/code>. Nii saab p\u00e4ringuid luues garanteerida, et alati kasutatakse k\u00e4esolevat aastat, kuud, p\u00e4eva jne.\r\n\r\nKuigi lisamise kuup\u00e4eva p\u00f5hjal ei ole eriti keeruline teose Netflixis olemise aega peast arvutada, on taolisi \u00fclesandeid m\u00f5istlik ikkagi p\u00e4ringu abil sooritada, sest nii saab vanust kasutada n\u00e4iteks piiramiseks. Vanuse leidmiseks on olemas funktsioon <code><span style=\"color: #000080\"><strong>AGE<\/strong><\/span><\/code>, mida on ka funktsiooniga <strong><code><span style=\"color: #000080\">DATE_PART<\/span><\/code><\/strong> v\u00f5imalik kombineerida.\r\n\r\nJooksuta j\u00e4rgnevat p\u00e4ringut, et leida teoste Netflixis olemise aega:\r\n<ul>\r\n \t<li><code><span style=\"color: #970000\"><strong>SELECT<\/strong><\/span> pealkiri, <span style=\"color: #000080\"><strong>AGE<\/strong><\/span>(lisamise_kuupaev) <span style=\"color: #970000\"><strong>FROM<\/strong><\/span> teosed<span style=\"color: #ff0000\"><strong>;<\/strong><\/span><\/code><\/li>\r\n<\/ul>\r\n[h5p id=\"17\"]<code><\/code>\r\n\r\nN\u00fc\u00fcd oleme \u00f5ppinud kasutama nii aritmeetilisi tehteid kui ka mitteagregeerivaid funktsioone veeruavaldistena. Seega saame hakata \u00f5ppima ka keerukamaid, agregeerivaid funktsioone ning uurime, kuidas neid varasemalt \u00f5pituga kombineerida.\r\n\r\n&nbsp;","rendered":"<h2>Aritmeetilised tehted veeruavaldistena<\/h2>\n<p>\u00dcldiselt p\u00e4ritakse andmebaasist k\u00f5igepealt sobivad andmed k\u00e4tte ning alles siis tehakse nende abil tehteid. Siiski, vahel on mugav v\u00f5i lausa vajalik teha tehteid juba p\u00e4rimise ajal. N\u00e4iteks, aritmeetilisi tehteid saab kasutada veeruavaldistena selleks, et p\u00e4ringuid uutmoodi piirata. Vaatame peatselt ka n\u00e4idete p\u00f5hjal, kuidas see k\u00e4ib.<\/p>\n<p>Jooksuta j\u00e4rgnevat p\u00e4ringut ning m\u00f5tiskle, mida sa p\u00e4ringu tulemuses n\u00e4ed:<\/p>\n<ul>\n<li><code><span style=\"color: #970000\"><strong>SELECT<\/strong><\/span> nimi, rahvastikuarv\/pindala <\/code><strong><code><span style=\"color: #970000\">FROM<\/span><\/code><\/strong><code> riigid<span style=\"color: #ff0000\"><strong>;<\/strong><\/span><\/code><\/li>\n<\/ul>\n<p>Pane t\u00e4hele, et kuigi me kasutasime kolme erinevat tabelis olevat tunnust (<code>nimi<\/code>, <code>rahvastikuarv<\/code> ja <code>pindala<\/code>), on p\u00e4ringu tulemuses veerge vaid kaks.<\/p>\n<p>V\u00f5isid ka m\u00e4rgata, et teisel veerul pole korralikku pealkirja. Seda seet\u00f5ttu, et PostgreSQL, DBeaver ega miski muu tarkvara ei oska ennustada, mida t\u00e4histavad tehete tulemusena tekkivad veerud. Meie ise siiski m\u00f5istame, et rahvastikuarvu pindalaga jagades saame rahvastikutiheduse.<\/p>\n<p>Selleks, et teisel veerul oleks inimeste jaoks loetaval ja kenal kujul pealkiri, kirjutame eelneva p\u00e4ringu \u00fcmber nii:<\/p>\n<ul>\n<li><code><span style=\"color: #970000\"><strong>SELECT<\/strong><\/span> nimi, rahvastikuarv\/pindala <span style=\"color: #970000\"><strong>AS<\/strong><\/span> <span style=\"color: #008000\">'rahvastikutihedus'<\/span> <span style=\"color: #970000\"><strong>FROM<\/strong><\/span> riigid<span style=\"color: #ff0000\"><strong>;<\/strong><\/span><\/code><\/li>\n<\/ul>\n<p>\u00d5ppisime siinkohal \u00e4ra uue m\u00e4rks\u00f5na <code><span style=\"color: #970000\"><strong>AS<\/strong><\/span><\/code>. Selle kasutus ei piirdu aritmeetiliste tehetega, vaid seda v\u00f5ib kasutada \u00fcksk\u00f5ik milliste veergude \u00fcmber nimetamiseks.<\/p>\n<p>N\u00e4iteks, kui me oleks eelmise p\u00e4ringu alguses kirjutanud <code>nimi<\/code> asemel <code>nimi <span style=\"color: #970000\"><strong>AS<\/strong><\/span> riigi_nimi<\/code> paistaksid p\u00e4ringu tulemuses veerud <code>riigi_nimi<\/code> ja <code>rahvastikutihedus<\/code>.<\/p>\n<div id=\"h5p-12\">\n<div class=\"h5p-iframe-wrapper\"><iframe id=\"h5p-iframe-12\" class=\"h5p-iframe\" data-content-id=\"12\" style=\"height:1px\" src=\"about:blank\" frameBorder=\"0\" scrolling=\"no\" title=\"AP_15_kontrollk\u00fcsimus_1\"><\/iframe><\/div>\n<\/div>\n<p>Pane t\u00e4hele, et jagasime tunnuse <code>rahvastikuarv<\/code> v\u00e4\u00e4rtusi arvuga <code><span style=\"color: #0000ff\">1000000.0<\/span><\/code>, mitte <code><span style=\"color: #0000ff\">1000000<\/span><\/code>. Tegime seda seet\u00f5ttu, et tunnuse <code>rahvastikuarv<\/code> andmet\u00fc\u00fcp on <strong><code><span style=\"color: #970000\">BIGINT<\/span><\/code><\/strong> ehk suur t\u00e4isarv. Sama loogika kehtiks ka andmet\u00fc\u00fcpidega <code><span style=\"color: #970000\"><strong>INTEGER<\/strong><\/span><\/code> ja <code><span style=\"color: #970000\"><strong>SMALLINT<\/strong><\/span><\/code>. Jagades PostgreSQL&#8217;s omavahel kahte t\u00e4isarvu toimub t\u00e4isarvuline jagamine, mis t\u00e4hendab seda, et n\u00e4iteks avaldise <code><span style=\"color: #0000ff\">50<\/span>\/<span style=\"color: #0000ff\">100<\/span><\/code> v\u00e4\u00e4rtus on <code><span style=\"color: #0000ff\">0<\/span><\/code>, sest arv <code><span style=\"color: #0000ff\">50<\/span><\/code> sisaldab arvu <code><span style=\"color: #0000ff\">10<\/span><span style=\"color: #0000ff\">0<\/span><\/code> null korda.<\/p>\n<p>Katsetage, mis juhtub, kui jagada eelnevas p\u00e4ringus tunnuse <code>rahvastikuarv<\/code> v\u00e4\u00e4rtusi t\u00e4isarvuga <code><span style=\"color: #0000ff\">1000000<\/span><\/code>.<\/p>\n<p>Tasub teada, et m\u00e4rks\u00f5naga <code><span style=\"color: #970000\"><strong>AS<\/strong><\/span><\/code> m\u00e4\u00e4ratud veeru pealkirja on m\u00f5nes SQL-i implementatsioonis v\u00f5imalik kasutada sama p\u00e4ringu piiramiseks p\u00e4ringu <code><span style=\"color: #970000\"><strong>WHERE<\/strong><\/span><\/code> osas, kuid PostgreSQL&#8217;i puhul see v\u00f5imalik ei ole. Seda seet\u00f5ttu, et lihtsalt \u00f6eldes t\u00e4idetakse p\u00e4ringut jooksutades k\u00f5igepealt p\u00e4ringu <code><span style=\"color: #970000\"><strong>WHERE<\/strong><\/span><\/code> osa ja alles siis <code><span style=\"color: #970000\"><strong>SELECT<\/strong><\/span><\/code> osa. Vaatame j\u00e4rgnevat illustreerivat n\u00e4idet.<\/p>\n<p>Oletame, et me soovime leida vaeseid riike ning et meie m\u00f5iste vaesusest on see, et riigi SKP elaniku kohta on v\u00e4hemalt 10 korda v\u00e4iksem kui 50000.<\/p>\n<p>PostgreSQL&#8217;i kasutades saame selliste riikide andmed ja k\u00fcmnekordse SKP k\u00e4tte j\u00e4rgneva p\u00e4ringuga:<\/p>\n<ul>\n<li><code><span style=\"color: #970000\"><strong>SELECT<\/strong><\/span> nimi, skp_elaniku_kohta * <span style=\"color: #0000ff\">10<\/span> <span style=\"color: #970000\"><strong>AS<\/strong><\/span> kumnekordne_skp <span style=\"color: #970000\"><strong>FROM<\/strong><\/span> riigid <span style=\"color: #970000\"><strong>WHERE<\/strong><\/span> skp_elaniku_kohta * <span style=\"color: #0000ff\">10<\/span> &lt;= <span style=\"color: #0000ff\">50000<\/span><span style=\"color: #ff0000\">;<\/span><\/code><\/li>\n<\/ul>\n<p>M\u00f5nes SQL-i implementatsioonis saaks <code><span style=\"color: #970000\"><strong>WHERE<\/strong><\/span><\/code> j\u00e4rel oleva avaldise <code>skp_elaniku_kohta * <span style=\"color: #0000ff\">10<\/span><\/code> asendada eelnevalt m\u00e4\u00e4ratud veeru pealkirjaga <code>kumnekordne_skp<\/code>. Selle funktsionaalsuse tugi teeb laused paremini loetavaks ning aitab v\u00e4hendada p\u00e4ringute kirjutamisel tekkivate vigade arvu, eriti keerukamate tehete korral.<\/p>\n<h2>Mitteagregeerivad funktsioonid<\/h2>\n<p>Peale aritmeetiliste tehete saab veeruavaldistena kasutada ka erinevaid PostgreSQL&#8217;s olemasolevaid funktsioone. Neid funktsioone jaotatakse kaheks \u2013 mitteagregeerivad ja agregeerivad.<\/p>\n<p>Ka andmebaasi kasutajatel on v\u00f5imalik uusi funktsioone luua, kuid seda me selles moodulis ei k\u00e4sitle.<\/p>\n<p>Siin peat\u00fckis alustame mitteagregeerivate funktsioonide uurimisega, agregeerivaid vaatame j\u00e4rgmises. M\u00f5lemad m\u00f5isted seletame samuti alles j\u00e4rgmises peat\u00fckis lahti. Seniks v\u00f5ib mitteagreegerivaid funktsioone vaadata kui viise p\u00e4ritavate tunnuste mingitmoodi t\u00f6\u00f6tlemiseks.<\/p>\n<p>PostgreSQL&#8217;s on mitteagregeerivaid funktsioone v\u00e4ga palju ning neid k\u00f5iki ei j\u00f5ua me siinkohal k\u00e4sitleda. Seega, keskendume m\u00f5ningale kasulikemale neist.<\/p>\n<p>Soovi korral saab k\u00f5igi funktsioonide kohta t\u00e4psemalt lugeda PostgreSQL&#8217;i ametlikust dokumentatsioonist. N\u00e4iteks <a href=\"https:\/\/www.postgresql.org\/docs\/13\/functions-string.html\">siit<\/a> leiab s\u00f5nedele m\u00f5eldud funktsioonide dokumentatsiooni. Kasulikku infot ja abimaterjale leiab kindlasti ka muudest veebiallikatest, kuid enne tasub veenduda nende usaldusv\u00e4\u00e4rsuses.<\/p>\n<p>Vaatame esmalt \u00fchte \u00fclesannet ja selle lahendust ning seej\u00e4rel esimest kasulikku mitteagregeerivat funktsiooni, mis selle lahendamise m\u00e4rksa lihtsamaks teeb.<\/p>\n<div id=\"h5p-13\">\n<div class=\"h5p-iframe-wrapper\"><iframe id=\"h5p-iframe-13\" class=\"h5p-iframe\" data-content-id=\"13\" style=\"height:1px\" src=\"about:blank\" frameBorder=\"0\" scrolling=\"no\" title=\"AP_15_kontrollk\u00fcsimus_2\"><\/iframe><\/div>\n<\/div>\n<p>Eelolevale kirjeldusele vastavat p\u00e4ringut on v\u00f5imalik kirja panna ka palju l\u00fchemalt. Selleks saame kasutada mitteagregeerivat funktsiooni <code><span style=\"color: #970000\"><strong><span style=\"color: #000080\">LENGTH<\/span><\/strong><\/span><\/code>, mida kasutav p\u00e4ring n\u00e4eb v\u00e4lja j\u00e4rgnev:<\/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> <\/code><strong><code><span style=\"color: #000080\">LENGTH<\/span><\/code><\/strong><code>(pealkiri) &lt;= <span style=\"color: #0000ff\">3<\/span><span style=\"color: #ff0000\"><strong>;<\/strong><\/span><\/code><\/li>\n<\/ul>\n<p>N\u00e4eme, et \u00f5igete t\u00f6\u00f6riistade (funktsioonide) teadmisest on palju kasu, kuna see v\u00f5imaldab meil p\u00e4ringuid lihtsamini moodustada. Samuti s\u00e4ilitame niiviisi p\u00e4ringute loetavuse.<\/p>\n<p>Kuigi me kasutasime eelnevas n\u00e4ites mitteagregeerivat funktsiooni p\u00e4ringu piiramiseks, v\u00f5ib neid vabalt ka <code><span style=\"color: #970000\"><strong>SELECT<\/strong><\/span><\/code> osas kasutada.<\/p>\n<p>Oletame, et me soovime leida k\u00f5igi riikide (mitteametlikke) kolmet\u00e4helisi l\u00fchendid, j\u00e4ttes iga riigi nime puhul alles selle kolm esimest t\u00e4hte. Seda saame teha j\u00e4rgneva p\u00e4ringuga:<\/p>\n<ul>\n<li><strong><code><span style=\"color: #970000\">SELECT<\/span><\/code><\/strong><code> <span style=\"color: #000080\"><strong>LEFT<\/strong><\/span>(nimi, <span style=\"color: #0000ff\">3<\/span>) <span style=\"color: #970000\"><strong>FROM<\/strong><\/span> riigid<span style=\"color: #ff0000\"><strong>;<\/strong><\/span><\/code><\/li>\n<\/ul>\n<p>Nagu n\u00e4ha, siis funktsioonile <code><span style=\"color: #000080\"><strong>LEFT<\/strong><\/span><\/code> j\u00e4rgnevad sulud, nii nagu ka funktsiooni <code><span style=\"color: #000080\"><strong>LENGTH<\/strong><\/span><\/code> puhul. Siinkohal on sulgude sees aga kaks elementi \u2013 esimene on t\u00f6\u00f6deldav s\u00f5ne, siinkohal riigi nimi ning teine on arv, mitu s\u00fcmbolit vasakult lugedes alles j\u00e4tta.<\/p>\n<p>Nagu v\u00f5ib arvata, on olemas ka funktsioon <code><span style=\"color: #000080\"><strong>RIGHT<\/strong><\/span><\/code>. See t\u00f6\u00f6tab vastupidiselt ehk alles j\u00e4etakse s\u00f5nede parempoolsed s\u00fcmbolid.<\/p>\n<div id=\"h5p-14\">\n<div class=\"h5p-iframe-wrapper\"><iframe id=\"h5p-iframe-14\" class=\"h5p-iframe\" data-content-id=\"14\" style=\"height:1px\" src=\"about:blank\" frameBorder=\"0\" scrolling=\"no\" title=\"AP_15_kontrollk\u00fcsimus_3\"><\/iframe><\/div>\n<\/div>\n<p>Tasub teada, et kui tunnuse v\u00e4\u00e4rtuse pikkus (eelnevate n\u00e4idete puhul riigi nime pikkus) on v\u00e4iksem kui arv, mis n\u00e4itab mitu s\u00fcmbolit alles j\u00e4tta, ei teki viga, vaid j\u00e4etakse alles k\u00f5ik selle v\u00e4\u00e4rtuse s\u00fcmbolid.<\/p>\n<p>Kuigi eelmise p\u00e4ringu tulemus oli \u00fcpriski huvitav ning kasulik, tahame me \u00fcldjuhul, et riikide l\u00fchendid oleks \u00fcleni suurt\u00e4htedega.<\/p>\n<p>Seda saame teha j\u00e4rgneva modifitseeritud p\u00e4ringuga:<\/p>\n<ul>\n<li><code><span style=\"color: #800000\"><strong>SELECT<\/strong><\/span> <span style=\"color: #000080\"><strong>UPPER<\/strong><\/span>(<\/code><strong><code><span style=\"color: #000080\">LEFT<\/span><\/code><\/strong><code>(nimi, <span style=\"color: #0000ff\">3<\/span>)) <\/code><strong><code><span style=\"color: #970000\">FROM<\/span><\/code><\/strong><code> riigid<span style=\"color: #ff0000\"><strong>;<\/strong><\/span><\/code><\/li>\n<\/ul>\n<p>N\u00e4eme, et funktsioon <strong><code><span style=\"color: #000080\">UPPER<\/span><\/code><\/strong> teisendab sellele j\u00e4rgnevate sulgude sisu \u00fcleni suurt\u00e4heliseks. Siinkohal v\u00f5iks kirjutada <strong><code><span style=\"color: #000080\">UPPER<\/span><\/code><\/strong> ka tunnuse <code>nimi<\/code> \u00fcmber, kuid j\u00f5udluse poolest on \u00fclal esitatud versioon parem, kuna teisendamist rakendatakse vaid 3 s\u00fcmboli, mitte terve s\u00f5ne peal.<\/p>\n<p>Taaskord, nagu v\u00f5ib arvata, on olemas ka m\u00e4rks\u00f5na <code><span style=\"color: #000080\"><strong>LOWER<\/strong><\/span><\/code>, mis t\u00f6\u00f6tab vastupidiselt ehk muudab ette antud tunnuse v\u00e4\u00e4rtused \u00fcleni v\u00e4iket\u00e4heliseks.<\/p>\n<p>Selleks, et s\u00f5nesi paindlikumalt t\u00fckeldada, kui v\u00f5imaldavad funktsioonid <code><span style=\"color: #000080\"><strong>LEFT<\/strong><\/span><\/code> ja <code><span style=\"color: #000080\"><strong>RIGHT<\/strong><\/span><\/code>, saame kasutada uut funktsiooni <code><span style=\"color: #000080\"><strong>SUBSTRING<\/strong><\/span><\/code>, mis t\u00f6\u00f6tab neile \u00fcpriski sarnaselt.<\/p>\n<p>Vaatame taaskord riigi nimede l\u00fchendite n\u00e4idet. Seekord soovime, et l\u00fchend algaks nime 2. s\u00fcmbolist, oleks 5 s\u00fcmbolit pikk ning et k\u00f5ik l\u00fchendi t\u00e4hed oleks v\u00e4ikesed.<\/p>\n<p>Seda saame teha j\u00e4rgneva p\u00e4ringuga:<\/p>\n<ul>\n<li><code><span style=\"color: #970000\"><strong>SELECT<\/strong><\/span> <span style=\"color: #000080\"><strong>LOWER<\/strong><\/span>(<\/code><strong><code><span style=\"color: #000080\">SUBSTRING<\/span><\/code><\/strong><code>(nimi, <span style=\"color: #0000ff\">2<\/span>, <span style=\"color: #0000ff\">5<\/span>)) <span style=\"color: #970000\"><strong>FROM<\/strong><\/span> riigid<span style=\"color: #ff0000\"><strong>;<\/strong><\/span><\/code><\/li>\n<\/ul>\n<p>N\u00e4eme, et funktsioon <code><span style=\"color: #000080\"><strong>SUBSTRING<\/strong><\/span><\/code> v\u00f5tab samuti esimese elemendina t\u00f6\u00f6deldava tunnuse. Teine element on aga indeks, mis n\u00e4itab, mis on esimene alles j\u00e4etav s\u00fcmbol ning kolmas element on arv, mis n\u00e4itab, mitu s\u00fcmbolit tuleb alates indeksist (kaasa arvatud) alles j\u00e4tta.<\/p>\n<p>Tasub teada, et erinevalt enamustest programmeerimiskeeltest, \u00b4kus indekseerimine algab 0-st, algavad PostgreSQL&#8217;s indeksid 1-st. Seega oligi eelnevas n\u00e4ites esimene alles j\u00e4etav s\u00fcmbol riigi nime teine, mitte kolmas s\u00fcmbol.<\/p>\n<p>Siiani oleme p\u00e4ringutes kasutanud erinevaid tehteid ja funktsioone nii arvu kui ka s\u00f5ne kujul olevate tunnuste t\u00f6\u00f6tlemiseks. Funktsioone aga leidub ka paljude teiste andmet\u00fc\u00fcpide jaoks, nagu <code><span style=\"color: #000080\"><strong>TIMESTAMP<\/strong><\/span><\/code>.<\/p>\n<div id=\"h5p-15\">\n<div class=\"h5p-iframe-wrapper\"><iframe id=\"h5p-iframe-15\" class=\"h5p-iframe\" data-content-id=\"15\" style=\"height:1px\" src=\"about:blank\" frameBorder=\"0\" scrolling=\"no\" title=\"AP_15_kontrollk\u00fcsimus_4\"><\/iframe><\/div>\n<\/div>\n<p>PostgreSQL&#8217;s on tehtud kuup\u00e4evade t\u00f6\u00f6tlemine v\u00e4ga lihtsaks funktsiooni <strong><code><span style=\"color: #000080\">DATE_PART<\/span><\/code><\/strong> abil. Jooksuta j\u00e4rgnevat p\u00e4ringut ning proovi m\u00f5ista, kuidas <code><span style=\"color: #000080\"><strong>DATE_PART<\/strong><\/span><\/code> t\u00f6\u00f6tab ning kuidas seda veel kasutada saaks:<\/p>\n<ul>\n<li><code><span style=\"color: #970000\"><strong>SELECT<\/strong><\/span> pealkiri, vanusepiirang, zanr, <\/code><strong><code><span style=\"color: #000080\">DATE_PART<\/span><\/code><\/strong><code>(<span style=\"color: #008000\">'year'<\/span>, lisamise_kuupaev) <span style=\"color: #970000\"><strong>FROM<\/strong><\/span> teosed<span style=\"color: #ff0000\"><strong>;<\/strong><\/span><\/code><\/li>\n<\/ul>\n<div id=\"h5p-16\">\n<div class=\"h5p-iframe-wrapper\"><iframe id=\"h5p-iframe-16\" class=\"h5p-iframe\" data-content-id=\"16\" style=\"height:1px\" src=\"about:blank\" frameBorder=\"0\" scrolling=\"no\" title=\"AP_14_kontrollk\u00fcsimus_5\"><\/iframe><\/div>\n<\/div>\n<p>Tasub teada, et <strong><code><span style=\"color: #000080\">DATE_PART<\/span><\/code><\/strong> aktsepteerib t\u00e4psustava argumendina veel n\u00e4iteks s\u00f5nesid <code>hour<\/code>, <code>minute<\/code> ja <code>second<\/code>. Kuna tunnuse <code>lisamise_kuupaev<\/code> v\u00e4\u00e4rtused hetkel nii t\u00e4psed ei ole ehk need ei sisalda tunde, minuteid ja sekundeid, siis tagastatakse nende argumentide kasutamisel alati 0-i, sest vaikev\u00e4\u00e4rtusena on kellaaeg 00:00:00.<\/p>\n<p>Tasub ka teada, et funktsioon <code><span style=\"color: #000080\"><strong>DATE_PART<\/strong><\/span><\/code> aktsepteerib kuup\u00e4evana spetsiaalset m\u00e4rks\u00f5na <code><span style=\"color: #000080\"><strong>CURRENT_DATE<\/strong><\/span><\/code>. Nii saab p\u00e4ringuid luues garanteerida, et alati kasutatakse k\u00e4esolevat aastat, kuud, p\u00e4eva jne.<\/p>\n<p>Kuigi lisamise kuup\u00e4eva p\u00f5hjal ei ole eriti keeruline teose Netflixis olemise aega peast arvutada, on taolisi \u00fclesandeid m\u00f5istlik ikkagi p\u00e4ringu abil sooritada, sest nii saab vanust kasutada n\u00e4iteks piiramiseks. Vanuse leidmiseks on olemas funktsioon <code><span style=\"color: #000080\"><strong>AGE<\/strong><\/span><\/code>, mida on ka funktsiooniga <strong><code><span style=\"color: #000080\">DATE_PART<\/span><\/code><\/strong> v\u00f5imalik kombineerida.<\/p>\n<p>Jooksuta j\u00e4rgnevat p\u00e4ringut, et leida teoste Netflixis olemise aega:<\/p>\n<ul>\n<li><code><span style=\"color: #970000\"><strong>SELECT<\/strong><\/span> pealkiri, <span style=\"color: #000080\"><strong>AGE<\/strong><\/span>(lisamise_kuupaev) <span style=\"color: #970000\"><strong>FROM<\/strong><\/span> teosed<span style=\"color: #ff0000\"><strong>;<\/strong><\/span><\/code><\/li>\n<\/ul>\n<div id=\"h5p-17\">\n<div class=\"h5p-iframe-wrapper\"><iframe id=\"h5p-iframe-17\" class=\"h5p-iframe\" data-content-id=\"17\" style=\"height:1px\" src=\"about:blank\" frameBorder=\"0\" scrolling=\"no\" title=\"AP_14_kontrollk\u00fcsimus_6\"><\/iframe><\/div>\n<\/div>\n<p><code><\/code><\/p>\n<p>N\u00fc\u00fcd oleme \u00f5ppinud kasutama nii aritmeetilisi tehteid kui ka mitteagregeerivaid funktsioone veeruavaldistena. Seega saame hakata \u00f5ppima ka keerukamaid, agregeerivaid funktsioone ning uurime, kuidas neid varasemalt \u00f5pituga kombineerida.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"author":32,"menu_order":5,"template":"","meta":{"pb_show_title":"on","pb_short_title":"","pb_subtitle":"","pb_authors":[],"pb_section_license":""},"chapter-type":[],"contributor":[],"license":[],"class_list":["post-41","chapter","type-chapter","status-publish","hentry"],"part":31,"_links":{"self":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-json\/pressbooks\/v2\/chapters\/41","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":83,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-json\/pressbooks\/v2\/chapters\/41\/revisions"}],"predecessor-version":[{"id":1400,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-json\/pressbooks\/v2\/chapters\/41\/revisions\/1400"}],"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\/41\/metadata\/"}],"wp:attachment":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-json\/wp\/v2\/media?parent=41"}],"wp:term":[{"taxonomy":"chapter-type","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-json\/pressbooks\/v2\/chapter-type?post=41"},{"taxonomy":"contributor","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-json\/wp\/v2\/contributor?post=41"},{"taxonomy":"license","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/lisamoodulid\/wp-json\/wp\/v2\/license?post=41"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}