background image

LITERATÚRA: 
Jaroslav Pokorný „Databázová abeceda“ 
Všetky manuály: POSTGRE SQL 7.2 
C.J.Date „an introduction to database systems“ 
Someber A. „databázové systémy“, 1988 
 

DATABÁZOVÉ SYSTÉMY

DATABÁZOVÉ SYSTÉMY

DATABÁZOVÉ SYSTÉMY

DATABÁZOVÉ SYSTÉMY    

 
Databáza – súbor informácií, čísel, znakov, diagramov, ktorého systematická štruktúra umožňuje aby tieto 
informácie mohli byť vyhľadávané pomocou počítača. Podľa tejto definície aj množina dátových súborov by 
mohla byť chápaná ako databáza.  
 
Databáza obsahuje: dáta + nástroje pre prácu s týmito dátami (sql) 
Súčasné databázy obsahujú nielen text. Informácie ale aj zvuk, video, obrázky, mapy, atď. 
 
Databázová technológia je pojem, ktorý sa zaoberá riadením veľkého množstva perzistentných (stály), 
spoľahlivých a zdieľaných dát. 
 
Perzistencia – dáta pretrvávajú, t.j. existujú v databáze nezávisle na programoch, tiež nezávisle   
                        na tom či s nimi užívateľ pracuje alebo nie.  
Spoľahlivosť – databázy sú chránené užívateľskými účtami a heslami  
Integrity – je schopnosť databázy vyhnúť sa strate konzistencie 
Security – ochrana pred neoprávneným prístupom 
Retundancia – nezávislosť prvkov a to, že sa v DS neopakujú zbytočne 
Nezávislosť – znamená že programy ktoré umožňujú prístup k dátam sú nezávislé na tom ako    
                      a kde sú dáta uložené 
 
História databáz je silne spätá s praxou. Prvé systémy SRBD sa objavujú v 2.polovici 60-tych rokov, 
vychádzali z dvoch prístupov: 

1.  pomocou ukazovateľov sa vzájomne spájali záznamy súborov dát 
2.  vytvárali sa logicky aj fyzicky nezávislé súbory dát (relačné databázy) 

 
1.prístup zjednodušoval programovanie väzieb medzi dátami, 2.z nich vytvoril silné jazyky na dotazovanie 
a aktualizáciu databáz SQL (structure query language) 
 
V 80-tych rokoch sa tabuľka alebo relácia stala základným prvkom tvorby databáz.  
druhá polovica 90-tych rokov – vývoj a použitie objektových databáz 
 

História jazyka SQL 

1975 - firma IBM vyvinula sadu príkazov umožňujúcu prácu nad relačnou databázou. Tak vznikli prvé 
základy jazyka, ktorý sa na začiatku volal SEQL.  
1979 začína používať tieto príkazy aj firma ORACLE 
1983 – prichádza firma IBM so svojim SQL serverom DB2, INFORMIX, SYBASE 
1986 – je štandardizovaný jazyk SQL 
1992  - boli odstránené nedostatky predchádzajúceho jazyka a začína sa používať SQL 92 a používa sa 
dodnes 
SQL3 – nadstavba SQL 92, nesie objektové črty – objektový prístup do databáz 
 
Databázy: DB3, MY SQL, ORACLE, SYBASE, FOXPRO 
 

background image

Tabuľka – základný prvok relačnej databázy. Relačné DS sú postavené na základe definície relačného 
modelu, ktorý v 1970 zaviedol americký matematik E.F.Codd a spolu s relačným systémom riadenia bázy dát 
sa stal najpoužívanejším DS. Relačný dátový model vychádzal z nasledovných požiadaviek: 

1.  zabezpečiť vysoký stupeň dátovej nezávislosti 
2.  zabezpečiť minimálnu redundanciu dát a spolu s konzistenciou podporovanou sémantikou jazyka 
3.  sprístupnenie databázy pomocou množinovo orientovaného neprocedurálneho jazyka 
4.  umožnenie jednoduchým spôsobom reštrukturalizáciu (zmena štruktúry tabuliek) a rast dátového 

modelu 

 
Základné prvky databázového modelu 
Relácia = tabuľka 
n-tica – zodpovedá riadku tabuľky 
atribút – zodpovedá stĺpcu tabuľky 
doména – je množina hodnôt, ktoré môže nadobúdať atribút  
primárny kľúč – je jednoznačný identifikátor v tabuľke reprezentovaný stĺpcom alebo skupinou   
                           stĺpcov 
 
21.2.2005 
RELAČNÁ DATABÁZA 
 
RČ 

Meno 

Priezvisko 

PSČ 

Obec 

Ulica 

444444/3333 

Fero  

Felkeš 

000 01 

Ruskalovce 

Mongoloidná 7 

 

 

.... 

 

 

 

 

 

.... 

 

 

 

 
Atribút relácie reprezentuje stĺpec relácie, určený v rámci relácie unikátnym názvom a množstvom 
prípustných hodnôt. 
 
Doména -  je pomenovaná množina skalárnych hodnôt rovnakého typu. 
Skalár – hodnota, ktorá predstavuje najmenšiu sémantickú hodnotu dát  
Doména je reprezentovaná pomocou: interval, množina 
Doména: jednoduchá – týka sa jednoduchého atribútu a reprezentuje len hodnoty tvoriace prípustnú množinu   
                                      hodnôt tohto atribútu. Doména je množina hodnôt toho istého typu pre daný atribút.   
                                     Reprezentuje definičný obor príslušného atribútu. 
 

   kompozitná – doména typu dátum – je definovaná ako kartézky súčin () hodnôt jednoduchých   

                                     domén atribútov tvoriacich kompozitnú doménu 
 
doména pre typ dátum: dátum 

deň 

1..31 

 

 

 

 

 

mesiac 1..12 

 

 

 

 

 

rok 

0..3000 

 

 

01 01 0000 

 

 

02 01 0000 

 
Význam domén – doména majú veľký význam pri relačných operáciách. Napr. operácie spojenia, 
porovnávania, atď. Preto je nutné definovať rovnaké domény pre atribúty v rôznych reláciách, ktoré 
vyžadujú rovnaké množiny prípustných hodnôt obzvlášť v prípadoch ak sa nad hodnotami atribútov 
z rôznych relácií budú vykonávať operácie predpokladajúce príslušnosť do rovnakých domén. 
 
Relácia – relácia R nad množinou domén d1, d2 až dn sa skladá z hlavičky a tela 
Hlavička – stála (nemenná) množina atribútov a1, a2, .., an, taký že každému atribútu zodpovedá jedna 
z domén d1, d2, .., dn 

background image

Telo – v čase sa meniaca množina n-tíc, kde každú n-ticu tvorí množina dvojíc ai, vi t.j. existuje jedna 
dvojica atribút, hodnota pre každý atribút ai z hlavičky 
Kardinalita relácie – vyjadruje počet n-tíc matice 
Stupeň relácie – znamená, ak existuje relačná schéma relácie n tak počet atribútov n uvádza stupeň relácie. 
 
Kardinalita našej tabuľky (hore) je 1 
Stupeň je 6 
 
Vlastnosti relácie: 

1.  relácia neobsahuje duplicitné n-tice – základným predpokladom pre splnenie tohto bodu je nutná 

existencia primárneho kľúča v každej relácii 

2.  n-tice sú neusporiadané  
3.  m-tice atribútov sú neusporiadané (zľava doprava) – táto vlastnosť hovorí o tom že k jednotlivým 

stĺpcom alebo hodnotám atribútu pristupujeme prostredníctvom identifikátora (mena atribútu) a nie 
podľa pozície v riadku. Toto umožňuje tvorbu programov nezávislých na dátach. 

4.  hodnoty atribútov sú atomické – to znamená, každému atribútu je priradená vždy len jedna hodnota 

a nie množina hodnôt. Je potrebné aby všetky atribúty boli atomické, čím dosiahneme to, že v relácii 
sa nemôžu vyskytovať opakujúce sa skupiny atribútov, ktoré sa vyskytuje v nenormalizovaných 
atribútov (atribúty sa nesmú volať rovnako – pre tých menej chápavých ☺) 

 
architektúra DBS (databázový systém) 
predstavuje všeobecný databázový koncept pre vysvetlenie štruktúry databázového systému. Nestačí popísať 
tabuľky, ale aj spojenia a vzťahy medzi nimi.  
 
 Bežný typ architektúry: klient - server 
 
111111111111111111 
 
 
 
 
 
 
 
 
 
 
 
 
TIETO 4 OBRÁZKY PATRIA K TÝM ČÍSLAM 1-4 V POZNÁMKACH. NANEŠTASTIE NEVIEM, 
KTORÝ KDE ZARADIŤ. 

background image

 

