databaza

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

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

t

f

?

False

f

f

f

?

?

f

?


or

true

false

null

True

t

t

t

False

t

f

?

?

t

?

?


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

1

8

2

5

7


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.


Wyszukiwarka

Podobne podstrony:
Oracle Database 11g i SQL Programowanie or11pr
Database INFOTECH
Linux Installing Oracle Database 10g on Novell SUSE Linux
An Introduction to Database Systems, 8th Edition, C J Date
Oracle Database 10g Administracja bazy danych w Linuksie oradab
Oracle Database 10g Programowanie w jezyku PL SQL or10ps
ms excel 2000 a prace s databazemi NZ63FERZ7YXQCMCML3IVIWDI4NWKHCEEPGJSXLA
Oracle Database 10g Kompendium administratora or10ka
OBD II DTC Database Generic Powertrain Codes (P0xxx, P2xxx, P34xx P39xx)(1)
2 0 Database Security Labid 19833 (2)
Oracle Database Tworzenie aplikacji internetowych w AJAX i PHP ordatw
Mastering Visual Basic NET Database Programming
Apress Database Programing With C Sharp
Oracle Database 11g Podręcznik administratora
Oracle Database 11g dla początkujących
Oracle Database 11g Nowe mozliwosci or11no
[E Book] Database Design Access) Microsoft Access Tutorial

więcej podobnych podstron