Kontakt:
- rjasko (zavinac) dcs.fmph.uniba.sk
Praktické cvičenia z databáz 2015/2016 ZS
Ján Mazák, M255, mazak at dcs.fmph.uniba.sk
Michal Rjaško, rjasko at dcs.fmph.uniba.sk
Domáce ulohy
Cvičenie 11 (14.12.2015)
SQLLite
krátke slajdy
SQLLite je databázový systéme, ktorý nevyžaduje samostatný server, beží v rámci výpočtového procesu Vašej aplikácie.
Ak chcete vo Vašej aplikácii využiť relačnú databázu a nepotrebujete centralizované úložisko (ktoré by zbieralo dáta z viacerých aplikácií), SQLLite je vhodné riešenie.
Úlohy:
- Prepíšte Váš program z predchádzajúceho cvičenia do SQL lite
Cvičenie 10 (7.12.2015)
Postgres a JAVA - pokračovanie
Na cvičení budeme používať databázu známok, ktorú sme vytvárali na predchádzajúcich cvičeniach.
- Napíšte program, ktorý sa pripojí na databázu a vypíšte na konzolu mená študentov.
-
Naplňte tabuľky náhodnými dátami. Vytvorte si sadu niekoľkých mien a niekoľkých priezvisk (napr. 20-30 mien a 20-30 priezvisk). Nezdržujte sa dlho vymýšľaním mien (radšej použite "AAA", "BBB",...)
-
Naplňte tabuľky tak, aby ste mali cca 100 učiteľov, 600 študentov, 20 predmetov, a aby mal každý študent okolo 200 známok (cca 10-15 z každého predmetu, t.j. spolu okolo 120 000 známok).
-
Zmerajte koľko trvá naplnenie tabuľky známok dátami (vypíšte na konzolu, koľko milisekúnd operácia trvala).
-
Pri napĺňaní tabuliek vyskúšajte rôzne spôsoby optimalizácie a porovnajte ich rýchlosti (viď http://www.postgresql.org/docs/9.1/static/populate.html:
- Každý riadok najprv vkladajte jedným insertom bez použitia prepared statementu
- Každý riadok najprv vkladajte jedným insertom s použitím prepared statementu
- Spojte niekoľko riadkov do jedného insertu - pravdepodobne nebudeme môcť urobiť INSERT so všetkými riadkami, ktoré chcete vložiť kvôli obmedzaniam na maximálnu veľkosť dotazu (cca niekoľko MB). Vhodné je preto spojiť do jedného INSERT dotazu od 100 do 1000 riadkov. Môžete vyskúšať, koľko Vám systém dovolí
- Vykonajte všetky INSERT dotazy v jednej transakcii
- Pred vkladaním zrušte všetky indexy tabuľky a po vložení ich vytvorte
- Pred vkladaním zrušte všetky CONSTRAINTy tabuľky a po vložení ich vytvorte
-
Napíšte program, ktorý z konzoly načíta Meno a Priezvisko a triedu študenta a vypíšte jeho známky (nazov predmetu: známky z predmetu oddelené čiarkov).
Ak je študentov s daným menom a triedou viac, vypíšte prvého z nich. Použite prepared statement.
Zabezpečte, aby pri písaní mena nezáležalo na veľkých a malých písmenách.
-
Upravte program z predchádzajúcej úlohy tak, aby systém vyhľadal študenta, ak používateľ napíšte len časť jeho mena / priezviska. Ak sa nájde viac študentov spĺňajúcich vyhľadávacie kritéria, dajte používateľovi možnosť vybrať si (napr. vypísaním zoznamu a používateľ bude musieť zadať por. číslo / ID, ktorého študenta myslel).
EXPLAIN
-
Napíšte dotaz, ktorý pre každú triedu a predmet (ktorý daná trieda má pridelený) a každého učiteľa, ktorý má známky v tejto triede z daného predmetu vráti počet zadaných známok od daného učiteľa z daného predmetu, priemerný počet známok na študenta (t.j. počet známok / počet rôznych študentov, ktorým učiteľ zadal známku) a priemer známok, ktoré daný učiteľ z predmetu udelil (predpokladajme, že známky sú iba v rozsahu 1-5). T.j. Váš dotaz má vrátit n-ticu [meno_triedy, meno_predmetu, meno_ucitela, pocet_znamok, priemerny_pocet_znamok_na_studenta, priemer_znamok].
Použite príkaz EXPLAIN (ANALYZE) na zobrazenie plánu výpočtu dotazu a jeho prípadné zoptimalizovanie .
Cvičenie 9 (30.11.2015)
Dokončenie minulého cvičenia GRANT/REVOKE:
- Pripojte sa na databázu "test" (psql test), vytvorte novú tabuľku "test_vasemeno" so stĺpcami i INTEGER a t TEXT a doplňte do nej niekoľko riadkov. Prideľte právo na SELECT z tejto tabuľky role "test" (ďalej testovacia rola) a overte pomocou \z, či je naozaj pridelené. Spustite psql -U test test, skúste si prezrieť obsah tabuľky test_vasemeno a skúste do nej vložiť nový riadok.
- Upravte testovacej role práva na SELECT tak, aby mala možnosť prezerať si v tabuľke test_vasemeno len obsah stĺpca t.
- Povoľte spolužiakovi vkladať do tabuľky test_vasemeno riadky tak, aby mohol toto oprávnenie prideliť iným. Vyskúšajte: nech pridelí toto oprávnenie role test. Potom mu odoberte možnosť prideliť toto oprávnenie iným (REVOKE GRANT OPTION FOR) tak, aby stále sám mohol vkladať riadky. Požiadajte ho, nech vyskúša, či to funguje.
- Vyskúšajte možnosť kaskádovitého odobratia oprávnenia (pozri CASCADE na stránke http://www.postgresql.org/docs/9.1/static/sql-revoke.html).
- Odoberte spolužiakom a testovacej role všetky oprávnenia, ktoré ste im udelili (REVOKE ALL PRIVILEGES FROM).
Pripojenie na Postgres z JAVY
Prezentácia [pdf]
Z JAVY sa budeme na databázu Postgres pripájať cez TCP/IP. Aby to však fungovalo, každý si musí nastaviť svoje Postgres heslo a vytvoriť SSH tunel na cvika.dcs.fmph.uniba.sk
- Pripojte sa cez SSH na cvika.dcs.fmph.uniba.sk
- Spustite postgres konzolu príkazom
psql
- Nastavte si heslo pomocou:
ALTER USER {vase_prihlasovacie_meno} WITH PASSWORD '{vase_nove_heslo}'
- Funkčnosť hesla možno otestovať príkazom
psql -h 127.0.0.1 test {vase_prihlasovacie_meno}
- Aby sme sa mohli pripájať na postgres bežiaci na cvika.dcs.fmph.uniba.sk z vývojového prostriedia Eclipse (príp. iného), je potrebné nastaviť SSH tunel:
- LINUX:
ssh -L5432:127.0.0.1:5432 meno_pouzivatela@cvika.dcs.fmph.uniba.sk
- WINDOWS: v Putty treba nastaviť "local port forwarding" z portu 5432 na 127.0.0.1:5432
- Vytvorte si nový JAVA projekt
- Stiahnite si Postgres JDBC driver: https://jdbc.postgresql.org/download.html a nakopírujte ho do adresára projektu
- Pridajte si stiahnutý JAR súbor do "build path". V eclipse je to v menu "Project" -> "properties...":
- Tutoriál, ako sa pripojiť na postgres z JAVY: http://www.tutorialspoint.com/postgresql/postgresql_java.htm
- Prípadne postupujte podľa prezentácie
- Na cvičení budeme používať databázu známok, ktorú sme vytvárali na predchádzajúcich cvičeniach.
Úlohy:
- Napíšte program, ktorý sa pripojí na databázu a vypíšte na konzolu mená študentov.
-
Naplňte tabuľky náhodnými dátami. Vytvorte si sadu niekoľkých mien a niekoľkých priezvisk (napr. 20-30 mien a 20-30 priezvisk). Nezdržujte sa dlho vymýšľaním mien (radšej použite "AAA", "BBB",...)
-
Naplňte tabuľky tak, aby ste mali cca 100 učiteľov, 600 študentov, 20 predmetov, a aby mal každý študent okolo 200 známok (cca 10-15 z každého predmetu, t.j. spolu okolo 120 000 známok).
-
Zmerajte koľko trvá naplnenie tabuľky známok dátami (vypíšte na konzolu, koľko milisekúnd operácia trvala).
-
Pri napĺňaní tabuliek vyskúšajte rôzne spôsoby optimalizácie a porovnajte ich rýchlosti (viď http://www.postgresql.org/docs/9.1/static/populate.html:
- Každý riadok najprv vkladajte jedným insertom bez použitia prepared statementu
- Každý riadok najprv vkladajte jedným insertom s použitím prepared statementu
- Spojte niekoľko riadkov do jedného insertu - pravdepodobne nebudeme môcť urobiť INSERT so všetkými riadkami, ktoré chcete vložiť kvôli obmedzaniam na maximálnu veľkosť dotazu (cca niekoľko MB). Vhodné je preto spojiť do jedného INSERT dotazu od 100 do 1000 riadkov. Môžete vyskúšať, koľko Vám systém dovolí
- Vykonajte všetky INSERT dotazy v jednej transakcii
- Pred vkladaním zrušte všetky indexy tabuľky a po vložení ich vytvorte
- Pred vkladaním zrušte všetky CONSTRAINTy tabuľky a po vložení ich vytvorte
-
Napíšte program, ktorý z konzoly načíta Meno a Priezvisko a triedu študenta a vypíšte jeho známky (nazov predmetu: známky z predmetu oddelené čiarkov).
Ak je študentov s daným menom a triedou viac, vypíšte prvého z nich. Použite prepared statement.
Zabezpečte, aby pri písaní mena nezáležalo na veľkých a malých písmenách.
-
Upravte program z predchádzajúcej úlohy tak, aby systém vyhľadal študenta, ak používateľ napíšte len časť jeho mena / priezviska. Ak sa nájde viac študentov spĺňajúcich vyhľadávacie kritéria, dajte používateľovi možnosť vybrať si (napr. vypísaním zoznamu a používateľ bude musieť zadať por. číslo / ID, ktorého študenta myslel).
Cvičenie 8 (23.11.2015)
Constraints:
Prezentácia [pdf]
Pokračujeme v práci s tabuľkami vytvorenými minule (cvičenie 7).
- Pre každú tabuľku zvoľte primárny kľúč.
- Pomocou UNIQUE zabezpečte, aby trieda mohla mať predmet pridelený len raz (vyhýbame sa duplicitným záznamom).
- Zakážte NULL v stĺpcoch, kde je nutné evidovať hodnotu (napr. nie je nutné, aby študent mal evidované pohlavie, ale musí mať meno).
- Obmedzte pomocou CHECK možné hodnoty pre pohlavie a dátum narodenia (zvoľte si nejaký zmysluplný rozsah). Vyskúšajte, či vaše obmedzenie funguje pri INSERT aj pri UPDATE.
- Doplňte cudzie kľúče do tabuľky známok: hodnoty v stĺpcoch musia odkazovať na existujúceho študenta, učiteľa a predmet. Overte funkčnosť pri INSERT, kde odkaz na predmet je neexistujúci alebo NULL.
- Ku všetkým cudzím kľúčom doplňte zmysluplné hodnoty pre ON DELETE: pri zmazaní študenta treba zmazať záznamy o jeho známkach; učiteľa alebo predmet nie je možné zmazať, ak sa ich týkajú nejaké záznamy o známkach. Overte, či vaše nastavenia fungujú pri pokuse o zmazanie všetkých učiteľov, všetkých predmetov či jednotlivých študentov.
- Ku všetkým cudzím kľúčom doplňte zmysluplné hodnoty pre ON UPDATE a nastavte okamžité vyhodnocovanie s možnosťou zmeniť ho v rámci transakcie (DEFERRABLE INITIALLY IMMEDIATE).
- Napíšte dotaz, ktorý presunie všetky známky z biológie pre študentov z 1.A z jedného učiteľa na iného. Preverte, že dotaz funguje správne.
- Vymažte z databázy všetkých učiteľov, ktorí udelili viac ako 5 známok. (Možno budete potrebovať viac ako 1 dotaz.)
- Pripojte sa na databázu "test" (psql test), vytvorte novú tabuľku "test_vasemeno" so stĺpcami i INTEGER a t TEXT a doplňte do nej niekoľko riadkov. Prideľte právo na SELECT z tejto tabuľky role "test" (ďalej testovacia rola) a overte pomocou \z, či je naozaj pridelené. Spustite psql -U test test, skúste si prezrieť obsah tabuľky test_vasemeno a skúste do nej vložiť nový riadok.
- Upravte testovacej role práva na SELECT tak, aby mala možnosť prezerať si v tabuľke test_vasemeno len obsah stĺpca t.
- Povoľte spolužiakovi vkladať do tabuľky test_vasemeno riadky tak, aby mohol toto oprávnenie prideliť iným. Vyskúšajte: nech pridelí toto oprávnenie role test. Potom mu odoberte možnosť prideliť toto oprávnenie iným (REVOKE GRANT OPTION FOR) tak, aby stále sám mohol vkladať riadky. Požiadajte ho, nech vyskúša, či to funguje.
- Vyskúšajte možnosť kaskádovitého odobratia oprávnenia (pozri CASCADE na stránke http://www.postgresql.org/docs/9.1/static/sql-revoke.html).
- Odoberte spolužiakom a testovacej role všetky oprávnenia, ktoré ste im udelili (REVOKE ALL PRIVILEGES FROM).
Cvičenie 7 (9.11.2015)
SQL, DDL, DML:
- slajdy z cvičení
- Postgres dokumentácia:
- Zadanie:
- Chceme založiť databázu pre evidenciu známok, študentov a učiteľov na strednej škole. Potrebujeme evidovať nasledovné:
- Študent - meno, priezvisko, pohlavie, trieda, dátum narodenia
- Učiteľ - meno, priezvisko, pohlavie
- Predmet - názov predmetu, skratka
- Známka - samotná známka (text), študent, ktorý učiteľ ju zadal, z akého je predmetu, čas zadania, z čoho bola, váha známky (do priemeru)
- Nie všetky triedy majú všetky predmety, preto potrebujeme evidovať ktorá trieda ma ktorý predmet
-
Navrhnite štruktúru tabuliek vyššie uvedenej databýzy - vytvorte súbor znamky.sql, ktorý bude obsahovať SQL definície tabuliek (CREATE TABLE).
- Pred každý CREATE TABLE pridajte aj DROP TABLE IF EXISTS, aby ste súbor znamky.sql mohli spúšťat viac krát.
-
Súbor znamky.sql doplňte o údaje - do každej tabuľky pridajte pomocou INSERT niekoľko riadkov.
- Skúste použiť diakritiku - pozor na kódovanie súboru znamky.sql
-
Rozhodli sme sa sprístupniť zadávanie a prezeranie známok cez internet. Pomocou ALTER TABLE doplňte do tabuliek študent a učiteľ stĺpce na evidenciu prihlasovacích mien a hesiel. Vytvorte index na vyhľadávanie podľa prihlasovacieho mena.
-
Niektorí z učiteľov sa rozhodol odísť zo školy a chceme ho vymazať z databázy. Známky však musia ostať, t.j. jeho známky sa presunú na iného učiteľa.
- Napíšte dotaz, ktorý vymaže učiteľa z databázy (na základe jeho ID)
- Napíšte dotaz, ktorý presunie známky z jedného učiteľa na druhého (poznáme ID oboch učiteľov)
- Chceme zdvojnásobiť váhu všetkých známok, ktorých hodnota začína 5 - napíšte dotaz
- Na koniec súboru znamky.sql napíšte nasledovné SELECT dotazy
-
Vypíšte meno študenta, predmet, počet študentových známok z daného predmetu a zoznam týchto známok oddelený čiarkov (skúste použiť funkciu array_agg, prípadne aj array_to_string
-
Meno študenta a meno predmetu, kde predmet je taký, z ktorého študent ešte nemá žiadnu známku ale mal by mať (tento predmet je v zozname predmetov jeho triedy).
Doplňte zoznam o priemerný počet známok z daného predmetu študentových spolužiakov z triedy.
-
Pre každý predmet spočítajte celkový počet a priemerný počet známok na žiaka, koľko učiteľov zadáva známky z tohto predmetu. Výsledok usporiadajte podľa celkového počtu známok a zobrazte len prvých 10 riadkov.
-
Pre každého učiteľa vypočítajte priemer prirodzeno-číselných známok, ktore zadal. Pozor, funkcia AVG potrebuje na vstupe číslo - potrebujete použiť CAST( .. AS INTEGER). Ak to číslo však nebude číslo, vyhlási to chybu. Nečíselné známky odfiltrujte napr. pomocou regulárnych výrazov (napr. konštrukcia WHERE znamka ~ '^[0-9]*$').
Cvičenie 6 (2.11.2015)
Agregácia v Datalogu:
- Skopírujte si súbory z ~rjasko1/db6 do svojho domovského adresára
cp -r /home/rjasko1/db6 ~; cd ~/db6
- Adresár obsahuje súbory:
- query.pl - Pomocný súbor obsahujúci definíciu príkazu q(_) na formátovanie výsledkov dotazov
- emp.pl - "Dáta" databázy EMP
- subtotal.pl - Pomocný súbor obsahujúci SWI-prolog implementáciu predikátu subtotal
- queries_emp_sub.pl - Súbor obsahujúci zoznam dotazov, ktoré máte vypracovať. Tento súbor budete editovať
- V jednom okne spustite datalogovské prostredie príkazom swipl -s queries_emp_sub.pl
- V druhom okne editujte súbor queries_emp_sub.pl, napr. pomocou vim queries_emp_sub.pl a postupujte podľa pokynov v tomto súbore
Agregácia v SQL II
- Adresár db6 obsahuje naviac aj súbory:
- world.sql - súbor obsahuje definíciu a dáta sample databázy
- zadanie.sql - Súbor obsahujúci zoznam dotazov, ktoré máte vypracovať. Tento súbor budete editovať
- Naimportujte si databázu world:
psql -f world.sql
- V jednom okne editujete súbor zadanie.sql
- V druhom okne spúšťate dotazy cez psql -f zadanie.sql
Cvičenie 5 (26.10.2015)
Agregácia v SQL
- Skopírujte si súbory z ~rjasko1/db5 do svojho domovského adresára
cp -r /home/rjasko1/db5 ~; cd ~/db5
- Adresár obsahuje súbor:
- queries_emp_sub.sql - Súbor obsahujúci zoznam dotazov, ktoré máte vypracovať. Tento súbor budete editovať
- V jednom okne editujete súbor queries_emp_sub.sql
- V druhom okne spúšťate dotazy cez psql -f queries_emp_sub.sql
Cvičenie 4 (19.10.2015)
Práca s SQL prostredím
- Ako databázový server budeme používať PostgreSQL
- Dokumentácia PostgreSQL: http://www.postgresql.org/docs/9.4/interactive/index.html
- Máme otvorené dve terminálové okná na cvika.dcs.fmph.uniba.sk
- V jednom okne editujeme súbor so zadaním, napr. vim queries_emp.sql
- V druhom okne editovaný súbor spustíme (všetky dotazy v ňom) príkazom
psql -f queries_emp.sql
Zadanie
- Skopírujte si súbory z ~rjasko1/db4 do svojho domovského adresára
cp -r /home/rjasko1/db4 ~; cd ~/db4
- Adresár obsahuje 2 súbory:
- queries_emp.sql - Súbor obsahujúci zoznam dotazov, ktoré máte vypracovať. Tento súbor budete editovať
- emp.sql - Inštalačný skript databázy EMP. Môžete ho použiť, ak si budete chciet rozbehať EMP databázu doma na svojom počítači. Inak s ním netreba nič robiť.
- V jednom okne editujete súbor queries_emp.sql
- V druhom okne spúšťate dotazy cez psql -f queries_emp.sql
Práca s konzolov PostgreSQL
Cvičenie 3 (12.10.2015)
Rekurzívne dotazy v datalogu.
- Skopírujte si súbory z ~rjasko1/db3 do svojho domovského adresára
cp -r ~rjasko1/db3 ~; cd ~/db3
- Adresár obsahuje 2 súbory:
- query.pl - Pomocný súbor obsahujúci definíciu príkazu q(_) na formátovanie výsledkov dotazov
- zadanie.pl - Súbor obsahujúci zoznam dotazov, ktoré máte vypracovať. Tento súbor budete editovať
- V jednom okne spustite datalogovské prostredie príkazom swipl -s zadanie.pl
- V druhom okne editujte súbor zadanie.pl, napr. pomocou vim zadanie.pl a postupujte podľa pokynov v tomto súbore
Cvičenie 2 (5.10.2015)
Ešte raz datalog.
- Skopírujte si súbory z ~rjasko/db2 do svojho domovského adresára
cp -r ~rjasko/db2 ~; cd ~/db2
- Adresár obsahuje 2 súbory:
- query.pl - Pomocný súbor obsahujúci definíciu príkazu q(_) na formátovanie výsledkov dotazov
- zadanie.pl - Súbor obsahujúci zoznam dotazov, ktoré máte vypracovať. Tento súbor budete editovať
- V jednom okne spustite datalogovské prostredie príkazom swipl -s zadanie.pl
- V druhom okne editujte súbor zadanie.pl, napr. pomocou vim zadanie.pl a postupujte podľa pokynov v tomto súbore
Cvičenie 1 (28.9.2015)
Dotazy nad databázov EMP.
- Skopírujte si súbory z ~rjasko/db1 do svojho domovského adresára
cp -r ~rjasko/db1 ~; cd ~/db1
- Adresár obsahuje 3 súbory:
- query.pl - Pomocný súbor obsahujúci definíciu príkazu q(_) na formátovanie výsledkov dotazov
- emp.pl - "Dáta" databázy EMP
- queries_emp.pl - Súbor obsahujúci zoznam dotazov, ktoré máte vypracovať. Tento súbor budete editovať
- V jednom okne spustite datalogovské prostredie príkazom swipl -s queries_emp.pl
- V druhom okne editujte súbor queries_emp.pl, napr. pomocou vim queries_emp.pl
Datalog
Práca s prostredím
Prostredie, v ktorom budeme na cvičeniach pracovať beží na serveri cvika.dcs.fmph.uniba.sk. T.j. treba sa:
- Pripojit cez ssh na pocitac cvika (cvika.dcs.fmph.uniba.sk). To znamena
pod Linuxom otvorit terminalove okno a urobit
ssh username@cvika,
pod Windowsami treba pouzit putty. V tomto okne sa odohrava vsetko
ostatne. Username a heslo su
identicke s tymi v terminalke.
- Je rozumne vyrobit cca. 3 take okna a v kazdom byt prihlaseny na
pocitaci cvika.
- Na pocitaci cvika, skopirovat subory pre dane cvicenie, napr.
z ~rjasko/db1 do svojho home-directory na pocitaci cvika:
cp -r ~rjasko/db1 ~; cd ~/db1
- V jednom okne editujete súbor v ktorom píšete dotazy, napr.
vim queries_emp.pl
- V druhom okne máte spustené prostredie prologu:
swipl -s queries_emp.pl
- Po vpisani dotazu do suboru v OKNE1 treba subor queries_emp.pl ulozit na
disk (v editore vim sa tak urobi postupnym stlacenim "ESC" a ":w").
Nasledne v OKNE2 skompilujete novu verziu suboru prikazom
make.
(Je dobre pozriet sa, ci kompilator hlasi nejake errors. Ak ano, treba
sa vratit do editora, odstranit chyby a kompilaciu zopakovat. Kompilator dost
dobre napoveda, kde ste urobili chybu.)
Potom sa za ten otaznik v OKNE2 daju pisat dotazy ako napriklad
?- q(jobs(J)).
Predikat "q(_)" sluzi na pekne formatovanie vystupu a eliminaciu
"duplikatov" (ktore v skutocnosti nie su duplikatmi, len tymi istymi
viacnasobne najdenymi N-ticami)
Praktické rady k SWI-prologu / Datalogu
- Reťazce začínajúce veľkým písmenom systém pokladá za premenné. Konštanty sa začínajú malými písmenami. Ak to popletiete, bude to dávať podivne zlé výsledky.
- Na vyhodnocovanie aritmetických výrazov slúži operátor is, čiže napr. X is 2+3, nie X = 2+3 (v tom druhom prípade symbol = bude interpretovaný ako unifikácia termov a nedôjde k žiadnej aritmetickej operácii).
Hodnotenie
Body sa dajú získať len za domáce úlohy. Tie budú tri, a to za 30, 30 a 40 bodov.
- A --- 90 a viac bodov
- B --- 80 až 89 bodov
- C --- 70 až 79 bodov
- D --- 60 až 69 bodov
- E --- 50 až 59 bodov
- Fx --- menej ako 50 bodov