Úrovne architektúry:   externá 
 

 

 

Konceptuálna 

 

 

 

interná  

 
schéma – špecifická množina dát popisujúca dátový model, aplikácie alebo jeho časti 
externá schéma – implementačne nezávislá množina dát popisujúca užívateľské pohľady aplikácie 

-  často predstavuje čiastočný pohľad na množinu objektov používaných užívateľom. Je 

často závislá na programovacom jazyku ktorý sa používa na vývoj aplikácie 

konceptuálna schéma – tu sú dáta definované tak aká je skutočnosť. Môže byť popísaná niektorým 
z programovacích jazykov. Je implementačne nezávislá množstvom dát popisujúca dátový model. 
Interná schéma – je implementačne závislá množina dát ktorá presne popisuje dátové štruktúry, prístupové         
metódy uloženia dát v externej pamäti. Predstavuje informácie o spôsobe uloženia dát na fyzickej úrovni. 
Obsahuje popisy dátových štruktúr, formáty záznamov, informácie o použití indexových súborov, hešovacích 
súborov.  
Externá úroveň - užívateľ 
Konceptuálna úroveň – programátor, ktorý vytvára klienta  
Interná úroveň – administrátor 
 
zálohy databázy - 
 
SRBD – systém riadenia bázy dát 
Je množina programov zabezpečujúcich manipuláciu s dátami, ochranu dát, paralelné spracovanie, atď.  
Základné funkcie SRBD sú:   

1.  definícia dát 
2.  manipulácia s dátami 
3.  riadenie prístupu 
4.  integrita databázy 

background image

5.  obnova databázy 
6.  paralelný prístup 
7.  ochrana dát 
8.  riadenie katalógov 

 
Definícia dát – možnosť definovať dátové štruktúry pomocou príslušného jazyka na definíciu dát. 
Manipulácia s dátami – SRBD musí byť schopný zabezpečiť užívateľské požiadavky na vymazanie dát, 
vkladanie dát, oprava dát a výber dát z databázy 
Riadenie prístupu – SRBD musí umožňovať definovanie prístupových práv k dátam pre jednotlivých 
užívateľov alebo aplikácie. To znamená ohraničenie aby niektorí užívatelia mohli iba prezerať ... 
Integrita databázy – SRBD poskytuje nástroje na zabezpečenie všetkých integritných obmedzení 
definovaných pre dátový model. Okrem toho musí zabezpečiť integritu databázy v prípade porúch ktoré sa 
vyskytnú pri spracovaní aplikácie. 
Obnova databázy – súvisí s integritou databázy, v prípade chýb ktorá je zabezpečená pomocou transakcií   
 
Poradie spracovania:  
0   začiatok – zapamätá si stav účtu 
begin 

1. zober z VÚB 
2. vlož do ČSOB 

if status=0 

commit transaction 

else rollback 
 
paralelný prístup - SRBD musí poskytovať nástroje zabezpečujúce zdielanie dát, resp. paralélneho prístupu 
k dátam.  
Ochrana dát – SRBD by mal umožňovať vytvárať archívne kópie ako aj mechanizmy kryptovania 
(šifrovanie) dát aby nebolo možné ich zneužitie. 
Riadenie katalógov – SRBD má informácie o schémach uložené v špeciálnych tabuľkách nazývaných 
katalógy. Katalógy obsahujú dáta o dátach.  
 
 
Architektúry SRBD: 
 

1.  centralizované – na hlavnom nositeľskom počítači sa spracovávajú všetky programy t.j. okrem SRBD 

na tomto počítači beží celý komunikačný software ako aj aplikácie k danému informačnému systému. 
Základnou výhodou centralizovaných systémov je centrálna bezpečnosť a centralizované umiestnenie 
veľkého rozsahu dát. Nevýhoda: vysoké náklady na údržbu a zakúpenie týchto systémov. V praxi to 
znamenalo, že na jednom mieste sme mali všetko (veľká rýchlosť), nevýhodou: veľmi drahé 

 
22222222222222222222222 
 

2.  súborové systémy- tieto systémy využívajú lokálne počítačové siete s personálnymi počítačmi. Jeden 

z počítačov slúži ako systém na ktorom boli uložené dáta v súboroch, ktoré využívali všetci užívatelia 
počítačovej siete. OS počítača s týmito súbormi zaisťoval lokálny aj zdielaný prístup k dátam na 
diskoch ale aj k iným prostriedkom počítača. Nevýhoda: rýchlosť, bezpečnosť. Typický predstaviteľ: 
foxácke riešenia.  

 
3333333333333333333 
 

3.  klient – server – v základnom modeli SRBD beží na serveri a čaká na požiadavky prichádzajúce od 

klientov. V prípade príchodu požiadavky od klienta sa požiadavka začne spracovávať a výsledok je 

background image

opäť poslaný klientovi. Každá požiadavka od klienta vytvorí nový proces servera, ktorý s ostatnými 
procesmi zdieľajú procesy i disky. V súčasných DBS sa komunikácia medzi klientom a serverom 
uskutočňuje pomocou jazyka SQL (structured query language).  

 
44444444444č 
 

4.  distribuované – aplikácie a komunikácie bežia na strane PC. ??????????????sorry ale netuším!!!??    

 
28.2.2005 
Predtým ako začneme čokoľvek robiť s databázou musíme s inicializovať miesto uloženia na disku. Toto 
miesto nazývame databázový cluster (database cluster). Je to množina databáz na disku ku ktorým má prístup 
bežiaci databázový server. Po inicializácii bude databázový server obsahovať jedinú databázu pomenovanú 
template1. Ako vyplýva z názvu je určená ako šablóna na vytváranie nasledujúcich databáz a nemali by byť 
použitá ako pracovná databáza. Databázový cluster je potom fyzicky adresár do ktorého budú ukladané 
všetky dáta. Zvyčajne to býva adresár usr/local/pgsql/data alebo /var/lib/pgsql/data. Na inicializáciu DB 
clustera slúži príkaz initdb, ktorý sa používa s rôznymi prepínačmi a prvotné nastavenie DB clustera má 
potom tvar: initdb –D /usr/local/pgsql/data. 
Tento príkaz môže vykonávať superužívateľ, ktorý má príslušné práca a tým je: ROOT, užívateľ POSTGRES 
Superužívateľ je postgres a s týmito DB môžu robiť aj iný užívatelia. 
 
Spúšťanie databázového servera 
DB server sa volá postmaster. Postmaster musí vedieť kde má uložené dáta nad ktorými má pracovať. Preto 
je možné DB server pustiť ako postmaster –D /usr/local/pgsql/data. Väčšinou  je tento DB cluster uložené 
v premennej PGDATA (PGDATA2) a tam je väčšinou celá táto cesta. Postmaster má tiež viacero 
prepínačov. Jednou z možností spúšťania: postmaster –B 2048 –N 1024 
 
Ako zastaviť DB server: mal by bežať stále preto nemá špeciálne vypínanie. KILL číslosignálu čísloprocesu 
číslo procesu zistíme: ps –ef/grep postmaster 
Kill -9‘ head 1 /usr/.../postmaster.pid’ 
 
Po prihlásení sa užívateľa na DB server je jeho autentifikácia kontrolovaná cez súbor pg_hba.com. Tento 
súbor obsahuje aj zoznam užívateľov ktorí sa môžu pripájať k danému serveru.  
 
Pripojenie k databáze 
PostgreSQL používa architektúru klient-server pričom postgresql je stále spustený a čaká na požiadavky 
klienta, ktoré spracováva a výsledky zasiela späť klientovi. Server postgresql je spustený na počítači ako 
nezávislý proces a užívateľ s ním nemôže komunikovať priamo, preto boli vytvorené klientské aplikácie 
ktoré slúžia výhradne na komunikáciu servera s užívateľom.  
 
Rozhranie psql – je to typické textové rozhranie pracujúce s príkazovým riadkom. 
Pgaccess – grafické rozhranie 
 
Spustenie psql: 
Spúšťame ju s konkrétnou databázou s ktorou chcem pracovať 
Psql template1 – spustí sa rozhranie psql 
\h – vypíše všetky položky helpu (možné príkazy) 
\q – ukončenie 
\? – interné príkazy 
\c – prepínanie medzi DB 
\l – zoznam všetkých databáz 
\d – zoznam všetkých tabuliek 
 

background image

 
dva režimy:   príkazový – začína vždy lomítkom (podotkla Bea) 
 

 

sql 

 
 
 
vytvorenie databázy: 
psql template1 
\h create database 
template1=# create database prva; {vytvorenie} 
\l {vypise ju medzi ostatnymi} 
drop database prva; {zmazanie} 
create table tab1 (cislo smallint,nazov char(30),skratka char (10)); {vytvorenie tabuľky} 
\d {zoznam tabuliek} 
drop table tab1; 
nemôžeme rušiť DB pokiaľ sme na ňu prepnutý (pokiaľ ju máme práve otvorenú) 
 
