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
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
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Ť.
Ú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
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
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
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,......);
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),
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
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),
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
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
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
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.
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
(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
[] - 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
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
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,
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)
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
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);
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 ´|´;
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
Čí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’;
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)) || ‘%’’;
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
Ú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.