www.e-beroun.cz
SQL – Structured Query Language
Referenční příručka Zdeněk Šerý www.e-beroun.cz
www.e-beroun.cz OBSAH
1. 2.
Základní informace……………………………………………………………………………...2 SQL…………………………………………………………………………………………….17 2.1. Proč používat SQL………………………………………………………………………. 17 2.1.1. Relační operátory………………………………………………………………….. 17 2.1.2. Rekurze …………………………………………………………………………….21 2.1.3. Propojení (relace) ……………………………………………………………….. 24 2.1.4. Prvky SQL …………………………………………………………………………26 2.2. Definice dat……………………………………………………………………………… 30 2.2.1. ALTER TABLE…………………………………………………………………… 32 2.2.2. CREATE INDEX………………………………………………………………….. 34 2.2.3. CREATE TABLE…………………………………………………………………. 36 2.2.4. CREATE VIEW……………………………………………………………………38 2.2.5. DROP……………………………………………………………………………… 39 2.3. Editace dat………………………………………………………………………………..41 2.3.1. DELETE…………………………………………………………………………… 42 2.3.2. INSERT……………………………………………………………………………. 44 2.3.3. UPDATE…………………………………………………………………………... 46 2.4. Dotazování dat…………………………………………………………………………... 49 2.4.1. SELECT…………………………………………………………………………… 50 2.5. Řízení transakcí…………………………………………………………………………..56 2.5.1. COMMIT………………………………………………………………………….. 56 2.5.2. ROLLBACK………………………………………………………………………. 58 2.5.3. SAVEPOINT……………………………………………………………………….60 2.6. Administrace dat………………………………………………………………………… 61 2.6.1. ALTER PASSWORD……………………………………………………………... 61 2.6.2. GRANT……………………………………………………………………………. 66 2.6.3. REVOKE …………………………………………………………………………..68
www.e-beroun.cz
1
www.e-beroun.cz
1. Základní informace Úvodem bych rád poznamenal, že tato kniha není určena pro specifický okruh lidí jako jsou pokročilí programátoři. Jejím úkolem je být pomocníkem každému, kdo používá nebo teprve chce používat SQL na LAN, WAN, internetu či intranetu. V rukou máte vynikajícího rádce pro přechod z databází Foxpro, Dbase, Microsoft Access a jim podobných na databázové servery. Zkušení programátoři a databázový nadšenci, kterým tato příručka nebude stačiti mohou detailní nebo specifické informace získat z materiálů dodaných k databázovému serveru. Při psaní této knihy jsem se snažil sladit obsah předkládané problematiky se stávajícím standardem SQL a SQL Anywhere professional. Pro většinu srovnávacích příkladů jsem použil databázi Foxpro 2.5, jelikož je tato databáze jednoznačně nejrozšířenější. Syntaktický diagram bude v grafické podobě ukazovat definici vysvětlovaného výrazu :
2. SQL SQL (Structured Query Language – strukturovaný dotazovací jazyk) je používán na řízení relačních databází. Jeho počátek bychom nalezli v roce 1970 v kalifornii v IBM Research Laboratory v San Jose. SQL je určen pro programovací jazyk neboť neobsahuje formátovací příkazy pro reporty ani pro výstup na interaktivní konzoli. SQL je neprocedurální – což znamená, že váš požadavek určuje co chcete dostat zpět za data, ale ne jak je získat. Řada z vás se jistě podiví proč používat databázový server, když stávající databáze Foxpro nebo obdobná jiná je zcela vyhovující. Použiji celkem vyhovující analogii s používáním automobilu. Pokud jste dosud neseděli v jaguáru tak nevíte jaká vlastně může jízda být a nešvary z provozu stávajícího trabanta považujete za běžné. Jako každá analogie i tato trochu pokulhává za skutečností v tom, že nepostihuje výhodu chráněného současného víceuživatelského přístupu. Databáze Foxpro vlastně není databází, ale pouze databázovou tabulkou.
2
www.e-beroun.cz
www.e-beroun.cz Databáze je soubor dat spravovaný databázovým serverem. Je realizován jako jeden, dva, vyjímečně několik málo souborů což je odvislé od verze a druhu databázového serveru. Obr. 3.I.
Kategorie SQL příkazů – SQL obsahuje řadu příkazů pro operace seskupené do těchto kategorií : a) Definice dat – vytváření databázových objektů jako jsou databáze, tabulky, indexy nebo pohledy Databáze obsahuje jednu nebo více tabulek, a ty obsahují sloupce a řádky :
www.e-beroun.cz
3
www.e-beroun.cz
ALTER TABLE CREATE INDEX CREATE TABLE CREATE VIEW DROP b) Editace dat
– aktualizace, přidávání mazání dat v databázi
DELETE INSERT UPDATE c) Dotazování dat
– dotazy na data v databázi
SELECT d) Řízení transakcí – zajišťování integrity, když jsou prováděny změny dat v databázi
COMMIT ROLLBACK SAVEPOINT e) Administrace dat – řízení přístupu a ochrany databáze
ALTER PASSWORD GRANT REVOKE 2.1. Proč používat SQL Seznam SQL příkazů :
Dovolí uživateli změnit heslo Mění popis tabulky Kontroluje integritu databáze Nahradí nebo přidá komentář do popisu tabulky, pohledu nebo sloupce v systémovém katalogu Zakončí logickou jednotku práce a přenese do databáze vámi provedené změCOMMIT ny Vytváří index k tabulce CREATE INDEX CREATE SYNONYM Vytváří alternativní jméno pro tabulku nebo pohled Definuje tabulku CREATE TABLE Definuje pohled na jednu nebo více tabulek nebo pohledů CREATE VIEW Maže jeden nebo více sloupců v tabulce DELETE Vyjme objekt ze systémového katalogu DROP Přidělí databázovou autorizaci nebo práva na tabulky a pohledy GRANT Vloží jeden nebo více sloupců do existující tabulky INSERT Přidá nebo změní popisku v katalogu popisek LABEL Vyjme databázovou autorizaci nebo privilegia z tabulek nebo pohledů REVOKE Zakončí logickou jednotku práce a vrátí zpět změny provedené od poslední ROLLBACK transakce Dotazuje se na data v tabulkách nebo pohledech SELECT Přiřadí (spojí) kontrolní bod k transakci SAVEPOINT Spojí výsledky ze dvou nebo více SELECTů UNION Nastaví sloupce v tabulkách nebo pohledech současnými hodnotami UPDATE UPDATE STATISTIC Aktualizuje statistiky pro index dané tabulky ALTER PASSWORD ALTER TABLE CHECK DATABASE COMMENT ON
4
www.e-beroun.cz
www.e-beroun.cz SQL je velmi silný nástroj pro práci s daty – viz předešlých 5 bodů. Je snadný na používání a to velmi. Nyní vám představím 3 hlavní důvody proč používat databázový server : 1) z více aplikací a z více počítačů najednou, a to jak pro zápis tak pro čtení 2) množství dat svojí kvantitou nebo strukturou je již tak velké, že původní databázový prostředek (Foxpro) již řeší tento stav s problémy nebo vůbec – sklady, fakturace … 3) bezpečnost a integrita dat je natolik důležitá – což je vlastně vždy, i když si to uživatel uvědomí až v případě jejich ztráty nebo zničení - , že databázový server je nutností. ad 1. chráněný síťový přístup ke sdíleným datům – tento přístup k datům je již aplikační samozřejmostí. Uveďme si příklad : nadstavbový software pro management vytvořený v aplikaci MS Excel – uživatel 1 přistupuje k datům databázového serveru k databázi Protect k tabulkám – faktury, fakturydetail, uhrady, odberatele ; aplikační software sklad – uživatel 2 z jiného počítače a z jiného místa ve stejnou dobu ke stejné databázi k tabulkám hlavnisklad, mezisklad, zbozi, odberatele; uživatel 3 ze vzdálené sítě – obchodní ředitel napojený přes svého laptopa a internet k databázovému serveru ke stejné databázi k tabulce odberatele. Všichni tito uživatelé mohou díky databázovému serveru provádět jakékoliv operace s daty jim přístupnými. Jak vidíte na obrázku 3.I. lze s výhodou podpory produktu NetImpact Dynamo komunikovat s dnes velmi atraktivní a perspektivní oblastí s internetem. Vyvíjení aplikací pro internet je již nutností a databázový server na internetu je řešení pro větší množství dat – např. pro prezentaci zboží a služeb určité firmy, jenž tímto způsobem nabízí k obchodování po internetu. Složitost a hlavně počet uživatelů je ve skutečnosti mnohem větší a to je hlavní důvod proč používat SQL. Jak již z názvu vyplívá je SQL standard a proto je nezávislý na použitém prostředku pro zpřístupnění dat. Jak aplikace MS Excel tak nezávislé programovací prostředky Delphi, Centura atd. tak vývojové prostředí různých databázových firem a řada dalších prostředků standard SQL podporují a lze všemi těmito prostředky nezávisle na sobě či databázovém serveru přistupovat k databázím tímto serverem spravovaným. Ve své podstatě je SQL jednoduchý programovací jazyk, kterým lze přistupovat k jakékoliv relační databázi a lze jej použít i v interaktivním režimu z konzolové aplikace, která je u Foxpro RQBE nástroj a u Anywhere je to ISQL. Jsme-li připojeni k jakékoliv databázi přes ODBC lze jako konzolovou aplikaci použít MSQRY32. ad. 2. Databáze stylu Foxpro nejsou navrženy pro větší počet vět, proto jsou také nazývány právem lokální. Při nárůstu velikosti těchto databází nad určitou hranici dochází k výraznému snížení rychlosti těchto databází nebo dokonce je tato velikost limitní a nesmí býti překročena. A zde nastupuje nutnost použít databázi vytvořenou pro práci s velkým množstvím dat. ad. 3. Bezpečnost a integrita dat je zajišťována na několika úrovních. Už samotné použití databázového serveru snižuje programovou náročnost vlastní aplikace, která musí zajistit operace a funkce zajišťované databázovým serverem. DB server je velmi dobře napsaná aplikace, která je také odladěná a vyzkoušená což je další faktor zvýšení bezpečnosti dat. Jak užívat SQL : SQL můžete používat dvěma způsoby : 1) Interaktivně skrze zprostředkovatelský program (interaktivní konzole) 2) Pomocí programovacího jazyka C, Delphi a jiných, kterými vytvoříte klientskou aplikaci, tiskovou sestavu nebo např. eventuelně service na Windows NT server.
www.e-beroun.cz
5
www.e-beroun.cz Kdo používá SQL : 1) Koncoví uživatelé 2) Databázoví programátoři 3) Databázoví správci S rozdílem v přidělených právech počínaje uživateli konče správci. K datům spravovaným databázovým serverem nelze jinak přistoupit než přes tento databázový server (pokud je spuštěn) a při přístupu k databázovému souboru jinými prostředky a jinými způsoby je nemožný – jsou vracena hlášení „přístup odepřen“,“narušeno sdílení“,“Soubor nemůže být otevřen“ atd. což u lokáních databází neplatí. Pokud tyto databáze umístíme na Souborový server Novell, pak můžeme např. u Foxpro použít Novell modul pro řízení transakcí, ale databázový soubor není na tomto serveru (ani na jiném) spravován, udržován ani chráněn. Tabulky Paradoxu si vytvářejí na serveru zámky (soubory LCK), ale při pádu klientské stanice zůstane tento zámek na serveru a indikuje uzamčená data. V těchto příkladech bych mohl pokračovat ještě dosti dlouho a je jasné, že se tyto lokální databáze snaží všemi prostředky napodobovat databázové servery, ale pokud to budou činit pouze lokálními prostředky pak bude účinek nedokonalý a pokud to budou prostředky serverové pak se nejedná o nic jiného než o databázový server. Databázové servery mají řadu utilit pro zachování dat jako např. zálohování, obnovování dat z log. souborů – log. soubory jsou soubory změn provedené v dané databázi od zapnutí logu či poslední obnovy, zrcadlení databází, konverze databáze do různých formátů a naopak. Pro přístup k databázi poskytují ochranu pomocí jména a hesla připojujícího se uživatele a následná – získaná – práva jsou na úrovni aplikace – databázového serveru. Tyto práva spolu s právy na síťovém operačním systému tvoří téměř nepřekonatelnou ochranu dat. Bohužel se někteří programátoři snaží nahrazovat ochranu na úrovni databázového serveru vlastními programátorskými dialogy s vlastním rádoby dobře promyšleným systémem práv. SQL umožňuje uživateli vybudovat komplex dotazů. To je umožněno pomocí : relační operátory rekurze propojení (joins)
2.1.1. Relační operátory – ( >,<,=,>=,<>,!= ) dovolují uživateli vyjádřit prohle-
dávací podmínku pro dotaz. Např. jestliže tabulka ZAMEST obsahuje zaměstnanecké informace (položky = sloupce jmeno, adresa, telefon, vek, plat, oddeleni) pak následující dva dotazy mohou být zodpovězeny pomocí relačních operátorů. příklady : Dej mi (vyber) telefonní číslo slečny Hájkové : SELECT JMENO, TELEFON FROM ZAMEST WHERE JMENO=’Hájková’ Dej mi seznam všech zaměstnanců, kteří mají plat větší než 15000 :
SELECT JMENO, PLAT FROM ZAMEST WHERE PLAT>15000 2.1.2. Rekurze – v praxi znamená, že výstup jednoho SQL dotazu (poddota-
zu) je použit jako vstup do dotazu jiného. Tato technika je nazývána zahnízděním a je používána i v klasických programovacích jazycích. Hlavní select – dotaz – a subselect – poddotaz – se mohou odkazovat na stejnou tabulku. Použití poddotazu je v některých logických podmínkách pro výběr nevyhnutelné, ale musíte být opatrní při konstrukci tohoto dotazu. Poddotaz značně zpomaluje činnost dotazu neboť
6
www.e-beroun.cz
www.e-beroun.cz zu. Poddotaz značně zpomaluje činnost dotazu neboť z matematického hlediska je počet zpracovávaných vět roven součinu počtu vět tabulky z prvního dotazu a tabulky z poddotazu. Příklad : Vyber jmeno z tabulky Zamest kde plat je větší nebo roven 12500 a musí mít samostatný telefon SELECT JMENO AS JMENO1 FROM ZAMEST WHERE PLAT>=12500 AND NOT TELEFON IN (SELECT TELEFON, JMENO FROM ZAMEST WHERE JMENO<>JMENO1) Druhý SELECT uvedený v příkladu je volán jako poddotaz a celý výraz by mohl být vyřešen mnohem pohodlněji, ale pouze z toho důvodu, že se jedná o poddotaz na stejnou tabulku. Tento postup se používá pokud nelze stejný problém vyřešit pomocí propojení neboť tento způsob je značně pomalejší.
2.1.3. Propojení (joins) – slouží k přinesení dat (řádků) z rozdílných tabulek
a spojení do řádku jednoho. Tyto propojení lze získat v poměru 1:1, 1:M, N:M, M:1. To v praxi znamená : •
pro jeden řádek (větu) tabulky první existuje pouze jeden řádek v tabulce druhé, např. pro každou fakturu v tabulce faktur existuje pouze jeden zaměstnanec, který ji vystavil v tabulce Zamest SELECT FAKTURY.CFAKT, ZAMEST.JMENO FROM FAKTURY, ZAMEST WHERE FAKTURY.KODZAM =ZAMEST.KODZAM •
pro jeden řádek (větu) tabulky první existuje 0 až bůhvíkolik řádků v tabulce druhé, např. pro každou fakturu v tabulce faktur existuje 0 až hodně úhrad v tabulce Uhrady (faktura nebyla uhrazena, nebo byla uhrazena několika platbami atd.) SELECT FAKTURY.CFAKT FROM FAKTURY, UHRADY WHERE UHRADY.CFAKT = FAKTURY.CFAKT -
pro několik řádek (vět) tabulky první existuje 0 až bůhvíkolik řádků v tabulce druhé – platných podle propojovacího výrazu. Toto propojení je dosti specifické a znamená, že v první tabulce jsou věty se stejnými daty, která jsou na výstupu a v tabulce druhé jsou věty k nim přiřazené dle propojení. Výsledkem může a nemusí být množina vět s duplicitními daty. Problematika propojení je rozsáhlejší a pokud začínáte s SQL jistě mnohokrát nastavíte špatně propojení mezi databázovými objekty. S propojením úzce souvisí problematika indexů a jedinečnosti, což probereme v oddíle vysvětlujícím syntaxi příkazů pro práci s INDEXI. Příklad : První tabulka
www.e-beroun.cz
7
www.e-beroun.cz
Druhá tabulka
Příklad : SELECT NAME, ORDERNO FROM CUSTOMER, ORDERS WHERE CUSTOMER.CUSTNO = ORDERS.CUSTNO AND SALES REP = ‘Tom’ Výsledek předešlého selectu :
8
www.e-beroun.cz
www.e-beroun.cz
Typy propojení : •
Rovné - příklad : SELECT NAME, ORDERNO FROM CUSTOMER, ORDERS WHERE CUSTOMER.CUSTNO = ORDERS.CUSTNO • Vnější – příklad : SELECT t1.col1, t2.col1, t1.col2, t2.col2 FROM t1, t2 WHERE t1.col1 = t2.col1 (+) AND t1.col2 = t2.col2 (+) • Vlastní – příklad : SELECT A.ORDERNO, A.ORDERDATE FROM ORDERS A, ORDERS B WHERE A.ORDERDATE = B.ORDERDATE AND A.ORDERDATE <> B.ORDERNO • Nerovné – příklad : SELECT NAME, ORDERNO, ORDERDATE FROM CUSTOMER, ORDERS WHERE CUSTOMER.CUSTNO = ORDERS.CUSTNO AND ORDERDATE BETWEEN 01-JUL-94 AND 30-SEP-94;
2.1.4. Prvky SQL Toto jsou základní prvky používané v SQL : -
Jména (názvy) Datové typy Konstanty Systémová klíčová slova Funkce Výrazy Přísudky Vyhledávací výrazy Svázané proměnné
Názvy – jména jsou používána k identifikaci SQL objektů jako jsou jména uživatelů, tabulek, sloupců, indexů atd. Tyto identifikátory mohou být ordinální nebo oddělovací. Ordinální identifikátor začíná písmenem nebo speciálním znakem (#,@ nebo $) a obsahuje písmena, číslice a podtržítko. Identifikátory mají 2 délky : krátké a dlouhé. Krátké mají délku max.8 a dlouhé max. 18 znaků. Příklady názvů : CHYBY SCHRANKA_Z_WGPO :KONTROLNISOUCET $54844 “JMENO A ID” #UZIVATEL :9
www.e-beroun.cz
9
www.e-beroun.cz Názvy jsou dlouhé nebo krátké identifikátory nebo identifikátory kvalifikující jiné identifikátory. Následující objekty mají jména. Autorizační identifikace – např. tabulka SKLAD vytvořená uživatelem NOVOTNY má explicitně jméno NOVOTNY.SKLAD. Příklad autorizační identifikace je NOVOTNY a také např. SYSADM. Název sloupce -
Název korelační – dlouhý identifikátor popisující tabulku nebo pohled s příkazem Název databáze – krátký identifikátor označující databázi Název indexu – kvalifikující nebo nekvalifikující dlouhý identifikátor
Heslo – dlouhý identifikátor Jméno svázané proměnné – tomuto jménu vždy musí předcházet dvojtečka Název příkazu – dlouhý identifikátor Název synonymu – dlouhý identifikátor označující tabulku nebo pohled Název tabulky – dlouhý identifikátor
Název pohledu – dlouhý identifikátor
Datové typy – obecné datové typy používané na ukládání dat jsou : 10
www.e-beroun.cz
www.e-beroun.cz - Znakové - Číselné - Datumové a časové Tyto datové typy jsou určeny délkou dat – tak jak jsou uloženy v databázi a zobrazovacím formátem – tak jak se zobrazují. Null hodnota indikuje absenci dat. Nějaké datové typy mohou obsahovat Null hodnotu. Null hodnota není ekvivalentní 0 nebo mezeře. Na tuto hodnotu si musíte dát pozor ve vyhledávacích výrazech neboť je rovna jakémukoliv výrazu a pokud ji nechceme musíme použít např. NOT NULL. Znakový datový typ – řetězec znaků (písmen, číslic, speciálních znaků) CHAR – pro tento typ musí být specifikována délka, která nemůže být větší než 254 a je pevně dodržována. U typu VARCHAR může být délka menší než deklarovaná. LONGVARCHAR – tento typ může být delší než 254 znaků a pro detailní definici raději nahlédněte do manuálu vámi používaného DB serveru. Numerický datový typ – DECIMAL – rozsah hodnot -999999999999999 až +999999999999999 příklad DECIMAL (8,2) INTEGER – rozsah hodnot -2147483648 až +2147483647 příklad INT SMALLINT – rozsah hodnot -32768 až +32767 příklad SMALLINT NUMBER – rozsah hodnot až 22 číslic příklad NUMBER DOUBLE PRECISION – dvojnásobná přesnost čísla s plovoucí desetinnou čárkou (22 až 53) FLOAT – číslo s plovoucí desetinnou čárkou s přesností 1 až 21 příklad FLOAT (9) REAL – reálné číslo Poznámka : Pro přesné vymezení definicí těchto a i následujících typů musíte zkonzultovat s příslušným manuálem vašeho serveru. Date/Time datový typ – DATETIME – typ pro data s datovým i časovým údajem DATE - typ pro data s datovým údajem TIME - typ pro data s časovým údajem Konstanty – řetězcové konstanty musíte uzavřít do uvozovek. Časové a datumové údaje jsou většinou ve formátu čísel oddělených pomlčkou nebo tečkou. Např. 10-27-98. Číselné konstanty mohou být v semilogaritmickém tvaru –1,24E4. Systémová klíčová slova – jsou vázány na typ a verzi databázového serveru a proto zde nemohou být probírány detailně. Typický představitel je NULL. Dále to mohou být tato slova : USER, ROWID, SYSTIME, SYSDATE atd. Na výběr hodnot z vět databáze, které obsahují nulové hodnoty můžeme použít tuto klauzuli :
www.e-beroun.cz
11
www.e-beroun.cz WHERE jméno_sloupce IS NULL Výrazy – Schéma výrazu :
Je-li ve výrazu položka s nulovou hodnotou (Null), potom vyhodnocení výrazu je null (neznámý nebo false). Vyhledávací výrazy – WHERE výraz může být použit v těchto SQL příkazech : SELECT DELETE UPDATE Vyhledávací výraz obsahuje jeden nebo více přísudků spojených logickými operátory OR, AND a NOT.
Předpokládejme, že P a Q jsou přísudky. První dva sloupce jsou kombinace hodnot, kterých mohou P a Q nabýt. Následné sloupce jsou hodnoty výrazů uvedených v záhlaví.
12
www.e-beroun.cz
www.e-beroun.cz
Vzhledem k předešlému celkem dosti suchému, ale nutnému výkladu vás musím upozornit, že výraznější změna nastane až při výkladu jednotlivých SQL příkazů. Pokud jste vydrželi až sem, pak jistě vydržíte i následující kapitoly. Pro oživení výuky můžete s klidným svědomým následující výklad přeskočit až ke kapitole 3.2, neboť jenom trochu složitější úkol vás donutí vrátit se zpět na tyto stránky a dobrat tyto vynechané kapitoly. Velmi častá chyba je použití vyhledávacího výrazu na sloupce s některými nulovými hodnotami. Hodnota Null není ekvivalentní s “” nebo 0 a proto musí klausule WHERE vypadat takto WHERE jméno-sloupce IS NULL. Přísudky – přísudky ve WHERE nebo HAVING výrazu specifikují vyhledávací výraz, který je true, false nebo neznámý (unknown) se zřetelem na daný řádek nebo skupinu řádků v tabulce. Přísudky používají operátory, výrazy a konstanty na specifikování vyhodnocovaného výrazu. Následné typy přísudků jsou popsány v této sekci : 9 9 9 9 9 9
Relační BETWEEN NULL EXISTS LIKE IN
www.e-beroun.cz
13
www.e-beroun.cz
Relační přísudky : Máme dva typy relačních podmínek (přísudků) : 9 Srovnávací 9 Množstevní
Srovnávací :
Příklad : SELECT JMENO FROM ZAKAZNICI WHERE ZAKAZNIKID=93571 Množstevní : Používá poddotaz nebo podvýběr (subselect, subquery). Příklad : WHERE X < ANY (SELECT Y) SELECT * FROM EMPSAL WHERE SALARY != (SELECT AVG(SALARY) FROM EMPSAL); SELECT * FROM EMPSAL WHERE SALARY <> (SELECT AVG(SALARY) FROM EMPSAL); SELECT * FROM EMPSAL WHERE SALARY > (SELECT AVG(SALARY) FROM EMPSAL); SELECT * FROM EMPSAL WHERE SALARY < (SELECT AVG(SALARY) FROM EMPSAL); 14
www.e-beroun.cz
www.e-beroun.cz SELECT * FROM EMPSAL WHERE SALARY >= ANY(SELECT SALARY FROM EMPSAL); Přísudek BETWEEN : srovnává hodnoty s rozmezím hodnot
Příklad : SELECT * FROM EMPSAL WHERE SALARY BETWEEN 30000 AND 60000 NULL přísudek : testuje null hodnotu
Příklad : SELECT * FROM EMP WHERE DEPTNO IS NULL EXISTS přísudek : testuje existenci nějakého řádku v tabulce
Příklad : SELECT * FROM EMP WHERE EXISTS (SELECT * FROM EMPSAL WHERE SALARY= :1) LIKE přísudek : prohledává v řetězcích specifickou sekvenci znaků
Znak podtržítko “_” je zástupný znak pro jeden znak Znak procenta “%” je zástupný znak pro více znaků Příklad : SELECT * FROM EMP WHERE LNAME LIKE ‚%son%‘;
www.e-beroun.cz
15
www.e-beroun.cz SELECT * FROM EMP WHERE JOB LIKE ‚M_‘; SELECT * FROM EMP WHERE JOB LIKE ‚A24\%‘; SELECT * FROM EMP WHERE JOB LIKE ‚A24\%%‘; IN přísudek : porovnává hodnoty ve výběru hodnot
Příklad : SELECT * FROM EMP WHERE DEPTNO IN (2500,2600,2700); SELECT * FROM EMP WHERE EMPNO NOT IN (SELECT EMPNO FROM EMPSAL WHERE SALARY< 40000); SELECT * FROM EMP WHERE @LEFT (LNAME, 1) IN (‚J‘, ‚M‘, ‚D‘); SELECT * FROM EMP WHERE LNAME NOT IN (:1,:2,’Jones’) Funkce : funkce vrací hodnotu, která je vyhodnocením funkce s argumentem. Členění funkcí je odvislé od typu použitého databázového serveru. Může vypadat např. takto : 9 9 9 9 9 9 9
Agregační funkce Řetězcové funkce Datumové a časové funkce Logické funkce Speciální funkce Matematické funkce Finanční funkce
Podselect : vyhledávací podmínka, která je zahnízděná v SELECT příkazu (jako volaný podselect). Příklad : SELECT ORDERNO, ORDERDATE FROM ORDERS WHERE ORDER DATE = (SELECT ORDERDATE FROM ORDERS WHERE CUSTNO = 2) SELECT * FROM EMPSAL WHERE
16
www.e-beroun.cz
www.e-beroun.cz SALARY (SELECT AVG (SALARY) FROM EMPSAL) Svázané proměnné : svázaná (propojená) proměnná je předaná hodnota asociovaná s SQL příkazem. Mohou být použity v : 9 WHERE klauzuli 9 VALUESS klauzuli v INSERT příkazu 9 SET klauzuli v UPDATE příkazu Svázané proměnné musí začínat dvojtečkou “:”.
2.2. Definice dat 2.2.1. ALTER TABLE
Tento příkaz se používá na následující funkce : • •
Drop, Add a Modify – pro sloupce Rename – pro sloupce a tabulky
Add – přidá sloupec do tabulky Drop – vyjme sloupec z tabulky Modify – mění atributy pro sloupec Rename – přejmenuje sloupec nebo tabulku Pro používání tohoto příkazu musí mít uživatel privilegia ALTER. Příklady : přidá nový sloupec JOB, který obsahuje max. 15 znaků do tabulky EMP :
www.e-beroun.cz
17
www.e-beroun.cz ALTER TABLE EMP ADD JOB VARCHAR(15); Sníží velikost sloupce JOB na 40 znaků a nastaví NOT NULL podmínku : ALTER TABLE EMP MODIFY JOB VARCHAR(40) NOT NULL; Vyjme sloupec JOB a HIREDATE : ALTER TABLE EMP DROP JOB, HIREDATE; Změní jméno tabulky EMP na EMPLOYEE : ALTER TABLE EMP RENAME TABLE EMPLOYEE; Přidá NOT NULL atribut do sloupce HIREDATE : ALTER TABLE EMP MODIFY HIREDATE NOT NULL; Vyjme atribut NOT NULL : ALTER TABLE EMP MODIFY HIREDATE NULL;
2.2.2. CREATE INDEX
Tento příkaz vytváří index na jeden nebo více sloupců tabulky. Indexy optimalizují přenášení dat (vracení) bez nutnosti prohledávání celé tabulky. Pro metodiku obnovování statistik si prostudujte manuál vašeho databázového serveru. Může např. nastat případ, že vytvoříte prázdnou tabulku (empty) a index vytvořený na takové tabulce by mohl podle druhu použitého serveru vyžadovat ruční spuštění UPDATE STATISTIC.
18
www.e-beroun.cz
www.e-beroun.cz Jestliže vytváříte tabulku s primárním klíčem příkazem CREATE TABLE, musíte vytvořit jedinečný index na primárním klíčovaném sloupci. Příklady : Vytvoří index se jménem HIRE_IDX na sloupec HIREDATE : CREATE INDEX HIRE_IDX ON EMP (HIREDATE); Vytvoří spojený index složený z LNAME a FNAME: CREATE INDEX NAME_IDX ON EMP (LNAME, FNAME); Vytvoří sestupný index na EMP_IDX sloupci EMP tabulky se zakázáním duplicity čísel : CREATE UNIQUE INDEX EMP_IDX ON EMP (EMPNO DESC);
CREATE TABLE
Tento příkaz vytváří tabulku se specifikovanými sloupci. Musíte mít patřičná práva pro tuto operaci. Plně kvalifikované SQL jméno tabulky je : Autorizační-identif.tabulky-jméno
www.e-beroun.cz
19
www.e-beroun.cz Autorizační-id. – popis „stvořitele“ tabulky Jestliže vytvoříte tabulku bez specifikování autorizačního id. Je nadefinováno default autorizační id. Příklady : Vytvoří tabulku EMP a EMPSAL CREATE TABLE EMP (EMPNO INTEGER NOT NULL, LNAME VARCHAR(15), FNAME CHAR(10), DEPTNO SMALLINT, HIREDATE DATE, JOB VARCHAR (15)); CREATE TABLE EMPSAL (EMPNO INTEGER NOT NULL, SALARY DECIMAL(5,9,2), REVIEW LONGVARCHAR; Vytvoří tabulku, která dovoluje cizí klíč EMPNO v EMPSAL tabulce s odkazem EMPNO v EMP tabulce CREATE TABLE EMP (EMPNO INT NOT NULL, LNAME VARCHAR(15), FNAME CHAR(10), DEPTNO SMALLINT, HIREDATE DATE, JOB VARCHAR (15) PRIMARY KEY (EMPNO)); CREATE UNIQUE INDEX EMP_IDX ON EMP (EMPNO); CREATE TABLE EMPSAL (EMPNO INTEGER, SALARY DECIMAL (9,2), REVIEW LONG VARCHAR, FOREIGN KEY (EMPNO) REFERENCES EMP ON DELETE CASCADE); Související příkazy : ALTER TABLE CREATE INDEX
20
www.e-beroun.cz
www.e-beroun.cz
2.2.3. CREATE VIEW
Tento příkaz vytváří pohled na jednu nebo více tabulek. Jeho použití úzce souvisí s příkazem GRANT (privilegia) : CREATE VIEW A_PAYAS SELECT FNAME, LNAME, SALARY FROM EMP, EMPSAL... V definici pohledu není možné použít UNION ani ORDER BY. Pohled jak již z názvu vyplívá je pouze abstrakce a má tím pádem příznak read-only (mimo následující výjimky) a proto nemůže provádět update dat (s jedinou výjimkou, kdy je pouze nad jednou tabulkou a nepoužívá funkce). CREATE VIEW PAY AS SELECT FNAME, LNAME, SALARY FROM EMP, EMPSAL WHERE EMP.EMPNO = EMPSAL.EMPNO; Následující příklad pohledu ukazuje možnost změny jmen sloupců v pohledu : CREATE VIEW STARTDATES (FIRST, LAST, DOH) AS SELECT FNAME, LNAME, HIREDATE FROM EMP; Následující pohled obsahuje asloupec, který je vypočítávaný (je na něm použita funkce) a to činí z tohoto pohledu pohled pouze pro čtení : CREATE VIEW DEPT_SAL (DEPT, TOTSAL) AS SELECT DEPTNO, SUM(SALARY) FROM EMP, EMPSAL WHERE EMP.EMPNO = EMPSAL.EMPNO GROUP BY DEPTNO; Tento pohled používá WITH CHECK OPTION klauzuli : CREATE VIEW WEEK2 AS SELECT * FROM ORDERS www.e-beroun.cz
21
www.e-beroun.cz WHERE ORDERDATE > = 05-JUL-94 WITH CHECK OPTION; Následující pohled je vytvořen ze dvou základních tabulek : CREATE VIEW MYVIEW (POSITION, ARG1,ADESCRIPT, ARG2, BDESCRIPT) AS SELECT TABLE1.POSITION, TABLE1.ARG1,A.DESCRIPT AS ADESCRIPT, TABLE1.ARG2, B.DESCRIPT AS BDESCRIPT FROM TABLE1, TABLE2 A, TABLE2 B WHERE TABLE1.ARG1=A.CODE AND TABLE1.ARG2=B.CODE; Související příkazy : CREATE TABLE SELECT
2.2.4. DROP
Tento příkaz vyjme z databáze specifický objekt. Pro tento příkaz musíte mít patřičná práva DBA. DROP TABLE – vyjme tabulku, všechna synonyma a indexy definované pro tuto tabulku a všechna práva přidělena k této tabulce. Systémové tabulky nemohou být vyjmuty. DROP INDEX – vyjme index. Systémové indexy nemohou být vyjmuty. DROP VIEW – vyjme pohled ze systémového katalogu. Všechny práva k tomuto pohledu jsou vyjmuta též. SYNONYM – vyjme synonym. Pohledy založené na tomto synonymu jsou také vyjmuta. PUBLIC – vyjme veřejné synonyma. Pohledy založené na tomto synonymu jsou také vyjmuta. Příklady : DROP INDEX CHKINDX; DROP VIEW MYEMP; DROP SYNONYM EASY_TO_REMEMBER; DROP PUBLIC SYNONYM EMP; DROP TABLE EMP; Související příkazy : CREATE INDEX; CREATE SYNONYM; CREATE TABLE; CREATE VIEW;
22
www.e-beroun.cz
www.e-beroun.cz
2.3. Editace dat 2.3.1. DELETE
Tento příkaz smaže jeden nebo více řádků z jedné tabulky nebo pohledu. WHERE – vyhledávací výraz – podmínka pro výběr řádků vybraných pro smazání. Příklady : Tento příkaz smaže zaměstnance číslo 1234 z tabulky EMP: DELETE FROM EMP WHERE EMPNO = 1234; Smaže zaměstnance v oddělení 2500 z tabulky EMPSAL: DELETE FROM EMPSAL WHERE EMPNO IN (SELECT EMPNO FROM EMP WHERE DEPTNO = 2500); Smaže všechny řádky z tabulky: DELETE FROM ORDERS; Související příkazy : CREATE TABLE SET CURSORNAME
2.3.2. INSERT
www.e-beroun.cz
23
www.e-beroun.cz
Tento příkaz vkládá řádky dat do tabulky nebo pohledu. Příklady : Tento SQL příkaz vloží jeden kompletní řádek do EMP tabulky : INSERT INTO EMP VALUES (1001,‘Carver’,‘Dan’,2500,01- APR-1994, ‘Manager’); Jestliže nejsou vkládány všechny sloupce musí být specifikována jejich jména : INSERT INTO EMP (EMPNO,LNAME,FNAME,HIREDATE) (1002,’Murphy’,’Bill’,17-APR-1994); Tento příkaz používá svázané proměnné na vložení více řádků dat : INSERT INTO EMP VALUES (:1,:2,:3,:4,:5,:6) 1004,Drape,Jane,2600,01-FEB-1994,Programator 1005,Foghorn,Ellen,2500,01-FEB-1994, Programator Použití poddotazu na odvození sloupců pro vkládání : CREATE TABLE RDEMP (RDNO INTEGER, RDLNAME CHAR(15), RDFNAME CHAR(10); INSERT INTO RDEMP (RDNO, RDLNAME, RDFNAME) SELECT EMPNO, LNAME,FNAME FROM EMP WHERE DEPTNO = 2500‘; Související příkazy :
24
www.e-beroun.cz
www.e-beroun.cz SELECT SET CURSORNAME
2.3.3. UPDATE
Tento příkaz aktualizuje hodnotu jednoho nebo více sloupců tabulek nebo základních pohledů podle výběrové podmínky. Na tuto operaci musíte mít patřičná privilegia (UPDATE). UPDATE příkaz aktualizuje tabulky s primárními i cizími klíči. Příklady : Aktualizuje tabulku employee s podmínkou EMPNO=1004. UPDATE EMPSAL SET SALARY = 45000 WHERE EMPNO= 1004; Zvýší plat všem zaměstnancům v kanceláři 2500 o 10%. UPDATE EMPSAL SET SALARY = SALARY*1.10 WHERE EMPNO IN (SELECT EMPNO FROM EMP WHERE DEPTNO = 2500); Aktualizuje všechny zaměstnání s písmenem P. Související příkazy : CREATE TABLE SELECT CURSORNAME
2.4. Dotazování dat 2.4.1. SELECT
www.e-beroun.cz
25
www.e-beroun.cz
Tento příkaz najde, získá a zobrazí data. SELECT příkaz je rekurzivní – může být zahnízděn v hlavním SELECTu. Zapouzdřený SELECT příkaz je volán jako poddotaz. Pro příkaz SELECT musíte mít přidělena privilegia SELECT. Vysvětlivky graf. znázornění : ALL Default hodnota pro SELECT je získání všech řádků. DISTINCT Potlačí duplicitní řádky. SELECT TAB1.*, COL1 FROM TAB1, TAB2; Vrátí všechny sloupce z tabulky TAB1 a jeden sloupec COL1 z tabulky TAB2. WHERE klauzule specifikuje výběrovou podmínku pro základní tabulky nebo pohledy. GROUP BY seskupuje výsledné řádky dotazu. 26
www.e-beroun.cz
www.e-beroun.cz Následující příklad najde celkový plat pro každé oddělení … a seskupí dle kanceláře. SELECT DEPTNO, SUM(SALARY), AVG(SALARY), COUNT(SALARY) FROM EMP, EMPSAL WHERE EMP.EMPNO = EMPSAL.EMPNO GROUP BY DEPTNO; HAVING dovoluje výběrovou podmínku pro skupinu řádků výsledků z GROUP BY nebo seskupuje sloupce. SELECT DEPTNO, SUM(SALARY), AVG(SALARY), COUNT(SALARY) FROM EMP, EMPSAL WHERE EMP.EMPNO = EMPSAL.EMPNO GROUP BY DEPTNO HAVING AVG(SALARY) > 30000; ORDER BY setřídí řádky ve výskedové tabulce. ORDER BY nelze použít v poddotazu. Příklady : Vybere všechny řádky z CUSTOMER tabulky. SELECT * FROM CUSTOMER; Vytvoří seznam zaměstnání. SELECT DISTINCT JOB FROM EMP; Zobrazí číslo zaměstnance a měsíční plat lidí, kteří mají roční plat větší než 40000. SELECT EMPNO,SALARY/12 FROM EMPSAL WHERE SALARY > 40000; Najde minimum a průměr platů v každém oddělení. SELECT DEPTNO, MIN(SALARY), AVG(SALARY) FROM EMP, EMPSAL WHERE EMP.EMPNO=EMPSAL.EMPNO GROUP BY DEPTNO; SELECT * FROM EMP WHERE JOB IN (SELECT JOB FROM EMP WHERE LNAME = ‚Drape‘); SELECT * FROM ORDERS X WHERE PRICE = (SELECT LISTPRICE FROM PARTS WHERE PARTS.PNUM = X.PNUM); SELECT * FROM ORDERS
www.e-beroun.cz
27
www.e-beroun.cz WHERE CUSTNO=2 ORDER BY ORDERDATE; UNION
Tento příkaz spojí výsledky dvou nebo více SLECTů. Duplicitní řádky budou eliminovány. ALL Jestliže specifikujete ALL pak duplicitní řádky nebudou eliminovány. Příklady : Tento příkaz najde zaměstnance z kanceláře 2500 a ty jejichž plat je větší než 50000. SELECT EMPNO FROM EMP WHERE DEPTNO = 2500 UNION SELECT EMPNO FROM EMPSAL WHERE SALARY> 50000;
2.5. Řízení transakcí Řízení transakcí lze postavit (principem) na dvou metodách : • použitím zámků CS Cursor Stability RL Release Locks RO Read Only RR Read Repeatability (default) • použitím ROWID – časový údaj Použití první metody – zamykání vět, tabulek či celé databáze má své opodstatnění, ale pro běžný přístup k datům se jeví vhodnější metoda ROWID. Metoda ROWID je založena na principu časové jednoznačnosti. Každá tabulka má vytvořený sloupec ROWID, který databázový server používá pro rychlý přístup k položkám této tabulky. V tomto sloupci je též informace o datu poslední změny patřičného řádku. Při Načtení tabulky z DB serveru do vašeho počítače a změny nějakých hodnot načtete i sloupec ROWID. Před ukládáním (aktualizací) těchto dat zkontroluje výskyt SQL chyby a dále už pouze dáte podmínku, že ROWID v tabulce na DB serveru je stejné jako ROWID ve vaší tabulce – např. v tabulce v MS Excel. Jestliže UPDATE neproběhne nebo se vyskytne SQL chyba znamená to, že ve většině případů se ROWID v tabulce na DB serveru neshoduje s ROWID ve vaší tabulce – někdo změnil data, která jste měnili vy (nebo jste chtěli, aby se data nezměnila – některé operace pro účetnictví). Vám nezbývá než provést ROLLBACK a operaci opakovat 28
www.e-beroun.cz
www.e-beroun.cz od začátku. Pokud k tomuto stavu nesmí dojí pak lze provést zámek, a to na různé úrovni (např. závěrkové operace v účetnictví) a pak vámi načtená (nebo zamčená) data nikdo nezmění. Metoda zámků je spíše na fyzické úrovni a také ji řada DB serverů řeší s různými odlišnostmi jak ve významu tak v syntaxi příkazu. Z toho vyplývá, že aplikace napsané tímto způsobem jsou na jiný DB server přenositelné s určitými problémy a potřebou programátorských zásahů. Zámky v nejužším pojetí se dělí na zámky pro čtení (sdílené) a zámky pro zápis (výhradní). Dále dle typu serveru existují i jiné typy zámků (např. kombinace předešlých, přírůstkový zámek …). Existují dva různé požadavky, které musí být splněny :
Kriteria pro výběr isolation stupně : 1, Data zpřístupněná spoustě uživatelů musí být konzistentní. 2, Uživatelé musí mít možnost přistupovat ke stejným datům souběžně.
2.5.1. COMMIT
Tento příkaz ukončí aktuální (řídící) transakci (logickou jednotku práce s daty). Transakce má jeden nebo více SQL příkazů 1
2.6. Administrace dat Administrace dat je ve své podstatě správa uživatelů. Vytvoření uživatele standard SQL nepodporuje a provádí se prostředky, které jsou součástí DB serveru. Je-li uživatel již vytvořen má určitá práva a to obecná a systémová (u Oracle je jen systémových práv zhruba 80) jejichž rozsah závisí na kvalitě DB serveru. Rozsah těchto práv je nutno měnit, a to jak rozšiřovat tak naopak. Pro rozšíření dat slouží příkaz GRANT a pro vyjmutí práv příkaz REVOKE. Pro přihlášení uživatele k databázi je potřeba jeho jméno a heslo. Heslo je následně (po založení) uloženo do systémového katalogu, kde je zakódováno a přístup k němu je pouze přes funkci ALTER PASSWORD nebo s autorizací DBA.
www.e-beroun.cz
29
www.e-beroun.cz
2.6.1. ALTER PASSWORD
Tento příkaz změní vaše heslo. Příklad : ALTER PASSWORD OLDPASSWORD TO NEWPASSWORD Související příkazy : GRANT, REVOKE
2.6.2. GRANT
2.6.3. REVOKE
30
www.e-beroun.cz
www.e-beroun.cz
Protect © http://www.e-beroun.cz http://web.telecom.cz/protect e-mail :
[email protected] Zpracoval : ing. Zdeněk Šerý
www.e-beroun.cz
31