vytvoriť tabuľku môžeme aj cez vi editor: 
vi tab1.sql 
create table tab1 
(cislo smallint; 
nazov char(30); 
skratka char (10)) 
 
\i tab1.sql {vytvorí nám tabuľku} 
\i file – štandardné spúšťanie súborov 
 
bodkočiarka musí byť na konci príkazu (keby som to nenapísal Bea ma zbije!!!) 
 
 
Relačná integrita 
Primárny kľúč 
Nech R je relácia, k (a1,a2,...,an)je množina atribútov relcie potom primárny kľúč je vybraná podmnožina 
z atribútov takých že pre 2 n-tice neexistujú rovnaké hodnoty atribútov. Primárny kľúč slúži na odlíšenie n-
tít, atribúty ktoré sú súčasťou primárneho kľúča sa nazývajú kľúčové, ostatné atribúty sú nekľúčové. Každá 
schéma relácie musí mať definovaný primárny kľúč (mala by mať) 
n-tity ktoré majú málo atribútov a niesú schopné vytvoriť primárny kľúč sa nazývajú slabé n-tity 
n-tity ktoré majú dostatok atribútov sa nazývajú silné n-tity 
Atribút – stĺpec 
Primárny kľúč ktorý obsahuje viac ako jeden atribút sa nazýva kompozitný 
Pokiaľ obsahuje iba jeden atribút sa nazýva jednoduchý 
 
Jednej relácii môže byť definovaný iba jeden jediný primárny kľúč 
 
Null hodnoty 
Null hodnota sa objavila v atribútoch v súvislosti s chýbajúcimi informáciami. Defaultná hodnota stĺpcov 
v tabuľke v jazyku SQL je null hodnota. SQL zásadne rozlišuje medzi 0 a null hodnotou pre číselné hodnoty 
a medzi ‘’ a NULL pre znakové hodnoty.  
V SQL jazyku je možné zakázať Null hodnoty v stĺpcoch použitím klauzuly: not NULL, napr. máme tabuľku 
student 
Create table student 
(RC char(10) not NULL, - teda do tohto stĺpca nikdy nezapíše nulové hodnoty,......); 

background image

 
Pokiaľ použijeme NULL hodnotu v aritmetických výrazoch výsledkok je NULL 
 
Agregačné funkcie – avg, sum, max, min ignorujú NULL hodnotu a počítajú výsledok zo zvyšných hodnôt 
rôznych od NULL. Pokal stĺpec obsahuje same NULL hodnoty tak priemer, suma, min, max vráti NULL. 
Null hodnota  
 
And 

 

true  

 

false   

null 

True   

 

 

False   

 

 

 

 

 

 
or 

 

true  

 

false   

null 

True   

 

 

False   

 

 

 

 

 

 
Primárny kľúč - špecifikuje že stĺpec, stĺpce tabuľky môžu obsahovať len unikátne (nie duplicitné) hodnoty 
a ani NULL hodnotu. Technicky je primárny kľúč iba kombináciou unikátneho kľúča UNIQUE a not NULL 
atribútu čím je zabezpečené že sa iné tabuľky môžu spoľahnúť na túto množinu stĺpcov ako na unikátny 
identifikátor riadkov.  
 
Unikátny kľúč – je špecifikovaný pravidlom podľa ktorého jeden alebo skupina viacrých stlpcov môže 
nadobúdať len unikátne hodnoty 
 
Tovar.sql 
Create table tovar 
(tovar integer, 
nazov char(60), 
pocet integer, 
vyrobene date, 
skup char(2), 
stredisko char(8), 
unique (nazov,vyrobene,stredisko)  
unique (stredisko) 
); 
 
Unikátnych kľúčov môže byť v tabuľke vytvorených viac.  
 
Cudzí kľúč (foreign key) 
Nech R2 je základná tabuľka (relácia) potom cudzím kľúčom v R2 je podmnožina z množiny všetkých 
atribútov R2 pre ktoré platí že: 

1.  existuje relácia R1 k relácii R2 v ktorej je vytvorený primárny kľúč PK 
2.  po celú dobu každá hodnota cudzieho kľúča z bežných hodnôt relácie R2 je identická s hodnotami 

primárneho kľúča nejakej n-tice relácie R1, alebo je hodnota atribútu cudzieho kľúča prázdna.  

Cudzí kľúč môže byť kompozitný (môže byť viac atribútov) iba vtedy keď primárny kľúč s ktorým sa spája 
je tiež kompozitný. 
 
Create table mena 
(kod char(3), 
nazov char(60), 
krajina char(30), 

background image

primary key kod 
); 
 
kod  

nazov    

krajina 

USD  US Dollar 

USA 

EUR  EURO  

EU 

GBP  Libra   

Anglicko 

 
Create table listok 
(kod_meny char(3), 
datum date, 
predaj decimal(10.2), 
nakup decimal(10,2), 
foreign key (kod_meny) references mena 
); 
 
7.3.2005 
cudzí kľúč: jednoduchý – len jeden stĺpec 
 

 

kompozitný – viac stĺpcov 

 
Pravidlá vytvárania cudzieho kľúča zahŕňajú sa do operácie podľa ktorých budú operácie modifikovania 
akceptované alebo odmietané. Týka sa to 2 základných operácií nad relačnou databázou a to je  

1.  operácia rušenia (delete) 
2.  operácia modifikácie (update) 

 
Možnosti jazyka postgreSQL sú: 

1.  no action – vygeneruje chybu ktorá indikuje narušenie cudzieho kľúča 
2.  restrict – to isté čo no action, archaizmus 
3.  cascade – zruší všetky referencované riadky (pri delete) zmení hodnotu referencovaného stĺpca (pri 

update) podľa referencujúceho stĺpca 

4.  set NULL – nastaví referencovaný stĺpec na NULL hodnotu 
5.  set DEFAULT – nastaví referencovaný stĺpec na konkrétnu hodnotu 

 
 
create table mena 
(kod char(3); 
nazov char(60); 
krajina char(30); 
primary key kod 
); 
 
create table kurz 
kody char(3); 
datum date; 
predaj decimal(10,2); 
nakup decimal(10,2); 
foreign key (kody) references mena 
); 
 
 
Mena 

Kód 

Názov 

Krajina 

 

SKK 

koruna 

SK 

background image

 

EUR 

Euro 

 

 

USD 

Dolár 

USA 

 
 
 
Kurz  

Kody 

Datum 

Predaj 

Nakup 

 

EUR 

7.3.2005 

37.444 

39.111 

 

USD 

7.3.2005 

28.444 

29.312 

 

 

 

 

 

 
On delete cascade – zmažem všetky USD z tabuľky (každej tabuľky) 
On update cascade – update pre všetky tabuľky, takže všade budú nové údaje USD 
 
Foreign key(meno_kluca) references Meno_tabulky 
On delete akcia 
On update akcia; 
 
Dátové typy používané pri vytváraní tabuliek: 
1. numerické – smallint (2B) 

integer (4B) 
bigint (8B) 
decimal (rozsah s desatinnou čiarkou) 

                            10,2 – znamená že celé číslo má 10 znakov vrátane čiarky, takže napr. 1234567,90 
             

float 
serial – ide o číslo integer ktoré vygeneruje generátor, pričom toto číslo v danej tabuľke je         
     unikátne a nemôže mať NULL hodnotu 

 
2. monetárne - money (4B) -21474836,47, +2......,48 
3. znakové –   char (n) 
 

 

varchar (n) – v pamäti zaberie iba jeden znak ako string 

 

 

text – string neobmedzenej dĺžky 

 

 

char (1) – jeden jediný znak 

4. dátové - 

date (4B) 

 

 

timestamp (8B) – časová pečiatka 

 

 

time 

without time zone 

 

 

 

with time zone 

 
 

 

boolean – true, false: možné formy: ‘t’, ‘true’, ‘yes’, ‘y’, ‘1’ 

5. goniometrické - 

point – bod 

 

 

 

box – obdĺžnik 

 

 

 

circle 

 

 

 

polygon – mnohouholník 

6. sieťové - 

inet – uloženie IP adresy s maskou 

 

 

macaddr – adresa sieťovej karty 

7. veľké binárne objekty - 

označujú sa ako BLOB (binary large object) 

 

 

 

 

používajú sa na obrázky, MP3, ... 

 
základné príkazy jazyka SQL (1.časť) 
 create table vydavatel 
