470 likes | 656 Views
Popis jazyka SQL. Doc. Ing. Juraj Vaculík, PhD. Jazyk pre manipuláciu s údajmi.
E N D
Popis jazyka SQL Doc. Ing. Juraj Vaculík, PhD.
Jazyk pre manipuláciu s údajmi Na rozdiel od programovacích procedurálnych alebo objektových jazykov (C++, PowerBuilder a pod.) radíme štruktúrovaný dopytovací jazyk SQL (Structured Query Language) do kategórie neprocedurálnych jazykov, ktoré popisujú • čo požadujeme od databázy a nie • ako to potrebujeme vykonať. Jazyk SQL
Počiatky jazyka SQL • siahajú do roku 1974, keď bol definovaný firmou IBM jeho predchodca Sequel. • v roku 1987 bol SQL prijatý organizáciou ANSI ako ISO štandard. Tento sa rozšíril v roku 1989 (SQL89) a 1992 (SQL92), čo je aj jeho dnešná platná norma. • zložitosť SQL92 ilustruje aj fakt, že do dnešného dňa žiadna databázová firma nenaprogramovala do svojich systémov jeho plnú implementáciu. Jazyk SQL
Základné črty SQL • uloženie údajov v databáze vo forme tabuliek - reálnych alebo virtuálnych (neexistujúcich, sú to tzv. pohľady); • poloha tabuliek nie je dôležitá, identifikované sú svojim menom; • poradie stĺpcov v tabuľkách nie je dôležité, identifikácia prebieha cez meno stĺpca; • poradie riadkov v tabuľkách nie je dôležité; • údaje sú vždy prezentované koncovému užívateľovi vo forme tabuliek, bez ohľadu na ich vnútornú štruktúru, Jazyk SQL
Indexy, kľúče • sú indexové štruktúry zamerané na zrýchlenie prístupu k riadkom v tabuľkách pri spracovaní užívateľského požiadavku. • Samotný jazyk je však nezávislý na fyzickejorganizácii údajov a o samotnom optimálnom spôsobe využitia indexov rozhoduje systém riadenia databázy. Jazyk SQL
Členenie jazyka SQL • jazyk pre definíciuúdajov DDL; • interaktívny jazyk pre manipulácius údajmi a možnosť definície pohľadov a prístupových práv DML; • možnosť definície integritných obmedzení • riadenietransakcií TCC. Jazyk SQL
Definície údajov v SQL • deklarácii relačného dátového modelu zodpovedá popis dvojrozmernej tabuľky s označenými stĺpcami a riadkami, • v relačnom dátovom modeli môžeme okrem základných tabuliek definovať aj globálne alebo lokálnedočasné tabuľky. Ich obsah nie je stály a po skončení práce s databázou sa vymaže. • Pri definovaní môžeme použiť nasledovné rezervované slová: • CREATE TABLE, ALTER TABLE, DROP TABLE Jazyk SQL
CREATE TABLE CREATETABLE meno_tabuľky(zoznam_prvkov_tabuľky) • NOT NULL - stĺpec nesmie mať hodnotu NULL (prázdnu hodnotu); • DEFAULT - určenie implicitnej hodnoty pre stĺpec; • UNIQUE - všetky hodnoty v stĺpci musia byť unikátne (ani jedna sa nesmie zopakovať); • PRIMARY KEY - stĺpec je definovaný ako primárny kľúč pri zabezpečení referenčnej integrity; • FOREIGN KEY - stĺpec je definovaný ako cudzí kľúč pri zabezpečení referenčnej integrity; • CHECK - zadaný logický výraz pre definovanie prídavných integritných obmedzení; Jazyk SQL
ALTER TABLE Zmena tabuľky • ADD - pridať stĺpec; • DROP - zrušiť stĺpec; • ALTER - zmeniť stĺpec; • ADDCONSTRAINT - pridať integritné obmedzenie; • DROPCONSTRAINT - zrušiť integritné obmedzenie. Jazyk SQL
DROP TABLE • Zabezpečí vymazanie tabuľky z databázy. Nejedná sa o jej fyzické odstránenie, len o prepísanie údajov v systémovom katalógu. • Zároveň dôjde aj k zrušeniu naväzujúcich indexov a pohľadov, čo môžeme ovplyvniť rezervovanými príkazmi RESTRICT alebo CASCADE (tzv. kaskádovité mazanie). Jazyk SQL
Manipulácia s údajmi • Príkazy pre manipuláciu s údajmi obsahujú možnosti ich • selektívneho výberu (SELECT), • aktualizačné príkazy (UPDATE, INSERT, DELETE) a • prípadne ďalšie rozšírenia. Jazyk SQL
Príkaz SELECT ... • Základná konštrukcia príkazu SELECT sa skladá minimálne z nasledujúcich troch zložiek SELECTFROMWHERE, pričom každé z nich je vyhradené slovo: • SELECT obsahuje zoznam mien stĺpcov vytvárajúcich schému tabuľky pre výsledok dopytu reprezentovaným príkazom; • FROM obsahuje zoznam mien tabuliek, nad ktorými je dopyt definovaný; • WHERE obsahuje obecne definovanú podmienku na vyhľadávanieúdajov. V rámci nej môžeme zadať ľubovoľnú podmienku s operátormi =, <>, >, <, <=, >= a AND, OR, NOT. Jazyk SQL
Príkaz SELECT ... • Príkaz SELECT neeliminuje automaticky z výsledku duplicitné riadky a ako výsledok získame tabuľku z riadkami údajov (vyjadríme pomocou slova ALL). • Pokiaľ chceme ako výsledok získať reláciu, musíme použiť slovo DISTINCT (z výberu odstránime duplicity). • Za zoznamom príkazov môžeme ešte uviesť pre konkrétny stĺpec podmienku GROUPBY, ktorá zabezpečí zoradenie celého výberu podľa daného stĺpca a to vzostupne (ASC) alebo zostupne (DESC), Jazyk SQL
Príkaz SELECT SELECT [{DISTINCT | ALL}] [{* | mena_atributov}] FROM mena_relacii [WHERE podmienka] [ORDERBY meno_atributu zoradenie] Jazyk SQL
Zoskupovacie funkcie • COUNT - spočíta prvky výberu, vrátane duplicitných alebo prázdnych (NULL) hodnôt; • SUM - vráti súčet hodnôt (sumu) stĺpca; • MAX - vráti maximum sady hodnôt stĺpca; • MIN - vráti minimum sady hodnôt stĺpca; • AVG - vypočíta aritmetický priemer sady hodnôt stĺpca v dotaze. agregačná_funkcia ([{ALL | DISTINCT}] meno_stĺpca) Jazyk SQL
Zoskupovacie funkcie • GROUPBY - je špeciálny prípad agregačnej funkcie, ktorú aplikujeme na celú tabuľku alebo jej podmnožinu. • Výsledná tabuľka sa konceptuálne (nie fyzicky) rozdelí na skupiny pre ktoré je hodnota zvoleného stĺpca konštantná. Vytvorí sa virtuálna tabuľka, pričom každá skupina tvorí jeden jej riadok. • Pokiaľ chceme aby sa výsledok skladal iba z niektorých skupín, môžeme použiť klauzulu HAVING (ekvivalent klauzuly WHERE pri príkaze SELECT). Samozrejme aj za ňou môžeme použiť doplňujúce agregačné funkcie uvedené na začiatku zoznamu. Jazyk SQL
Predikáty (prísudky) SQL • LIKE - pracuje s podreťazcami hodnôt v definovaných stĺpcoch typu CHAR (textové). Jej použitím môžeme dosiahnuť rôznych výberov, napr. vo forme LIKE ‘%reťazec%’, sa vyhľadajú všetky záznamy, ktoré na ľubovoľnom mieste v poli obsahujú vyhľadávaný reťazec. • MATCH - môžeme ním kontrolovať, či vstupné hodnoty dané ako riadkové výrazy sú z určitej množiny. • UNIQUE - použijeme, pokiaľ chceme otestovať, či v danej množine existujú duplicity. Pokiaľ áno, nadobúda hodnotu FALSE, ináč TRUE. Jazyk SQL
Predikáty (prísudky) SQL • IN - používa sa pri zložitých dopytov, ktoré obsahujú viacnásobné konštrukcie SELECTFROMWHERE. Minimálne jeden z nich je daný nasledovne: meno_stĺpca [NOT] IN poddopyt alebo meno_stĺpca [NOT] IN (zoznam_hodnôt) Pokiaľ sa IN aplikuje na prázdne tabuľky, návratová hodnota je FALSE a pri tabuľkách s prázdnymi riadkami (aj prázdny riadok je hodnota - obsahuje medzery) vracia UNKNOWN. Jazyk SQL
Množinové operácie • Okrem základnej operácie UNION (zjednotenie) štandard SQL92 priniesol aj operácie zodpovedajúce prieniku a rozdielu (INTERSECT a EXCEPT). • Aby bolo možné tieto operácie vykonať, tabuľky musia byť navzájom kompatibilné (rovnaký počet stĺpcov a v nich rovnaké typy údajov). Operácia UNION priamo eliminuje duplikáty bez nutnosti zadávania podmienky DISTINCT. • Treba však rovno povedať, že v súčasných systémoch nie sú väčšinou tieto operácie implementované. Jazyk SQL
Aktualizácie údajov v SQL • INSERT - operácia vkladania riadkov do tabuliek, pričom je nutné špecifikovať hodnoty pre jednotlivé stĺpce alebo kompletne celý riadok podľa špecifikovaného dopytu; • UPDATE - operácia zmeny hodnôt v riadkoch; • DELETE - operácia vymazania definovaných riadkov z tabuliek. Jazyk SQL
Relačné spojenia tabuliek Relačné operácie spojenia sú postavené na Coddovej algebre. V SQL92 môžeme použiť nasledovné varianty: • prirodzené spojenie • krížové spojenie • spojenie cez podmienku • spojenie cez vymenované stĺpce • vnútorné spojenie • vonkajšie spojenie • spojenie zjednotením Jazyk SQL
Prirodzené spojenie • použije sa príkaz NATURAL JOIN. SELECT * FROM U NATURALJOIN V; • V SQL89 bolo nutné použiť SELECT FROM WHERE s operáciou = pre spájacie stĺpce. Jazyk SQL
Krížové spojenie • vytvára kartézsky súčin (spojenie každého riadku z R s každým z S) dvoch tabuliek: SELECT * FROM R CROSSJOIN S; Jazyk SQL
Spojenie cez podmienku • definujeme spájaciu podmienku. Syntax v SQL92 (v SQL89 sa definuje ináč): SELECT * FROM R JOIN S ON A<B; Jazyk SQL
Spojenie cez vymenované stĺpce • rozširuje možnosti prirodzeného spojenia. Pokiaľ máme tabuľku U so stĺpcami (A,B,C) a tabuľku V so stĺpcami (E,A,B) a požadujeme spojenie cez stĺpce (A,B), môžeme napísať: SELECT * FROM U JOIN V USING (A, B); Jazyk SQL
Vnútorné spojenie • predchádzajúce spojenie môžeme nazvať aj ako vnútorné spojenie a napísať ako • INNERJOIN alebo • INNERNATURALJOIN. Jazyk SQL
Vonkajšie spojenie • slúži k pridávaniu niektorých riadkov, ktoré sa ničím nespojili, do výsledku. • Označujeme ako OUTERJOIN alebo NATURALOUTERJOIN. • Riadky sa pridávajú podľa označenia LEFT, RIGHT alebo FULL a to buď z ľavého, pravého alebo obidvoch operátorov. Napr.: SELECT * FROM U NATURALLEFTOUTER JOIN V; Jazyk SQL
Spojenie zjednotením • každý riadok z ľavého alebo pravého operátora je vo výsledku doplnený hodnotami NULL, a to buď sprava alebo zľava. SELECT * FROM U UNIONJOIN V; Jazyk SQL
Integritné obmedzenia • CHECK - kontroluje hodnoty komponentov riadku tabuľky. Môže byť lokálny pre daný stĺpec alebo globálny pre všetky stĺpce jednej tabuľky (rozšírenie SQL92). Akceptuje riadok pokiaľ podmienka nadobudne hodnoty TRUE alebo UNKNOWN. • DEFAULT - kontroluje zadanie implicitnej hodnoty pri vkladaní riadku do tabuľky. • FOREIGN alebo PRIMARYKEY - kontroluje zadanie referenčnej integrity pomocou explicitne definovaných cudzích alebo primárnych kľúčov. Jazyk SQL
Referenčná integrita • určuje logické vzťahy medzi dvoma tabuľkami, pričom jedna z nich je vždy hlavná a druhá vedľajšia. • stĺpec ktorý je viazaný vo vedľajšej (závislej) tabuľke označujeme ako cudzí kľúč (FOREIGNKEY) a • z hlavnej tabuľky ako primárny kľúč (PRIMARYKEY). • Zároveň je možné aj definovanie reakcie systému na narušenie referenčnej integrity a to aj pri aktualizačných operáciách (INSERT, DELETE, UPDATE). Jazyk SQL
Referenčná integrita • Pre INSERT môžeme určiť obmedzenie vloženia riadku do závislej tabuľky. • Pre operáciu DELETE (ekvivalentne aj pre UPDATE): • kaskádové odstránenie riadku • náhrada cudzieho kľúča prázdnou hodnotou • nahradenie cudzieho kľúča implicitnou hodnotou • odstránenie riadku z hlavnej tabuľky z upozornením Jazyk SQL
Kaskádové odstránenie riadku • ONDELETECASCADE pri odstránení riadku z hlavnej tabuľky dôjde k automatickému odstráneniu súvisiacich riadkov aj zo závislých tabuliek; Jazyk SQL
Náhrada kľúča prázdnou hodnotou • SETNULL pri odstraňovaní riadkov v závislej tabuľke, ktoré odkazujú na vymazávaný riadok hlavnej tabuľky, sa hodnota cudzieho kľúča nahradí prázdnou hodnotou; Jazyk SQL
Nahradenie implicitnou hodnotou • SETDEFAULT pri odstraňovaní riadkov v závislej tabuľke, ktoré odkazujú na vymazávaný riadok hlavnej tabuľky, sa hodnota cudzieho kľúča nahradí vopred definovanou hodnotou; Jazyk SQL
Odstránenie riadku • odstránenie riadku z hlavnej tabuľky z upozornením (NO ACTION) operácia vymazania sa nevykoná, pokiaľ pre primárny kľúč odstraňovaného riadku hlavnej tabuľky existuje ekvivalentná hodnota cudzieho kľúča v závislej tabuľke. Niektoré systémy majú túto vlastnosť nastavenú implicitne. Jazyk SQL
Práca s pohľadmi • Pohľady chápeme ako virtuálne (neexistujúce) tabuľky. Sú zamerané hlavne pre potreby užívateľa na definovanie dopytov (údaje sa nedajú meniť), môžu však slúžiť napríklad aj na aktualizáciu údajov a pod. • Pre administrátora sa dajú s výhodou použiť na selektívne určenie ktorá skupina užívateľov má k čomu prístup Jazyk SQL
Práca s pohľadmi ... • Vytvoriť pohľad môžeme pomocou CREATE VIEW, pričom samozrejme môžeme použiť rezervované slová a voľby popísané v predchádzajúcich bodoch. • Syntax: CREATEVIEW meno_pohľadu [(mená_stĺpcov)] AS výraz_dopytu [WITH {CASCADE | LOCAL} CHECKOPTION] Jazyk SQL
Práca s pohľadmi • za „výraz_dopytu“ dosadíme požadovaný dopyt (napr. SELECT názov_stĺpca1, názov_stĺpca2...- FROM názov_tabuľky - GROUP BY...) doplnený o možné agregačné funkcie. • Pokiaľ uvedieme klauzulu WITHCHECKOPTION, musí byť pohľad aktualizovateľný. Zaisťuje dodržiavanie kontroly podmienok v definičnej časti pohľadu pri vykonávaní operácií INSERT a UPDATE. Vymazanie pohľadu je možné pomocou príkazu DROPVIEW, za ktorým uvedieme názov pohľadu. Jazyk SQL
Ochrana údajov • Každý systém má naprogramované rôzne možnosti ochrany a definovania prístupových práv pre jednotlivých užívateľov (alebo skupiny), čo vyplynulo hlavne z nutnosti viacpoužívateľského prístupu do databáz. SQL definuje ochranu pre nasledovné akcie: • výber údajov (SELECT), • ich modifikácia (INSERT, UPDATE, DELETE), • odkazovanie (REFERENCES) a • použitie. Jazyk SQL
Ochrana údajov - syntax GRANT {ALL PRIVILEGES | zoznam_privilégií} ON objekt TO {PUBLIC user_identif1[,user_identif2]...} [WITH GRAND OPTION] zoznam_privilégií:=privilegium[,privilegium]... privilegium:=SELECT | DELETE | INSERT [(meno_stlpca1[,meno_stlpca2]...)] | UPDATE [(meno_stlpca1[,meno_stlpca2]...)] | REFERENCES [(meno_stlpca1[,meno_stlpca2]...)] | USAGE Jazyk SQL
Ochrana údajov - popis • Klauzula WITHGRANDOPTION umožňuje prideľovanie prístupových práv aj ďalším užívateľom, okrem tých, ktorý nie sú vymenovaný za klauzulou TO. Je veľmi vhodná vtedy, keď sa požaduje prístup k jednej tabuľke rôznym skupinám užívateľov. • Samozrejme, stupeň privilégií definujeme na najnižšej možnej úrovni, aby nedošlo k úniku informácií. Jazyk SQL
Budúcnosť jazyka SQL Hlavné smery rozšírenia, ktoré prináša SQL, sú nasledovné: • relačné • procedurálne • objektové Jazyk SQL
Relačné rozšírenia • pridanie ďalších predikátov a hlavne triggerov (procedúry, ktoré sú spustené pri výskytu určenej udalosti), ktoré databázové firmy implementovali každá vlastným spôsobom a teda rozdielne. • Jedná sa o dlhodobý problém, lebo mali byť už včlenené v norme SQL. Jazyk SQL
Procedurálne rozšírenia • rozšírenie o uloženéprocedúry, čo sú príkazy SQL preložené, optimalizované a uložené na databázovom servery. • Ich používanie výrazne zlepšuje dobu odozvy a to hlavne u tých, ktoré vyžadujú komplikovanú optimalizáciu databázovým serverom. Jazyk SQL
Objektové rozšírenia • rozšírenie o objektovo - orientované rysy jazyka - abstraktné typy údajov, dedenie, polymorfizmus a pod. • Pri rozšírení sa postupuje na základe Manifestu objektovo - orientovaných databázových systémov. Jazyk SQL