Databázový jazyk je prostriedok pre komunikáciu s databázovými systémami. Rozdeľujeme ich na dve základné skupiny procedurálne – ktoré popisujú spôsob, ako chceme danú procedúru vykonať, t.j. postup činnosti a neprocedurálne – určujeme, čo chceme s dátami urobiť, t.j. výsledok činnosti. jazyky popis procedurálne popis činnosti ako chceme dosiahnuť určitý výsledok PL/SQL neprocedurálne čo chceme s dátami urobiť – manipulácia s dátami dotazovacie jazyky DML SQL- Structured Query Language QBE- Query-by-examle PHP – klient pre SQL server ASP – klient pre SQL server tvorba databáz DDL
Z hľadiska činnosti databázové jazyky delíme na dotazovací jazyk, ktorý umožňuje realizovať všetky operácie relačnej algebry, sa nazýva relačne úplný jazyk. Existuje niekoľko požiadaviek na dotazovací jazyk. Databázové jazyky možno podľa ich účelu a použitia rozdeliť na niekoľko základných skupín:
Definičný jazyk Prekladač definičného jazyka (data definition language - DDL) pracuje ako interpreter. Z príkazov definičného jazyka vytvára alebo mení časti katalógu dát. Výsledkom jeho činnosti je zmenený katalóg dát. Prostredníctvom definičných jazykov sa okrem štruktúry dát stanovujú aj ďalšie atribúty databázového systému – napríklad spôsob utajenia dát, uloženia dát v pamätiach, veľkosť vyrovnávacích pamätí, počet súčasných užívateľov, spôsob ochrany bázy dát pred stratou dát a pod.
Manipulačný jazyk Manipulačné jazyky (data manipulation language - DML) sa zväčša riešia tzv. hostiteľským spôsobom, keď je jazyk tvorený iba príkazmi rozširujúcimi možnosti konvenčného - tzv. hostiteľského jazyka. Jazyky obsahujú všetky príkazy potrebné na styk so SRBD - vkladanie, výber a aktualizáciu viet dát. Pri spracovaní príkazov manipulačného jazyka v hostiteľskom počítači sa používajú tieto hlavné techniky:
- Použije sa štandardný príkaz CALL alebo ENTER hostiteľského jazyka, do ktorého sa ako parameter uvedie príkaz manipulačného jazyka. „Preklad“ príkazu volania príslušného programu SRBD uskutoční priamo prekladač hostiteľského jazyka, čím je zariadené napojenie aplikačného programu na SRBD.
- Pred kompiláciou programu v hostiteľskom jazyku sa zaradí tzv. predkompilácia, počas ktorej sa identifikujú príkazy rozširujúce hostiteľský jazyk a spracujú sa. Spracovanie znamená kontrolu syntaktickej a sémantickej korektnosti príkazov a ich nahradenie príkazmi hostiteľského jazyka. Na volanie funkcií SRBD to budú opäť príkazy CALL alebo ENTER, ale okrem toho sa program v hostiteľskom jazyku rozšíri aj o deklaračné časti, ďalej o príkazy a prípadne aj o procedúry na ošetrenie chybových stavov.
- Najdokonalejšie riešenie je vytvorenie nového kompilátora takéhoto rozšíreného jazyka. Tým sa dá dosiahnuť optimálne spracovanie programu z hľadiska možnosti detekcie poruchových stavov, väzieb databázových častí na ostatné časti programu, rýchlosti spracovania a pod. Táto technika je však najnákladnejšia.
Jazyk pre udržanie integrity dát Ide o jazyk, ktorého účelom je riadenie funkcií pre zabezpečenie integrity databázy. V zahraničnej literatúre sa označujú ako data integrity statements (DIS).
Jazyk pre riadenie prístupu Ide o jazyk, ktorého účelom je zvýšiť bezpečnosť databázy. Rieši napríklad rozdelenie užívateľov do rôznych užívateľských skupín, definovanie prístupových práv jednotlivým skupinám a užívateľom a tiež kontrolu práv prístupu užívateľov. V zahraničnej literatúre sa označujú ako data access statements (DAS). Užívateľské jazyky Ide o jazyky určené predovšetkým pre užívateľov systému, ktorí spravidla nie sú programátormi. Vzhľadom k tomu majú jednoduchú syntax. Používajú slová podobné prirodzenému jazyku a nepoužívajú procedurálne príkazy. Tieto jazyky sú typické pre relačný dátový model a hlavné použitie majú na výber dát. Niektoré SRBD poskytujú užívateľské jazyky aj na aktualizáciu bázy dát. Prekladače užívateľských jazykov sú obvykle zložité programové prostriedky, ktoré tesne nadväzujú na realizáciu požiadavky (programu) v SRBD. V spolupráci s ním riešia napr. aj kontrolu práv prístupu užívateľov, kontakt s katalógom dát a pod
6.1 Dotazovacie jazyky Pre zadávanie dotazu slúžia syntaktické konštrukcie – dotazovacie jazyky. Koncepcie najznámejších vychádza z polovice 70. rokov SQL (Structured Query Language), ktorý sa stal štandardom. Quel – súčasť SRBD vychádza z modifikácie relačných báz má priamu súvislosť s relačnými operáciami a bol vyvinutý firmou IBM pre kancelársky software pre sálové počítače a tiež aj implementáciu firmy Borland v SRBD Paradox, ktoré okrem prostriedkov dotazovania zahŕňa aj ďalšie rysy DML a komplexný DDL (DDL- data definition language na definíciu schémy databázy, DML- data manipulation language jazyk na manipuláciu s dátami ). Všetky sú relačne úplné, Pre zápis požiadaviek na databázový server sa najčastejšie používa jazyk SQL. Postupnosťami operácií selekcie, projekcie a spojenia nad relačnými tabuľkami je možné odpovedať na dotazy a získavať informácie. SQL jazyk prešiel dlhý vývojom a v rôznej miere ho podporujú takmer všetky bežne používané databázové servery. Databázovým serverom sa niekedy zjednodušene hovorí aj SQL servery. Tieto servery ponúkajú všetko potrebné pre vytváranie, modifikáciu a zrušenie tabuliek, pre prácu s údajmi v tabuľke - vyhľadávanie, pridávanie, modifikovanie a mazanie. Komunikácia prebieha ako model server/klient. Pre SQL server v úlohe klienta môže vystupovať aj skript napísaný v PHP či ASP. SQL server má svoj vlastný protokol, s ktorým môže klient komunikovať. Ak klient komunikuje s viacerými servermi, musí podporovať rozhranie ODBC, ktoré vzniklo na platforme Windows. Rozhranie ODBC sa jednotne nazýva aj ovládač. PHP ponúka pre niektoré servery priamu podporu prístupu k dátam. Tento prístup je obvykle rýchlejší pre priamo podporované databázy Oracle, Sybase, Solid, MySQL, PostgreSQL, ...
6.2 Jazyk SQL bol vyvinutý firmou IBM v r. 1974 pod menom SEQUEL. SQL vznikal živelným spôsobom (ako kedysi Fortran). Vznikali rôzne SQL produkty - 35 v r. 1986, viac ako 55 v r. 1989 ISO a ANSI publikovali v r.1986 identické štandardy SQL (SQL86) v podstate dialekt SQL f. IBM. Revize normy v r. 1989 (SQL89), v r.1992 (SQL 2, SQL92), ... SQL86 má časti jazyk pre definíciu dát – popis tabuliek, pohľadov a prístupových práv jazyk pre manipuláciu s dátami - prístup a aktualizácia jazyk pre konštrukciu modulov jazyk vytváranie rozhraní medzi databázou a aplikačným programom napísanom v bežnom programovacom jazyku zápis SQL do aplikačných programov
príkazy jazyka SQL sa delia do oblastí:
DDL (Data Definition Language)
- definícia dáta a ich väzieb
- založenie štruktúry databázy
- predefinovanie štruktúry databázy
DCL (Data Control Language) - zabezpečení dát GRANT – prideľovanie prístupových práv k danej databáze REVOKE – odoberanie už pridelených prístupových práv
DML (Data Manipulation Language) – manipulácia s dátami (výber, zoradenie, zmena hodnoty, ) SELECT – formulácia výberových požiadaviek INSERT - vkladanie dát do už vytvorenej tabuľky UPDATE – modifikácia riadkov tabuľky DELETE – odstránenie riadkov tabuľky ale nie celej tabuľky DROP TABLE – vymazanie tabuľky a všetkých riadkov tabuľky !!!
Relační databázový model použitý v SQL nie je totožný s definíciou Codda - n-tice môžu obsahovať prázdne hodnoty, ktoré sa interpretujú ako neznáme, nedefinované a vplyvňujú vyhodnotenie logických výrazov a agregačných funkcií. Výsledkom dotazu nie je vo všeobecnosti množina ale kolekcia /sú duplicitné riadky/, množina sa získa zadaním príkazu DISTINCT do dotazu, náhľadu (view). Uživateľské tabuľky sú odvodené z tabuliek v relačnej schéme, sú virtuálne, t.j. nie sú uložené príamo v databáze. Náhľadom sa vlastne implementuje externá schéma, sú naň kladené obmedzenia – napr. nie je možné vykonať aktualizáciu. a pod.
6.2.1 JAZYK SQL- základné príkazy
Relačné databázy a SQL2 Štruktúrovaný dotazovací jazyk SQL2 pre relačné databázy predstavuje jazyk definície dát (data definition language - DDL) na definíciu schémy databázy aj jazyk na manipuláciu s dátami (data manipulation language - DML). Pod definíciou schémy databázy sa rozumie deklarácia typov záznamov a vytvorenie „prázdnych“ súborov v externých pamätiach. Manipulácia s dátami znamená vytváranie, vyhľadávanie, aktualizáciu a vymazávanie záznamov v externých pamätiach. Ako sme už spomenuli, SQL2 nie je úplným programovacím jazykom (neobsahuje priraďovací a podmienený príkaz, príkaz cyklu atď.). Z uvedeného dôvodu sa jeho príkazy vyvolávajú buď z iného tzv. hosťovského programovacieho jazyka (napríklad cobol, C) alebo sa využíva neštandardizovaná nadstavba jazyka SQL, tzv. 4GL. V týchto statiach budeme, nakoľko sa len dá, používať štandardný SQL2. V prípadoch, keď sa ocitneme za jeho hranicami, si vypomôžeme jazykom 4GL relačného DBMS Informix.
Jazyk SQL2 vo svojej podstate „zhmotňuje“ princípy relačných databáz. Základným pojmom relačných databáz je tabuľka. Stĺpce tabuľky reprezentujú atribúty a riadky jednotlivé záznamy. Atribút môže obsahovať maximálne jednu hodnotu, ktorá musí byť navyše atomická.
Na zefektívnenie práce RDBMS používateľ stanovuje pre tabuľku atribút, resp. skupinu atribútov, ktorých hodnoty jednoznačne určujú každý riadok danej tabuľky. Takýto atribút, resp. skupina atribútov sa nazýva primárny kľúč. Z dôvodu efektívnosti sa odporúča, aby primárny kľúč tvoril najmenší možný počet atribútov, a aby samotné atribúty mali najmenší možný rozsah (číselné hodnoty namiesto znakových reťazcov). Súvisiace tabuľky sa navzájom prepájajú pomocou tzv. cudzích kľúčov. Cudzí kľúč predstavuje atribút, resp. skupinu atribútov, ktorých hodnoty sú hodnotami primárneho kľúča inej tabuľky. Prepájanie záznamov pomocou cudzích kľúčov sa považuje za jednu z hlavných predností relačných databáz, pretože odbremeňuje používateľa od poznania fyzického uloženia záznamov v externých pamätiach.
Jazyk pre definíciu dát - DDL Jazyk pre manipuláciu s dátami - DML Príkazy pre riadenie prístupu - DAS Príkazy pre zabezpečenie integrity - DIS Utility
6.2.1.1 Definícia schémy databázy - vytvorenie tabuliek Tabuľky sa vytvárajú príkazom CREATE TABLE, v rámci ktorého sa špecifikuje názov tabuľky, jej atribúty a ich typy, primárne kľúče a ohraničenia. SQL2 dovoľuje iba definíciu atomárnych typov (preddefinované typy, resp. používateľské synonymá pre preddefinované typy - tzv. domény). Samotná tabuľka nie je typom, aj keď implicitne plní túto úlohu.
CREATE TABLE, v rámci ktorého sa špecifikuje:
názov tabuľky, (entity) atribúty (domény) typy, primárne kľúče cudzie kľúče ohraničenia.
SQL2 dovoľuje iba definíciu atomárnych typov:
preddefinované typy, používateľské synonymá pre preddefinované typy - tzv. domény)
- Deklarácia cudzích kľúčov umožňuje SRBD automatickú kontrolu konzistentnosti hodnôt cudzieho kľúča so zodpovedajúcim primárnym kľúčom v asociovanej tabuľke (tzv. referenčné ohraničenie)./
Iné operácie DROP DATABASE meno_databázy DROP INDEX meno_indexu DROP SYNONYM synonym-name DROP TABLE meno_tabulky DROP VIEW meno_pohľadu CREATE DATABASE meno_databázy CREATE [TEMP] TABLE meno_tabulky ALTER TABLE meno_tabulky MODIFY (starémenos novýdatovýtyp [NOT NULL][,...]) DROP CONSTRAINT (meno_obm [,...])}[,...] LOCK MODE {PAGE|ROW }[,...] MODIFY NEXT SIZE číslo} CREATE [UNIQUE | DISTINCT] [CLUSTER] INDEX meno_indexu ON menotabulky (menostĺpca [ASC | DESC],...) CREATE SYNONYM menosynonyma FOR menotabulky CREATE VIEW menopohľadu [(zoznamstĺpcov)] AS SELECT-príkaz [WITH CHECK OPTION] príklad CREATE TABLE Zamestnanec ( kod_zamest INTEGER, kod_projektu INTEGER, meno CHAR(30), plat INTEGER, PRIMARY KEY (kod_zamest), FOREIGN KEY (kod_projektu) REFERENCES Projekt);
CREATE TABLE Trieda ( kod_diagramu INTEGER, kod_triedy INTEGER, kod_dekompozicie INTEGER, nazov CHAR(32), poloha_x INTEGER, poloha_y INTEGER, PRIMARY KEY (koddiagramu, kodtriedy), FOREIGN KEY (kod_diagramu) REFERENCES Diagram, FOREIGN KEY (koddekompozicie) REFERENCES Diagram (koddiagramu));
6.2.1.2 Základné dátové typy NUMERIC(n,m)
SERIAL
CHAR(n)
SMALLINT
DECIMAL(m,n)
FLOAT
DATE
INTEGER
MONEY(m,n)
SMALLFLOAT
INTERVAL
DATETIME
VARCHAR
TEXT
BYTE
6.2.1.3 Manipulácia s dátami Jazyk SQL2 poskytuje štyri základné príkazy na manipuláciu s dátami: pridávanie riadku do tabuľky: INSERT aktualizáciu existujúceho riadku (-ov) v tabuľke: UPDATE vymazanie riadku (-ov): DELETE výber riadkov a stĺpcov: SELECT
Z nich relačné databázy charakterizuje práve príkaz SELECT. Uvedený príkaz bol navrhnutý so zámerom interaktívneho a flexibilného vyhľadávania dát, požadovaného v agendových aplikáciách. Príkaz SELECT je relatívne bohatý, vo všeobecnosti však ponúka tri typy operácií: projekcia - výber špecifikovaných stĺpcov z tabuľky, napríklad stĺpcov meno a plat z tabuľky
Zamestnanec:
SELECT meno, plat FROM Zamestnanec reštrikcia - výber požadovaných riadkov z tabuľky na základe výberovej podmienky, nájdenie všetkých zamestnancov s platom väčším ako 10000: SELECT * FROM Zamestnanec WHERE plat > 10000 náhradný symbol * v časti SELECT znamená všetky stĺpce) spájanie - spájanie tabuliek pomocou výberovej podmienky (tabuľky vo všeobecnosti ani nemusia byť prepojené cudzími kľúčmi), napríklad výber všetkých projektov, na ktorých pracuje niektorý zamestnanec (predpokladajme, že existujú projekty, na ktorých zatiaľ nikto nepracuje): SELECT * FROM Zamestnanec, Projekt WHERE Zamestnanec.kodprojektu = Projekt.kodprojektu Stĺpce, ktorých názvy nie sú jednoznačné (rovnaké mená sa nachádzajú v oboch spájaných tabuľkách), sa špecifikujú plnými menami: menotabuľky.menostĺpca. Výsledkom každej zo spomínaných operácií je opäť tabuľka - s požadovanými riadkami a stĺpcami. (T.j. SQL2 je uzatvorený vzhľadom na operácie projekcie, reštrikcie a spájania). Pri spájaní sa vytvára tabuľka, zodpovedajúca karteziánskemu súčinu spájaných tabuliek.
Uvedené tri operácie sa zriedka používajú vo svojej „čistej“ podobe. Väčšinou sa navzájom kombinujú. Napríklad vypísanie mena zamestnanca a nazvu jeho projektu pre všetkých zamestnancov, ktorých plat prevyšuje 10000, sa zabezpečí príkazom: SELECT meno, nazov FROM Zamestnanec, Projekt WHERE (plat > 10000) AND (Zamestnanec.kodprojektu = Projekt.kodprojektu)
pridávanie riadku do tabuľky INSERT INTO menotabulky [(zoznamstĺpcov)] { VALUES (zoznam_hodnôt)
aktualizáciu existujúceho riadku v tabuľke: UPDATE UPDATE meno_tabulky SET { menostĺpca = výraz[,...] { (zoznamstĺpcov) *} = (zoznam_výrazov) } [WHERE podmienka]
vymazanie DELETE DELETE FROM meno_tabulky [WHERE podmienka]
výber riadkov a stĺpcov: SELECT
SELECT [ALL | DISTINCT | UNIQUE] zoznamstĺpcovselektu FROM [OUTER] menotabulky [aliastabulka] [,...] [WHERE podmienka] [GROUP BY zoznam_stĺpcov] [HAVING podmienka] [ORDER BY meno_stĺpca [ASC | DESC],...] [INTO TEMP meno_tabulky] [WITH NO LOG]
SELECT-príkaz UNION [ALL] SELECT-príkaz [UNION [ALL] SELECT-príkaz] ...
WHERE podmienka:
výraz relačný-operátor výraz výraz [NOT] BETWEEN výraz AND výraz výraz [NOT] IN (položky) meno_stĺpca [NOT] LIKE "string" [ESCAPE escape-znak] výraz relačný-operátor {ALL | [ANY | SOME]} (SELECT-príkaz) výraz [NOT] IN (SELECT-príkaz) [NOT] EXISTS (SELECT-príkaz) meno_stĺpca IS [NOT] NULL
typy operácií:
projekcia - výber špecifikovaných stĺpcov SELECT meno, plat FROM Zamestnanec
reštrikcia - výber požadovaných riadkov z tabuľky na základe výberovej podmienky, napríklad SELECT * FROM Zamestnanec WHERE plat > 10000 náhradný symbol * v časti SELECT znamená všetky stĺpce)
spájanie - spájanie tabuliek pomocou výberovej podmienky (tabuľky vo všeobecnosti ani nemusia byť prepojené cudzími kľúčmi) SELECT * FROM Zamestnanec, Projekt WHERE Zamestnanec.kodprojektu = Projekt.kodprojektu
Stĺpce, ktorých názvy nie sú jednoznačné (rovnaké mená sa nachádzajú v oboch spájaných tabuľkách), sa špecifikujú plnými menami: menotabuľky.menostĺpca. SELECT meno, nazov FROM Zamestnanec, Projekt WHERE (plat>10000) AND (Zamestnanec.kodprojektu=Projekt.kodpr ojektu)
1.Výber všetkých stĺpcov SELECT * FROM předmět
2. Výber s hviezdičkovou konvenciou
SELECT * FROM os_udaje WHERE meno="Stanislav"
3. Výber a uloženie do dočasnej tabuľky
SELECT * FROM os_udaje WHERE meno="Stanislav" INTO TEMP docasna
4. Projekcia
SELECT meno, priezvisko FROM os_udaje
5. Projekcia a kartézsky súčin
SELECT meno, priezvisko, nazov FROM os_udaje, predmet SELECT meno, priezvisko FROM os_udaje INTO TEMP a; SELECT cis_predmet FROM predmet INTO TEMP b; SELECT meno, priezvisko, cis_predmet FROM a,b
6. Potlačenie výberu duplicitných riadkov
SELECT UNIQUE meno FROM os_udaje alebo SELECT DISTINCT meno FROM os_udaje
7. Spojenie s duplicitami
SELECT cis_predmet FROM student, zap_predmety WHERE tudent.oscislo=zappredmety.os_cislo
8. Potlačenie výberu duplicitných riadkov pri spojení
SELECT UNIQUE cis_predmet FROM student, zap_predmety WHERE student.oscislo=zappredmety.os_cislo
9. Triedenie
SELECT meno, priezvisko FROM os_udaje ORDER BY priezvisko
10. Triedenie podľa dvoch stĺpcov
SELECT meno, priezvisko FROM os_udaje ORDER BY meno, priezvisko
11. Triedenie so zadaním smeru triedenia - vzostupne
SELECT nazov FROM predmet ORDER BY nazov ASC
12. Triedenie so zadaním smeru triedenia - zostupne
SELECT nazov FROM predmet ORDER BY nazov DESC
13. Triedenie podľa viacerých stĺpcov v rôznom smere
SELECT meno, priezvisko FROM os_udaje ORDER BY meno DESC ,priezvisko ASC
- 14. Triedenie podľa viacerých stĺpcov v rôznom smere s poradovým číslom
15. Výber podreťazcov
SELECT meno, priezvisko[1,10], obec[1,8], psc FROM os_udaje
16. Práca s podmienkami
Relačné operátory sú :
< ; ;