(kod char(20), - čiarka, nie bodkočiarka !!! 
nazov char(100), 

background image

adresa char(50), 
obec char(50), 
PSC char(6), 
Kontakt char(40), 
Vznik date, 
Zanik date, 
ICO char(10), 
Primary key (kod), 
Unique (nazov, obec) 
); 
 
create table kniha 
(kodk serial, 
nazov char(150) not NULL, - teda musí byť vyplnené (zadané) 
vydavatelstvo char(20), 
rok smallint, 
strany integer, 
autor char(100), 
ISBN char(20), 
Pocet smallint, 
Primary key (kodk), 
Foreign key (vydavatelstvo) references vydavatel 
On delete cascade 
On update cascade 
); 
 
v konzole púšťame: psql template1; 
 
vkladanie dát pomocou príkazu INSERT 
insert into vydavatel values(´V1111´,´mlade leta´,´Kukucinova 10´,´D.Kubín´,´027 41´, NULL, NULL, 
NULL,NULL); 
 
odstraňovanie dát pomocou príkazu DELETE 
pomocou príkazu delete možno rýchlo odstrániť akýkoľvek riadok alebo všetky riadky z tabuľky. Tento 
príkaz je nevratný. Keď raz niečo zmažeme tak sa k tomu už NIKDY nedostaneme. 
Delete from vydavatel; - keď nezadáme nič iné tak zmaže všetky záznamy a tabuľka je prázdna 
Delete from vydavatel where kod=´V1111´ - zmaže všetky záznamy ktoré majú túto hodnotu 
 
Update vydavatel set vznik= NULL; - celý stĺpec nastavý na NULL 
Update vydavatel set vznik= 2000 where nazov=´cpress´; - u nás prepíše 1999 na 2000 (tabuľka dole) 
Update vydavatel set vznik= 2000 where nazov=´cpress´ or vznik is NULL; - aj do prázdnych miest dá 2000  
 
 
 
Vydavatel 

kod 

Nazov 

adresa 

obec 

Vznik 

 

V1111 

Mladé Letá 

Kukučínova 10 

 

NULL 

 

V2222 

Grada 

Bratislava 500 

BA 

1995 

 

V3333 

Cpress 

Nitra  

NR 

1999 

Je jednoduchšie urobiť DROP TABLE VYDAVATEL ako DELETE VYDAVATEL 
 
CREATE DATABASE 
\c prva 

background image

create table 
 
ako by vyzerala databáza na evidenciu CD at home, na disku, médiách? 
 
21.3.05 
Normalizácia databáz 
Pri návrhu relačnej databázy (schémy) je dôležité dodržať určité pravidlá, ktoré nazývame normálne formy. 
Normalizácia obvykle vedie k odstráneniu redundancií a značne z efektívňuje prácu s databázovými 
tabuľkami. Pre relačné databázy spravidla platí, že čím sú tabuľky vo vyšších normálnych formách, tým 
lepšie by sa s nimi z hľadiska logiky malo pracovať.  
Databázové tabuľky multidimenzionálnych databáz sú nenormalizované, hlavne tabuľky dimenzií.  
 
Prvá normálna forma 
Tabuľka spĺňa podmienku 1NF, keď všetky atribúty (stĺpce) sú atomické, t.j. ďalej nedeliteľné. Jeden stĺpec 
nesmie obsahovať viac druhov údajov, musí obsahovať skalárnu hodnotu. Hodnota stĺpca tiež nesmie byť 
relácia. Keď tabuľka tieto podmienky nespĺňa je v nultej normálnej forme a je potrebné ju rozložiť.  
 
Druhá normálna forma 
Tabuľka spĺňa podmienku 2NF, keď spĺňa podmienku 1NF a každý atribút okrem primárneho kľúča musí 
byť úplne závislý na celom primárnom kľúči. 2NF sa preto týka iba tabuliek, ktoré majú primárny kľúč 
kompozitný. Keď má tabuľka len jeden primárny kľúč jednoduchý je podmienka 2NF splnená automaticky. 
 
Tovar  

Dodávateľ 

Cena 

E-mail 

Cement 

250 

Cem@?.sk

 

Cement 

Žilina 

280 

Stav@?.sk

 

Piesok 

LM 

85 

Piesok@?.sk

 

piesok 

Žilina 

75 

stav@?.sk

 

 
Primárny kľúč je: tovar + dodávateľ 
Tabuľka by spĺňala 2NF pokiaľ by neobsahovala E-mail 
 
E-mail závisí len na dodávateľovi a nie na tovare. Preto je potrebné rozdeliť tabuľku na dve časti 
 
Dodávateľ 
Kód 

Názov 

e-mail 

001 

Záv. Poruba 

Cem@?.sk

 

002 

Žilina 

Stav@?.sk

 

003 

LM 

piesok@?.sk

 

 
Tovar 
Názov 

Dodávateľ 

Cena 

Cement 

001 

250 

Cement 

002 

280 

Piesok 

003 

85 

Piesok 

002 

75 

 
 
 
Tretia normálna forma 
Tabuľka je v 3NF vtedy keď je v 2NF a zároveň neexistujú závislosti nekľúčových stĺpcov tabuľky.  
 

background image

Meno 

RC 

PSC 

OBEC 

Stano 

00000000/0000 

000 00 

Leviatanovce 

Peter 

... 

... 

... 

Mišo 

... 

... 

... 

Peťo S. 

... 

... 

... 

Fero Felkeš 

... 

... 

... 

 
Tu existujú závislosti medzi PSČ a obcou. PSČ by sme nemuseli zadávať, dal by sa vybrať z číselníka 
poštových smerových čísel. V tomto prípade je na mieste otázka efektívnosti – pokiaľ by tabuľky spĺňali 
3NF za každých okolností, mohlo by to viesť k zložitým a neprehľadným tabuľkám, v niektorých prípadoch 
aj ku strate výkonu 
 
Normalizované tabuľky umožňujú: 

1.  veľký počet paralelných prístupov 
2.  rýchle a operatívne zmeny údajov v tabľkách  
3.  využitie indexov a transakcií  
4.  optimalizovať štruktúru údajov s využitím normalizovaných tabuliek 

________________________ 
{vytvorte databázu programov, hudby, videa, zvuk. Záznamov uložených na záložných médiách. Dbajte na 
to aby vytvorené tabuľky boli v čo najvyššej normálnej forme.} 
 
su – postgres 
heslo: ppostgres 
psql –d template1  

 

šablóna pre tvorenie ďalších databáz 

\l 

 

 

 

vypíše počet databáz 

create database fuser;   

vytvorí databázu fuser 

\h 

 

 

 

help 

\c fuser  

 

 

prepneme sa do databázy 

\d 

 

 

 

výpis všetkých tabuliek 

\q 

 

 

 

vyskočíme von 

vi nosice.sql 
create table nosice 

 

Tabuľka: nosiče 

(id_nosica serial, 
medium char(30), 
kapacita integer, 
prepis Boolean 
vyrobca char(40), 
primary key (ID_nosica) 
); 
:x 

 

 

 

vyskočíme z vi editora 

vi druhy.sql 
create table druh 
(ID_druhu serial, 
skratka char(10), 
popis char(50), 
primary key(ID_druhu), 
unique (skratka) 
); 
:x 
vi krajina.sql 
create table krajina 

background image

(ID_krajina serial, 
nazov char(60), 
skratka char(5), 
mena char(5), 
primary key (ID_krajina) 
); 
:x 
psql –d fuser 
\i nosice.sql 
\i druhy.sql 
\i krajina.sql 
insert into nosice values (1,‘CD-R‘,750,‘F‘,‘sony‘); 
insert into nosice values (nextval(‘nosice_ID_nosice_seq‘),‘CD-RW‘,800,‘T‘,‘verbatim‘); 
select * from nosice;   

vypíše nám obsah tabuľky nosiče  

delete from nosice where ID_nosica=3; 
 
{ideme naplnat druhu tabulku - druh} 
insert into druh values (1,’MP3’,’digit.zaznam – pirat’); 
a tak dále a tak dále  ... 
 
to isté aj s treťou tabuľkou ... 
 
