SQL

Databázová abeceda obsahuje 50 hesel. Bylo by naivní si myslet, že zrovna tento výběr vyčerpávajícím způsobem repre...


Databázová abeceda obsahuje 50 hesel. Bylo by naivní si myslet, že zrovna tento
výběr vyčerpávajícím způsobem reprezentuje databázovou technologii. Navíc, v
rámci jednoho hesla jsou často diskutovány pojmy, které by bylo možné uvést
jako samostatné
heslo. Proč zrovna 50? Jednak je to hezké kulaté číslo, jednak
s 50. heslem skončil i celý seriál v Computerworldu.
Bylo snadné se rozhodnout, jakému pojmu věnovat poslední pokračování seriálu.
Jakákoliv abeceda představuje jistý základ, na kterém lze dále stavět.
Databázová abeceda v pojetí, jakým byla předkládána v tomto seriálu, měla podat
základ soudobé databázové technologie. Zdůrazňuji soudobé, protože bylo
diskutováno mnoho nosných trendů 90. let, jako jsou např. objektově-orientované
databáze, objektově-relační databáze, databáze prostorových objektů a další,
které nelze běžně nalézt v rámci jedné monografie o databázích.
Zdá se, že jazyk SQL je právě tím pojítkem, které drží celou databázovou
technologii (a nejen
relační) pohromadě. Jeho úloha
je podobná tomu pověstnému kachlíku, jehož odstranění z konstrukce kamen vede k
jejich sesypání. Jaký je vlastně SQL, tolik zatracovaný odborníky, a přesto
stále žijící, stále se vyvíjející? Jde opravdu o mezigalaktický databázový
jazyk, jak kdysi prohlásil M. Stonebraker, jeden z dnešních šéfů INFORMIXu?
Historie SQL
Na rozdíl od programovacích procedurálních jazyků, neprocedurální jazyky, mezi
které patří i SQL, popisují, co požadujeme od databáze a nikoliv, jak to je
třeba provést. Počátky jazyka SQL sahají do r.1974, kdy se ještě nazývá Sequel
a je zaměřen hlavně na svou dotazovací část. Jeho
prototypová implementace byla součástí Systému R vyvinutého v laboratoři IBM v
San José, kde byl zaměstnán i tvůrce RMD Dr. E. F. Codd. Akronym Sequel
znamenal tehdy Structured English QUEry Language, dnes se
hovoří pouze o SQL (Structured Query Language).
Výchozí koncepce jazyka SQL (vyslovuje se es qjú el, i když i výslovnost síqel
je povolena) je tedy stará skoro 35 let. S nástupem počítačů PC se řada
světových výrobců software začala v 80. letech orientovat na implementaci SQL.
Od jednouživatelských SŘBD (případně verzí těchto systémů v lokálních sítích) s
SQL přistoupila řada výrobců k vytváření výkonných SŘBD v prostředí UNIX, resp.
databázových serverů založených přímo na SQL. Z implementací této třídy jsou
dnes u nás nejznámější SŘBD ORACLE, INFORMIX, Sybase, DB/2, SQL Server od firmy
Microsoft a další. SQL bývá použit i jako rozhraní jiných, obecně nerelačních
systémů.
Zlomem ve vývoji SQL se stala jeho standardizace organizací ANSI v roce 1986 a
její přijetí ISO v r. 1987. Standard představoval v podstatě dialekt SQL firmy
IBM a byl charakterizován jako "průnik existujících implementací". Nazývá se
též SQL86. Rozšíření definičního jazyka týkající
se možností definovat integritní omezení, byla shrnuta ve zprávě ISO z roku
1989. Takto rozšířený SQL se nazývá SQL89. Další vývoj jazyka vyústil do
standardu SQL92, který byl přijat ANSI a ISO v r. 1992. Mnoho let se pracuje na
další verzi standardu s pracovním názvem SQL3. Jeho uvedení se ovšem rok od
roku odkládá, s úplnou verzí se počítá v roce 1999.
Co je SQL
SQL je více než dotazovací jazyk. Je možné v něm definovat data a provádět
aktualizace, tak jak je obvyklé u každého SŘBD, možné je i definovat přístupová
práva k tabulkám. Databázové modelování světa v SQL má tyto rysy:
lData jsou uložená v databázi ve formě tabulek, které jsou buď skutečné
(odpovídají schématu databáze), nebo virtuální (pohledy).
lSQL vrací data programu (nebo interaktivně uživateli), který se nemusí starat
o fyzickou strukturu či umístění dat.
lPořadí tabulek v databázi není důležité, jsou identifikovány jménem.
lPořadí sloupců v tabulkách není důležité, jsou identifikovány jménem.
lPořadí řádků v tabulkách není důležité, jsou identifikovány hodnotami ve
sloupcích.
lData jsou vždy prezentována uživateli jako tabulky, bez ohledu na jejich
vnitřní strukturu použitou v databázi.
Všeobecně je známo minimálně trojí použití SQL:
lSQL jako dotazovací (nebo obecněji manipulační) jazyk pro relační databáze,
lSQL jako složka hostitelského jazyka pro programování databázových aplikací,
lSQL jako jazyk komunikace mezi různými zdroji dat.
Dnes, v souvislosti s integrací heterogenních informačních zdrojů umístěných v
počítačové síti, nabývá důležitosti hlavně poslední typ použití. SQL není
považován za jazyk koncového uživatele (nemá např. vstupní a výstupní příkazy).
Přednost se dnes dává atraktivnějším koncovým uživatelským prostředkům, kde SQL
slouží jako jazyk v pozadí.
Jazyk SQL má několik částí:
ljazyk pro definici dat,
linteraktivní jazyk pro manipulaci dat,
ljazyk pro manipulaci dat v hostitelské verzi,
lmožnost definice pohledů,
lmožnost definice přístupových práv,
lmožnost definice integritních omezení,
ljazyk modulů,
lřízení transakcí.
Síla jazyka je v příkazu SELECT Na jazyku SQL je zřejmě nejzajímavější příkaz
SELECT, s jehož pomocí lze formulovat uživatelské dotazy, obecněji požadavky na
výběr dat z databáze. Ukážeme jeho vztah k relační algebře, která tvoří jednak
teoretický základ relačních jazyků, jednak je možné operace relační algebry
chápat jako jakýsi Assembler, pomocí kterého lze příkaz SELECT implementovat.
Relační algebra obsahuje 2 typy operací:
lmnožinové: kartézský součin (x), sjednocení (?) a rozdíl (-),
lostatní: projekce relace na množinu atributů (R[A1,_,Ak]), selekce podle
logické podmínky (R(F)).
Protože relace jsou množiny, lze množinové operace chápat v běžném matematickém
slova smyslu. Projekce "vyřezává" z tabulky sloupce, selekce "vybírá" řádky, na
kterých je splněna podmínka.
Těchto 5 operací tvoří důležitý základ relačních jazyků. Jestliže je jazyk v
nějaké formě obsahuje, je relačně úplný. Mezi další, ale již odvozené operace
patří spojení relací, průnik relací apod. Zdůrazněme, že relační úplnost
představuje jakýsi etalon vyjadřovací síly. Platí také konsenzus, že relačně
úplný jazyk je dostatečně silný prostředek, tj. lze s ním vyjádřit přijatelně
velkou množinu dotazů.
Uvažujme schémata dvou tabulek
ZAMĚSTNANEC(Č_ZAM, JMÉNO, ROD_ČÍSLO, ADRESA)
VÝPŮJČKA(Č_ZAM, Č_KOPIE, JMÉNO_F)
a dotaz
D1: Vytvoř tabulku s rodnými čísly zaměstnanců a počty jejich výpůjček
filmových kopií, přičemž tito zaměstnanci (zákazníci) mají vypůjčeno více než 2
kopie a jsou z Prahy. Tabulka nechť je setříděna sestupně podle počtu kopií.
V SQL může dotaz vypadat následovně:
SELECT č_zam, COUNT(č_kopie) AS počet_kopií FROM Výpůjčka V, Zaměstnanec Z
WHERE V.č_zam = Z. č_zam AND Z.adresa LIKE %Praha%
GROUP BY V. č_zam
HAVING COUNT(č_kopie) > 2 ORDER BY počet_kopií DESC;
Procedurální sémantika dotazu (pozor, to neznamená, že skutečný vyhodnocovací
algoritmus takto pracuje) je dána následujícím algoritmem:
1.Vytvoří se kartézský součin Výpůjčka x Zaměstnanec.
2.Vyhodnocením podmínky za WHERE se tabulka z kroku 1
zúží na spojení přes rovnost na sloupcích č_zam. a podmínku, že adresa obsahuje
jako podřetězec řetězec Praha
3.V tabulce z kroku 2 se seskupí řádky podle stejných hodnot sloupce č_zam.
4.Ze skupin kroku 3 se vyberou jen ty skupiny, kde počet čísel kopií je větší
než 2.
5.Každá skupina z kroku 4 přispívá do jednoho řádku výsledné tabulky, jejíž
sloupce jsou pojmenovány č_zam a počet_kopií.
6.Tabulka z 5 je uspořádána v souladu s ORDER BY.
Všimněme si z příkladu, že SQL "umí" i jiné věci než relační algebra. Řádky lze
seskupovat pomocí GROUP BY, lze používat i agregační funkce, lze testovat
výskyt podřetězce v řetězci. O jazyku SQL lze také dokázat, že je relačně
úplný, tj. že "umí" i relační algebru.
Mezi důležité konstrukty jazyka SQL patří množinové operace. V SQL92 je k
dispozici operace UNION, tj. sjednocení tabulek, dále pak INTERSECT a EXCEPT,
tj. průnik a rozdíl.
Ukážeme příklad použití rozdílu. Tento operátor se již vyskytoval v dřívějších
implementacích SQL, např. SŘBD ORACLE jej uvádí pod vyhrazeným slovem MINUS,
standard SQL92 vyžaduje EXCEPT. Přibereme relace KINO s atributem NÁZEV a
PŘEDSTAVENÍ(NÁZEV, JMÉNO_F). Dotaz D2: Najdi kina, která nic nehrají
se zapíše v SQL jako
(SELECT název FROM Kino)
EXCEPT
(SELECT název FROM Představení)
V nejobecnějším tvaru je výraz dotazu v SQL dán kolekcí termů spojených pomocí
UNION, INTERSECT. Každý term je buď specifikací dotazu, tj. výraz
SELECTFROM-WHERE-GROUP -BY-HAVING, nebo konstantní řádek či tabulka daná
příslušnými konstruktory.
Redundance konstruktů
Konstrukty SQL poskytují rozsáhlé možnosti vyjadřování. Někdy se SQL vytýká, že
jeden a týž dotaz lze formulovat několika způsoby. Ty jsou založeny na pestrých
možnostech formulace podmínek za WHERE. Uvažujme dotaz
D3. Najděte adresy kin, ve kterých dávají film Kolja.
Existují minimálně 4 způsoby, jak tento dotaz zapsat v SQL.
Varianta se spojením:
SELECT Kino.adresa FROM Kino, Představení
WHERE Kino.název = Představení.název AND Představení. jméno_f = Kolja;
Varianta s IN:
SELECT adresa FROM Kino
WHERE název IN (SELECT název FROM Představení
WHERE jméno_f = Kolja);
Varianta s =ANY:
SELECT adresa FROM Kino
WHERE název =ANY (SELECT název FROM Představení
WHERE jméno_f = Kolja);
Varianta s EXISTS:
SELECT adresa FROM Kino
WHERE EXITS (SELECT název FROM Představení
WHERE Kino.název = Představení.název AND Představení.jméno_f = Kolja);
Našly by se i exotičtější varianty:
SELECT adresa FROM Kino
WHERE Kolja IN (SELECT jméno_f FROM Představení
WHERE Představení.název = Kino.název);
Tvůrci SQL obhajují tuto redundanci možností. Každý uživatel jazyka má jiný
styl myšlení a má možnost se rozhodnout.
Standardy SQL Uživatelé většinou obtížně zjišťují, které rysy patří do
standardu a které nikoliv, případně jaké jsou vlastně rozdíly mezi jednotlivými
standardy. V době vzniku SQL86 již byla na trhu řada produktů SQL. Aby bylo
možné docílit vhodného standardu, použilo se do standardizační verze společných
rysů různých implementací. Množství příkazů, které neobsahoval standard SQL89,
jsou nyní v SQL92. V implementacích však můžeme nalézt příkazy, které v SQL92
mají odlišnou syntaxi (např. EXCEPT a OUTER JOIN). Dokonce se objevují prvky ze
standardu SQL3 (objektové rozšíření, rekurzivní SELECT), které nejsou v SQL92,
anebo nové prvky, které zatím nejsou plánovány ani v SQL3 (např. operátor
CUBE). Jinou nevýhodou standardizace SQL je, že chyby z minulosti se těžko
napravují, tj. nevhodné rysy jazyka si standard stále nese s sebou. Jistota
současných relačních SŘBD je, že alespoň splňují standardy SQL86, resp. SQL89.
Standard SQL92 nabízí 2 podmnožiny, vhodné pro překlenovací období v dosažení
úplné verze. Navíc jde o jakousi vstupní verzi (Entry SQL), která jen málo
rozšiřuje SQL89. SQL92 prostřední úrovně (Intermediate SQL) je podmnožinou
obsahující zhruba polovinu nových funkcí vyskytujících se v úplném SQL92. Nezdá
se ale, že by na to dodavatelé nových verzí relačních serverů příliš dbali.
Řada konstruktů SQL92 se již dnes v mnoha relačních SŘBD sice objevuje,
bohužel, někdy s poněkud jinou syntaxí, ale i sémantikou. Patří sem např.
možnost práce se schématem databáze, množinové operace, vnější spojení,
dynamický SQL a mechanismy práce s indikací chyb. SQL92 přináší také
netriviální prvky, jejichž implementace ještě není zcela zřejmá. Sem patří
hlavně velmi silné možnosti formulace IO.
Jazyk SQL3 obsahuje také jazyk pro psaní uložených procedur (SQL/PSM). To z něj
učiní výpočetně úplný jazyk pro definici a řízení perzistentních složitých
objektů nezávisle na různých jazycích 4GL. Svými celkovými ambicemi představuje
SQL3 monstrózní koncepci popsanou na více než 1 000 stránkách. Hádat SQL
budoucnost však znamená použít křišťálovou kouli. Vzpomeňme však na dinosaury...
8 2101 / or









Komentáře
K tomuto článku není připojena žádná diskuze, nebo byla zakázána.