{teraz treba spojiť tieto tabuľky} 
\q 
vi evidencia.sql 
create table evidencia 
(ID_polozka serial, 
ID_nosica integer, 
ID_druhu integer, 
Nazov char(50), 
Datum date, 
Zapisal char(20), 
D_zapisu timestamp, 
ID_krajina integer, 
Primary key (ID_polozka), 
Foreign key(ID_nosica) references (nosice) on delete cascade on update cascade, 
Foreign key(ID_druhu) references (druh) on ... 
Foreign key(ID_krajina) references (krajina) .... 
 
{keby som nedal on delete tak nemôžem zmazať v hlavnej tabuľke daný záznam} 
 
insert into evidencia values (1,1,2,’Alexander Velky-1’,’01.01.2004’,’student’,now(),3); 
insert into evidencia values (2,1,1,‘Shakira‘,’01.03.2002‘,‘Karol‘,now(),1); 
... 

... 

... 

... 

... 

 
select [distinct] *,[stlpec] from tabulka 

 

-distinct – riadky, kt. sa opakujú viackrát vypíše iba raz 

 

 

 

 

 

 

 

 

- jedinečné riadky 

where podmienka 
group by vyraz 
having vyraz 2 
order by stlpec  
  

background image

[] - vyjadrujú výber z pola, v select príkazoch znamená oddelenie prvkov z výberu množiny 
;   - ukončenie sql príkazu 
--   - komentár 
NOTNULL, ISNULL 
 
Medzi operátori porovnávania stringov patrí:  
% - nahradza lubovolny znak, množinu znakov, alebo žiadny znak 
_   - nahrádza iba jeden znak 
 
select nazov, datum, zapisal from evidencia; 
select nazov, datum, zapisal from evidencia where nazov like ‘s%’, 
select nazov, datum, zapisal from evidencia where nazov=‘s%‘ – v tomto prípade to % nemá zmysel lebo ak     
                                                                                                         použijeme = tak význam % padá 
select nazov, datum, zapisal from evidencia where datum>=’01.01.2000’ and datum<=01.01.2005’ and 
ID_nosice between (1,3); 
 
delete from evidencia where nazov like ‘A%’ and ID_polozka=3; 
 
Prístupové práva 

-  sú na tabuľku 
-  neexistuje ich určiť na databázu 

evidencia 

 

druh   

 

krajina  

 

nosice 

 
 
práva: update(zmeniť), insert, select, delete 
Vytváranie práv sa robí cez príkazy: grant, revoke 
Grant all on evidencia to ‘FeroFelkes’ 

- je mu dovolené všetko 

Grant all on evidencia to public; 
 
 
!Ak sme prihlásený na postgres tak máme práva na všetko! 
 
Create group zamestnanci1; 
Create user ‘Ignac’ password ‘ignac2’ in group zamestnanci1; 

 

- vytvorenie užívateľa 

Create  user Mirka2, in group admin; 

toto je správne, s tým ‘ mi to nešlo 

Grant all on evidencia to group admin; 
Grant select on evidencia to group zamestnanci1; 
 
Ak chceme zamestnanca vyhodiť zo skupiny: 
Alter user 
 
11.4.2005 
Agregačné funkcie jazyka SQL 
Užívatelia často potrebujú sumarizovať informácie z databázy, aby nemuseli prechádzať všetky riadky. Často 
potrebujú zistiť len ich počet alebo priemer, atď. Tomuto druhu operácií hovoríme agregácie alebo 
zoskupovanie. Jazyk SQL pozná 5 druhov agregácií: 

-  count – koľko je záznamov 
-  sum 
-  avg 
-  min 
-  max 

 

background image

COUNT 
Pracuje s celými riadkami, ostatné funkcie pracujú iba s určitými stĺpcami. Pokiaľ chceme dosiahnuť 
zložitejšie výsledky môžeme kombinovať agregačné funkcie s podmienkou WHERE.  
Napríklad: 
Select count(*) from nosice;   

- spočíta záznamy (zoznam riadkov) 

 
Väčšina agregačných funkcií ako napr. max, sum, avg nespracováva prázdne hodnoty (NULL hodnoty) ale 
ich ignoruje. Avšak ak stĺpec obsahuje iba prázdne hodnoty, výsledok je NULL nie nula. Funkcia count 
pracuje v tomto smere odlišne. Zistí počet prázdnych hodnôt pretože sa pozerá na celý riadok tabuľky cez *. 
Neskúma jednotlivé stĺpce ako ostatné agregačné funkcie. Oproti tomu funkcia  
Select count (stĺpec) zisťuje počet všetkých neprázdnych hodnôt v zadanom stĺpci (neprázdne riadky) 
 
Celkový počet odlišných hodnôt v určitom stĺpci zistíme pomocou funkcie: 
Select count (distinct stlpec)   - celkový počet odlišných hodnôt 
 
SUM 
SUM (stlpec) – typ musí byť integer 
Select sum (kapacita) from nosice; 
 
MIN,MAX,AVG – nepracujú s NULL hodnotami, úplne ich ignorujú 
 
Klauzula Group by 
Výsledkom agregačných funkcií je jeden riadok. Často je však potrebné agregačné funkcie na skupiny 
riadkov. V dotazoch, ktoré používajú agregačné funkcie s klauzulou group by sa agregačná funkcia aplikuje 
na riadky zoskupené podľa istého stĺpca (stĺpcov) tabuľky.  
Select STAT, count (*) from poistenec group by STAT; 
 
Ak chceme niečo podľa abecedy tak použijeme klauzulu ORDER BY: 
Select STAT, count (*) from poistenec group by STAT order by STAT; 
 
Namiesto STAT môžeme napísať aj order by 2 (to znamená že stĺpec 2) 
 

 

 

 

 

 

2 desc – od najväčšieho po najmenšie 

 

 

 

 

 

 

2 asc – opačne 

1 – znamená v našom prípade STAT 
2 – znamená samostatné počty 
 
klauzula having: 
Having umožňuje používateľovi vykonávať podmienené testovanie na zoskupených hodnotách. Často sa 
používa s klauzulou group by. Pomocou having môžeme začleniť alebo vyradiť skupiny na základe 
zoskupených hodnôt danej skupiny. 
Napr. treba vybrať všetky také skupiny kde počet ľudí v skupine je menej ako 100 000. 
Select STAT, count (*) from poistenec group by STAT having count (*) < 100 000; 
 
Select meno, count (*) from poistenec group by meno order by meno 
Select priezvisko, meno, count (*) from poistenec group by 1,2 order by 1,2 
Select priezvisko, meno, count (*) from poistenec group by 1,2 having count(*) = 1; - vypíše ľudí 
s jedinečným menom a priezviskom. 
Select priezvisko, meno, count (*) from poistenec group by 1,2 order by 3 desc,1,2; 
 
Kombinácie príkazov select 
 

background image

V niektorých prípadoch nemožno dosiahnuť požadovaného výsledku pomocou jediného select príkazu. 
Z tohto dôvodu existujú klauzuly UNION, EXCEPT, INTERSECT(prienik), ktoré umožnia zreťaziť príkazy 
select na zostavenie zložitejších dotazov. 
 
UNION 
- Umožňuje aby bol zlúčený „neobmedzený“ počet select príkazov na vytvorenie jedného výsledku. 
  !Každý príkaz select v rámci UNIONu musí vrátiť rovnaký počet stĺpcov! (Pokiaľ napr. prvý select         
  vráti dva stĺpce aj ostatné select príkazy musia vrátiť 2 stĺpce rovnakého typu ako prvý stĺpec). 
- Pri použití tejto klauzuly možno aplikovať klauzulu ORDER BY iba na konci príkazu. 
- UNION implicitne zamedzuje zobrazovanie duplicitných riadkov 
- Pokiaľ chceme povoliť duplicitné hodnoty treba použiť klauzulu UNION ALL 
- Najčastejšie použitie UNIONu pri spájaní dvoch tabuliek do jedného dotazu pokiaľ tabuľky niesú spojené   
  cez spojovací lúč. 
 
Select RC,meno, priezvisko, obec, ulica, psc from poistenecRK 
Union 
Select rc, meno, priezvisko, obec, ulica, psc from poistenecPP 
Order by priezvisko, meno, rc 
 
Select rc, meno, priezvisko from poistenecRK where rc< ‘6000000000’ and dat.n < ‘1.1.2005’ 
Union ….  
EXCEPT  
Umožňuje získať z jedného príkazu select všetky riadky okrem tých ktoré predstavujú výstup z druhého 
príkazu select. 
 
Select rc, meno, priezvisko from poistenec where rc <= ‘6000000000’ 
Except 
Select rc, meno, priezvisko from poistenec where rc not in (select rc from dlznici); 
 
INTERSECT 
Vracia iba riadky generované select-om 
Select rc, meno, priezvisko from poistenec where rc <= ‘6000000000’ 
intersect 
Select rc, meno, priezvisko from poistenec where rc not in (select rc from dlznici); 
 
KARTÉZSKY SÚČIN 
 
 
Transakčné  spracovanie  -  majú  dosť  blízko  k  zotavovaniu  sa  systému.  Recovery  alebo  zotavenie  sa 
datového systému v prvom priblížení znamená samozotavenie, t. j. databáza sa dostane do korektného stavu 
po výskyte chyby alebo v prípade vzniku podozrenia z nekorektnosti databázového systému. Recovering DB 
systému  sa  využíva  hlavne  na  veľkých,  zdieľaných,  viac-užívateľských  databázových  prostrediach.  “Malé” 
jednoužívateľské  DB  systémy  poskytujú  namiesto  toho  drobný,  príp.  žiadny  recorevy  support.  Je  to  skôr 
vecou užívateľovej zodpovednosti pri vytváraní záložných kopii, príp. vykonania spätných krokov pri vzniku 
chýb.  Transakcia  je  logická  jednotka  práce,  nie  je  to  jeden  SQL  príkaz.  Begin  transaction  –  začiatok 
transakcie. Môžem použiť v nej viacero príkazov : select, insert, delete, update, select,  
if (status <> 0) then goto undo; 
commit transaction;   - potvrď transakciu, že všetko je v poriadku. 
rollback transaction;    
Transakcia  je  logická  jednotka  práce,  ktorá  nie  je  potrebná  pri  vykonávaní  jednoduchých  databázových 
operácii. Hlavné použitie je pre sekvenciu takých operácii, ktoré menia konzistentný stav databázy do iného 
konzistentného  stavu  bez  potreby  kontroly  ochrany  konzistencie  po  každej  operácii.  Ideálny  stav  nastane, 

background image

pokiaľ  vykonané  operácie  budú  korektné.  Z  pohľadu  užívateľa  sa  buď  celá  transakcia  uskutoční  alebo 
neprebehne  žiadna  z  operácii  vo  vnútry  bloku  transakcie.  Tým  je  celé  spracovanie  atomické.  Preto  je  to 
jednotka  práce.  Systémová  komponenta,  ktorá  zabezpečuje  túto  atomicitu  sa  volá  transakčný  manager, 
ktorého činnosť ovplyvňujú kľúčové príkazy commit transaction a rollback transaction. Commit transaction 
signalizuje úspešný koniec transakcie. Dáva signál pre transakčný manager, že logická jednotka bola úspešne 
dokončená, databáza je v korektnom stave a všetky zmeny databázy sú potvrdené a permanentné. Rollback 
transaction  znamená  neúspešný  koniec  transakcie,  DB  je  v  nekorektnom  stave  a  všetky  zmeny  v  logickej 
jednotke  sú  neplatné,  t.j.  DB  sa  dostala  do  stavu  pred  transakciou.  Všetky  zmeny  od  začiatku  transakcie 
musia  byť  zaznamenané  na  nejakom  mieste.  Fyzicky  to  zabezpečujú  logy,  alebo  žurnalovacie  pásky  alebo 
disky.  Ak  nastane  chyba,  systém  dokáže  rýchlo  zareágovať  a  vytiahnuť  zo  žurnálu  stav  objektu  z  pred 
transakcie.  
Základné vlastnosti transakcie sú : 

-  A – atomicita – navzájom sa neprepisujú data 
-  C – konzistencia – transakcia chráni konzistenciu DB 
-  I – izolácia – transakcie sú oddelené jedna od druhej 
-  D  –  trvácnosť  –  keď  raz  je  úspešná  transakcia  na  konci,  všetky  zmeny,  data  sú  trváce, 

pokiaľ system nespadne. 

 
Chyby systému: 

-  systémové – nekonzistentný stav, alebo chyba od výrobcu, že to náš system nezohľadní. 
-  hardwarové – chyba na disku a spôsoby narušenia databázy. 

 
Úrovne  izolácii  transakcii  –  set  transaction  isolation  level  –  nastavuje  úroveň  transakcie.  Nesmie  sa 
nastavovať po prvom príkaze select, delete, insert. Určuje, ktoré data sú viditeľné pokiaľ iné trasakcie bežia 
na tých istých dátach konkurenčne. Jedným z nich je read committed – vidieť všetky  riadky pred tým,  ako 
začne transakcia.  
Serializable – aktuálna transakcia môže vidieť riadky iba pred prvým query dotazom.  
 
Prístupové práva – pridelíme cez príkaz grant a pomocou revoke ich odoberieme.  
Create table pom (ID smallint, nazov.char(10)); 
Revoke all on pom from group admir; 
Grant select on pom to group admir; 
 
18.4.2005 
Príkaz  check-  klauzula  špecifikuje  určité  obmedzenia  alebo  test,  ktorý  musí  spĺňať  nový  alebo 
modifikovaný riadok nato aby operácia INSERT alebo UPDATE bola úspešná. Každé obmedzenie musí byť 
výraz vracajúci booleovskú hodnotu. Pokiaľ sa takéto obmedzenie vyskytne iba pri definícii stĺpca malo by 
sa to obmedzenie týkať len hodnôt jedného stĺpca. Pokiaľ sa používa obmedzenie na viac stĺpcov, zvyčajne 
sa  uvádza  kľúčovým  slovom  CONSTRAINT  za  definíciami  primárneho  a unikátneho  kľúča.  Pokiaľ  je 
boolovský  výraz  true,  akcia  INSERT  a UPDATE  sa  vykoná  úspešne,  v opačnom  prípade  je  ohlásená 
chybová hláška a akcia sa nevykoná.  
 
Create table: mena; 
(kod:char (3); 
Nazov:char(40) not null check (nazov <> ““); 
Primary key (kod); 
); 
 
Create table kurz; 
(kodm char(3); 
Pozn char(20); 
Predaj decimal(3,2) 

background image

Nazov char(50); 
 
Primary key (kody); 
Constaint const1 check (nazov <>”” and predaj >0) 
); 

 

 
 

 

Zmena štruktúry tabuliek 
ALTER Database Stare_meno to Nove_meno – premenuje databázu 
ALTER TABLE kurz add column Datum Date; - pridá stĺpec na koniec štruktúry, nieje možné na ľubovolné    
  

 

 

 

 

 

Miesto 

 
Možnosť zmeny Defaultného nastavenia stĺpca: 
ALTER TABLE kurz ALTER COLUMN poznamka SET DEFAULT ‘’; 
 
ALTER TABLE kurz RENAME TO kurz2; - premenuje tabuľku 
ALTER TABLE druh RENAME COLUMN popis TO popis1; 
- dajú sa meniť aj cudzie kľúče.  
- Cez alter table nieje možné zrušiť stĺpce z tabuľky 
- cez Alter table nieje možné meniť dátový typ stĺpcov (atribútov) ani ich rušiť 
 
Manipulácia s dátami, subqeury v SELECT príkaze 
Príkaz select vložený do where podmienky iného select príkazu (alebo insert, delete, update) sa nazýva 
SUBQUERY 
Subquery môžu byť:   korelované 
 

 

 

Nekorelované 

 
Subquery alebo vnútorný select je korelovaný, keď hodnota, ktorá je výsledkom select-u závisí od hodnoty 
vonkajšieho select príkazu, ktorý ho obsahuje. Ostatné druhy subquery považujeme za nekorelované.  
Dôležitou črtou korelovaného subquery je, že musí byť vykonávaný opakovane raz pre každú hodnotu 
z vonkajšieho selectu.  
Poddotaz alebo subquery môže vrátiť:  

žiadnu hodnotu 

 

 

 

 

 

 

Jednu hodnotu 

 

 

 

 

 

 

Množinu hodnôt 

Subquery vo where podmienke môže byť uvedený pomocou kľúčových slov IN, EXISTS, ALL, ANY 
 
Použitie operátora IN 
Select * from evidencia where ID_krajina IN (select ID_krajina from krajina where skratka = ´SK´); 
Alebo 
Select * from evidencia where ID_krajina IN (select ID_krajina from krajina where skratka like ´S%´); 
Alebo 
Select * from evidencia where ID_krajina IN (´Sk´,´SW´,´SI´); - nekorelovaný príkaz 
 
Prvé 2 sú korelované 
 
Použitie operátora EXISTS 
Select * from evidencia where EXISTS (select ID_krajina from krajina where ID_krajina < 5); 
 
Doterajšie operátory (IN, EXISTS) očakávajú len 1 hodnotu na ľavej strane a 1 hodnotu na pravej strane.  
 
Použitie operátora ANY 

background image

Klauzula Any vráti logickú hodnotu pravda pokiaľ operátor porovnania je pravda pre akúkoľvek hodnotu 
v poddotaze (subquery) 
Select * from evidencia where ID_krajina = ANY (1,3,5,7) 
 
Použitie operátora ALL 
Vyžaduje aby sa všetky hodnoty poddotazu vyhodnotili ako pravda. V praxi má častejšie použitie negácia 
tohto výrazu. 
 
Najčastejšie sa používa operátor IN (z týchto 4). Exists má dosť veľké použitie ak robíme Update cez inú 
tabuľku. 
 
Vytváranie tabuľky pomocou príkazu SELECT 
Select ID_krajina, nazov, zapisal into evid2 from evidencia where zapisal = ´student´ 
 
Spájanie tabuliek 
Evidencia 

 

 

krajina  

 

nosice   

 

druh 

ID_polozka 

 

 

ID_krajina 

 

ID_nosica 

 

ID_druhu 

ID_nosica 

 

 

nazov   

 

medium 

 

skratka 

ID_druhu 

 

 

skratka  

 

kapacita 

 

popis 

ID_zapisu 

 

 

mena   

 

prepis 

ID_krajina 

 

 

 

 

 

vyrobca 

Nazov 
Datum  
zapisal 
 
treba vybrať takýto select: polozka, krajina, nazov, datum, zapisal 
select ID_polozka, krajina.nazov, druh.skratka, evidencia.nazov from evidencia, krajina, druh where 
krajina.ID_krajina = evidencia.ID_krajina and evidencia.ID_druhu = druh.ID_druhu 
 
INNER JOIN  
Pre každý riadok r1 z tabuľky t1 existuje riadok r2 v tabuľke t2, ktorý zodpovedá Joinovacej (spájacej) 
podmienke r1 using (stlpec) inner join 
 
 
Inner join   
select ID_polozka, krajina.nazov, druh.skratka, evidencia.nazov from evidencia, krajina, druh where 
krajina.ID_krajina = evidencia.ID_krajina and evidencia.ID_druhu = druh.ID_druhu 
 
Left outer join 
Right outer join – pokiaľ riadok existuje v T2 a neexistuje v T1 tak sa vyberie a dá sa tam hodnota NULL 
Full outer join 
 
Príklad: 
Vyberte z tabuliek evidencia, krajina všetky riadky ktoré existujú len v tabuľke evidencie 
Select ID_polozka, evidencia.nazov, krajina.nazov from evidencia left outer join krajina using (ID_krajina);  
 
Select ID_polozka, evidencia.nazov, krajina.nazov from krajina left outer join evidencia using (ID_krajina); 
 
Select ID_polozka, evidencia.nazov, ID_krajina, krajina.nazov from krajina left outer join evidencia using 
(ID_krajina); 
 
 

background image

Left outer join 
Pre každý riadok z T1 ktorému nezodpovedá žiadny riadok z T2, výsledné riadky vrátia NULL hodnoty na 
mieste atribútov tabuľky T2. 
 
Right outer join 
Pre každý riadok z T2 ktorému podľa spojovacej podmienky nezodpovedá žiadny riadok z T1 vráti výsledný 
riadok NULL hodnotu v atribútoch tabuľky T1 
 
Full outer join 
Najprv sa vykoná inner join potom pre každý riadok z T1 ktorému podľa spojovacej podmienky 
nezodpovedá riadok z T2, výsledný riadok obsahuje NULL hodnotu v atríbútoch tabuľky T2 a tak isto pre 
každý riadok z T2, ktorému nezodpovedá podľa spojovacej podmienky žiadny riadok z T1 vytvorí riadok 
s NULL hodnotami v atribútoch tabuľky T1. 
 
Ak sa nevolajú rovnako položky v obidvoch stĺpcoch tak na spojenie nemôžme použiť ako v našom prípade 
ID_krajina ale sa to spojí pomocou ON  
 
 
25.4.2005 
vytváranie pohľadov – views 
views – sú dynamické okná do databázy. Je rozdiel medzi dočasnou (temporary) a pohľadom. Temporárna 
tabuľka odzrkadluje stav iba vo svojom vytvorení, naprotitomu view reflektuje aktuálny stav databázy 
a zahŕňa doň všetky zmeny. Hoci je view ´náhradou´ obyčajnej tabuľky má aj svoje obmedzenia: 

1.  nemôžeme vytvoriť index na view 
2.  pri určitých podmienkach nemôžeme modifikovať dáta v pohľade - modifikácia dát prostredníctvom 

view nieje možná, pokiaľ je vytváraný cez join klauzulou group by, distinct alebo agregačnými 
funkciami. Modifikácia dát môže byť vykonaná iba vtedy pokiaľ ide o skutočný atribút tabuľky 
z databázy a nie o virtuálny atribút.  

3.  Nad pohľadom nieje možné vykonávať: alter table, create index, update statistics. 

 
Create view v_evidencia as select count(*), id_krajina from evidencia group by id_krajina 
 
Select count(*), id_krajina into temp  

tmp_evidencia from evidencia group by 2; 

 

 

 

Tmp_evidencia 

 

 

 

10 

 

 

 

 

 

 

 
Temporárna tabuľka je statický pohľad nad spojenie dvoch al. viacerých tabuliek 
 
Takisto ako na tabuľky prideľujeme práva aj na pohľady 
 
Import a export dát 
Príkaz copy – umožní rýchle načítavanie alebo zápis dát do zadaného súboru. Pomocou tohto príkazu sú dáta 
presúvané z alebo do textového súboru. Tieto súbory je možné používať na účely zálohovania alebo prenos 
dát medzi systémom postgresql a inými aplikáciami. 
 
Copy evidencia to ´/usr/local/pgsql/data/evidencia.csv´ using delimiters ´|´;   

alebo 

 

 

       /var/lib/...  

 
|1|2|1|Mariah Carey|13.1.2005|student| 

 
copy evidencia from ´/var/lib/pgsql/data/evidencia.csv´ using delimiters ´|´; 

background image

 
 
Spätné lomítka a prázdne hodnoty – ak užívateľské dáta obsahujú znaky, ktoré sú zároveň použité ako 
oddeľoače stĺpcov môže dojsť k nejednoznačnostiam. Copy predchádza možným nezrovnalostiam tak, že ak 
je oddeľovač stĺpcov PIPE a PIPE je aj v užívateľských dátach dá sa pred dáta oddeľovač \|. Prázdne hodnoty 
sú zastúpené špeciálnym symbolom: \n 
Pokiaľ chceme zmeniť prázdne hodnoty použijeme v príkaze copy klauzulu with null as ´?´. 
Copy vie prenášať len celé tabuľky.  
 
Keď nechceme celú tabuľku ale len určitú časť: 
Select * into temp tmp_evid1 from evidencia where id_krajiny=1; 
Copy tmp_evid1 to ´var/lib/pgsql/data/evid.csv´ using delimiters ´|´; 
 
Pg_dump – slúži na extrahovanie databázy do skriptového súboru obsahujúceho dotazovacie príkazy. 
Skriptové súbory sú v textovom formáte a možno ich používať na rekonštrukciu databázy, dokonca aj na 
iných počítačoch s inou architektúrou. Pg_dump vytvorí dotazy nevyhnutné na opätovné generovanie 
všetkých užívateľských typov, funkcií, tabuliek, indexov, agregačných funkcií a operátorov. Dáta sú 
v textovom formáte. 
Keď chceme pustiť pg_dump musíme byť v príkazovom riadku a potom: 
Pg_dump –d fuser > fuser.out 
 
Ak chceme zálohovať všetky databázy, tak použijeme príkaz: pg_dumpall 
 
Keď to chceme naloadovať zo súboru: 

1)  create database fuser; 
2)  psql –d fuser –f fuser.out; 

 
číslovanie riadkov 
každému riadku v databáze postgresql je priradené jedinečné neviditeľné číslo označované ako OID (object 
identification number). Po inicializácii postgresql pomocou príkazu initdb sa vytvorí čítač, ktorého hodnota 
sa nastaví približne na 17000, menšie hodnoty sú použité pre interné použitie. Čítač je používaný všetkými 
databázami, preto je vygenerované číslo vždy jedinečné v rámci celého systému postgres. Toto číslo sa 
objavuje na obrazovke po príkaze insert. Každá tabuľka po príkaze create table obsahuje skrytý stĺpec OID.  
 
Všetko z tabuľky vypíšeme: 
Select * from evidencia; 
Select OID, * from evidencia; - dá číslovanie aj do tabuľky (ako prvý stĺpec) 
 
Obmedzenia OID: 

1.  číslovanie nieje lineárne 
2.  OID nieje možné meniť alebo modifikovať pomocou príkazu update 
3.  OID nie sú implicitne zálohované, pokiaľ by sme ich chceli zachovať potrebujeme na to špeciálnu 

voľbu v pg_dump. 

 
Sekvencie 
Postgresql poskytuje ďalší spôsob jednoznačného číslovania riadkov. Sekvencie sú pomenované čítače 
vytvorené užívateľom. Akonáhle sú sekvencie vytvorené možno ich priradiť tabuľke ako hodnoty default 
stĺpca. Pomocou insert a sekvencií sa automaticky priraďujú jedinečné čísla v rámci tabuľky. Výhodou 
sekvencií je, že sa vyhýbajú medzerám v číselnom rade ako je to u OID 
!Čísla sekvencií sú jedinečné iba v rámci jednej tabuľky! 
 
Create sequence meno_sekvencie 

background image

Čítač ovládame pomocou troch funkcií: 

1.  nextval() – daj nasledujúcu hodnotu ako máš nastavenú. 
2.   currval() – aktuálny čítač 
3.  setval() – nastaví čítač na novú hodnotu 

 
create sequence F1_seq; 
select nextval(´F1_seq´); 
select setval(´F1_seq´,100); 
 
Postup číslovania riadkov pomocou sekvencií je nasledovný: 

1.  vytvoriť sekvenciu 
2.  vytvoriť tabuľku obsahujúcu funkciu nextval ako počiatočnú hodnotu stĺpca 
3.  neposkytovať hodnotu pre sekvencovaný stĺpec behom operácie insert ale používať funkciu nextval 

 
create table ziak 
(ID_ziak integer default nextval(´F1_seq´), 
meno char (30), 
priezvisko char (40), 
RC char (10), 
Ulica char(50), 
Obec char(50), 
Psc char (6), 
Primary key ID_ziak); 
 
Insert into ziak values (nextval(´F1_seq´,´janko´,´hrasko´); 
Jednoduchší spôsob používania sekvekcera pri deklarácii tabuľky je použiť typ atribútu SERIAL. 
 
Výhody používania typu SERIAL:  Zlepšený výkon, súbežnosť, štandardízácia 
 
Chýba . ................ 
 
 
 
 
 
 
FUNKCIA 
Funkcie na strane servera sa niekedy označujú aj ako uložené procedúry (store procedure) Funkcia 
vytovorená na strane servera má niekoľko výhod: 
1. ak ju používa mnhoo aplikácií netreba ju vytvárať pre každú aplikáciu zvlášť. 
2. Funkcie na strane servera možno volať vrámci dotazov jazyka sql 
3. Centrálne nainštalované funkcie sa ľahko modifikujú. Funkcie možno vytvárať v niekoľkých jazykoch 
napr. sql, pl/pgsql, pl/tcl, pl/perl 
Funkcie jazyka sql umožňujú pomenovať istý blok príkazov a uložiť ich v databáze. Vytvárajú sa príkazom 
CREATE FUNCTION a odstraňujú sa DROP FUNCTION. Príkaz create function vyžaduje názov funkcie, 
počet argumentov funkcie, dátový typ každého argumentu, návratový typ funkcie a akcie funkcie a jazyk 
používaný funkciou.  
 
Create function ftoc (float) 
Returns float 
As ‘select ($1 – 32.0)*5.0/9.0’; 
Language ‘sql’; 

background image

 
Funkcia nemusí vracať len jednu hodnotu ale pomocou set off vie vrátiť aj viac hodnôt. Vrámci akcií funkcie 
môžu byť vykonávané: insert, update, delete. 
 
Select ftoc(68); 
 
Funkcie jazyka pl/pgsql 
Procedurálny jazyk pl/pgsql je programovací jazyk, pokiaľ jazyk sql používal iba argumenty, pl/pgsql 
používa premenné, cykly, podmienky. Pokiaľ nieje implicitne nainštalovaný, treba ho doinštalovať príkazom 
Createlang plpgsql meno_databázy; 
Obsahuje niekoľko dôležitých klauzúl:  
declare – definuje premenné používané vo funkcii  
select into – zvláštny tvar príkazu select, pomocou ktorého možno umiestniť výsledky dotazu do premenných 
return – ukončuje funkciu a vracia návratovú hodnotu 
%type – udáva dátový typ, ktorý zodpovedá stĺpcu tabuľky 
record – dátový typ do ktorého ukladá výsledok dotazu select 
found – preddefinovaná premenná typu boolean, ktorá udáva predchádzajúci stav príkazu select into 
 
príklad: napíšte funkciu, ktorá vyhľadá z tabuľky názov štátu zadaného pomocou kódu. 
 
Create function seekstate(text) 
Return text 
As ‘declare ret text; 
Begin 
 

Select into ret cast (nazov as text) 

 

cast – pretypovanie 

 

From staty 

 

Where kod=$1; 

 

Return ret; 

End;’ 
Language ‘pl/pgsql’; 
 
Príklad2: napíšte funkciu do ktorej zadáte názov štátu a ktorá vráti kód štátu. Funkcia ošetruje preklepy 
vyhľadávania zodpovedajúcich hodnôt pre časť zadaného reťazca. Najprv sa pokúsi nájsť zodpovedajúci 
reťazec, pokiaľ sa mu to nepodarí, vyhľadá sa jedinečný názov štátu ktorý zodpovedá 2, 4, alebo 6tim 
znakom až do dĺžky zadaného reťazca. 
 
Create function getcode(text) 
Returns text 
As ‘declare state.str stat.nazov%type; 
 

       Matches record; 

                   State_rec record; 
 

       I, len integer; 

 

       Search.str text; 

Begin state.str:=initcap($1);   

 

initcap – zadané veci budú začínať veľkým znakom 

Len:=length(trim($1)); 
I:=2; 
Select into state_rec * from staty 

Where nazov state_str; 
If found then return state_rec.kod; 
End if; 
While i<=len loop 
Search_str:= trim(substr(state_str,1,I)) || ‘%’’; 

background image

Select into matches count(*)  
From staty 
Where nazov like search_str; 

If matches.count=0 
Then return null; 
End if;  
If matches.count =1  
Then select into state_rec *  
 

From staty 
Where nazov like search_str; 
If found 
Then return state_rec.kod; 
End if; 

End if; 
I:=i+2; 
End loop; 
Return ‘’’’; 
Language ‘pl/pgsql‘; 
 
Triggers 
Sú prostriedky na overovanie alebo modifikáciu hodnôt stĺpcov zadávaných riadkov skôr ako sa pridajú do 
databázy. Poskytujú alternatívny spôsob istých akcií na základe operácií insert, update, delete. Triggre volajú 
serverové funkcie pre každý modifikovaný riadok. Tieto špeciálne funkcie možno napísať v ľubovolnom 
jazyku pre programovanie na strane servera okrem jazyka sql. Serverové funkcie trigrov sú zvláštne v tom, 
že majú preddefinované premenné  pre prístup k riadku. Pri trigroch pre insert označuje premenná new - 
vkladaný riadok. Pri triggroch delete premenná hold - odstraňovaný riadok a pri update – new pred a hold po. 
Návratový typ funkcie trigger je opaque.  
Trigger vytvoríme príkazom - Create trigger    
Zrušíme – drop trigger 
 
Create function ins_upd_trigger () 
Returns opaque  
As ‘begin 
 

If new.kod !~ “ ^[A-Z a-z][A-Z a-z]$” 

 

 

^ - zaciatok riadku 

Then raise exception “kod musi byt 2 znakovy”; 
End if; 
If new.nazov ! “ [A-Z a-z] * $” 
Then raise exception “nazov statu musi zacinat znakom”; 
End if; 
If length (trim (new.nazov))<3 
Then raise exception “stat musi mat viac ako 3 znaky!”; 
End if; 
New.kod:=upper(new.kod); 
New.nazov:=initcap(new.nazov); 
Return new; 

End; 
Language ‘pl/pgsql‘; 
 
Programové rozhrania 
Skriptovacie rozhrania – perl, php, tcl, pyton  
Kompilované – c, odbc, jdbc 
 

background image

Úlohy pripojení 

1.  pripojiť sa k databáze 
2.  zadanie vstupov 
3.  zostavenie dotazov 
4.  poslanie dotazu do rozhrania libpq 
5.  vykonanie dotazu 
6.  získanie výsledkov 
7.  ukončenie pripojenia 

 
Rozhranie odbc nieje určené pre priame programovanie ale slúži skôr na komunikáciu s ostatnými 
aplikáciami.  
Jdbc – java database connectivity – rozhranie vytvorené v jazyku java. Programy tohto rozhrania sa 
kompilujú pomocou javac  a spúšťajú cez java. Jazyk java je kompilovaný.  
 
Skriptovacie jazyky. Výhody: 
Nemusia sa kompilovať, obsahujú výkonnejšie príkazy, automaticky deklarujú premenné, premenné môžu 
obsahovať ľubovolný dátový typ.  
 
Perl – jazyk pre tvorbu malých aplikácií, tvorbu textových súborov a generovanie dynamických webových 
stránok pomocou rozhrania cgi 
 
Pyton – objektovo orientovaný skriptovací jazyk, ktorého kód sa ľahko číta a upravuje.  
 
Php – sprístupnenie databázy pomocou webového prehliadača 
 
Pcl – umožňuje sprístupniť ďalšie aplikácie a sady nástrojov pre prácu s databázou. Je určený skôr na 
grafické aplikácie.