PROCESOR RELAČNÍ ALGEBRY

Podobné dokumenty
Úvod do databázových systémů

Databáze SQL SELECT. David Hoksza

Úvod do databázových systémů

Informační systémy ve zdravotnictví. 6. cvičení

KIV/ZIS cvičení 5. Tomáš Potužák

Úvod do databázových systémů

Informační systémy 2008/2009. Radim Farana. Obsah. Dotazy přes více tabulek

Databázové systémy. Cvičení 6: SQL

Kurz Databáze. Obsah. Dotazy. Zpracování dat. Doc. Ing. Radim Farana, CSc.

Databázové systémy. Datová integrita + základy relační algebry. 4.přednáška

Úvod do databází. Modelování v řízení. Ing. Petr Kalčev

Úvod do databázových systémů

Informační systémy ve zdravotnictví. 10. cvičení

Úvod do databázových systémů

6. blok část C Množinové operátory

KIV/ZIS - SELECT, opakování

2. blok část B Základní syntaxe příkazů SELECT, INSERT, UPDATE, DELETE

Databáze I. Přednáška 6

Informační systémy ve zdravotnictví. 8. cvičení

Databázové systémy I

Jaký je rozdíl v definicicíh VARCHAR2(20 BYTE) a VARCHAR2(20 CHAR):

Databázové systémy Cvičení 5.3

Operátory ROLLUP a CUBE

Databázové systémy Cvičení 5

Úvod do databázových systémů 3. cvičení

Tabulkový procesor. Základní rysy

B0M33BDT Technologie pro velká data. Supercvičení SQL, Python, Linux

Databázové systémy trocha teorie

RELAČNÍ DATABÁZOVÉ SYSTÉMY

Dotazy tvorba nových polí (vypočítané pole)

Jazyk SQL 1. Michal Valenta. Katedra softwarového inženýrství FIT České vysoké učení technické v Praze c Michal Valenta, 2012 BI-DBS, ZS 2011/12

Gymnázium a Střední odborná škola, Rokycany, Mládežníků 1115

XMW4 / IW4 Pokročilé SELECT dotazy. Štefan Pataky

Databázové systémy. Doc.Ing.Miloš Koch,CSc.

Databázový systém označuje soubor programových prostředků, které umožňují přístup k datům uloženým v databázi.

Microsoft Access. Úterý 26. února. Úterý 5. března. Typy objektů databáze: Vytvoření a návrh nové tabulky

2. přednáška. Databázový přístup k datům (SŘBD) Možnost počítání v dekadické aritmetice - potřeba přesných výpočtů, např.

8.2 Používání a tvorba databází

Databázové systémy Cvičení 5.2

Microsoft Access. Typy objektů databáze: Vytvoření a návrh nové tabulky. Vytvoření tabulky v návrhovém zobrazení

DJ2 rekurze v SQL. slajdy k přednášce NDBI001. Jaroslav Pokorný

Základní přehled SQL příkazů

Co bude výsledkem mého SELECTu? RNDr. David Gešvindr MVP: Data Platform MCSE: Data Platform MCSD: Windows Store MCT

Databázové systémy Tomáš Skopal

RELAČNÍ DATABÁZE ACCESS

Kontingenční tabulky v MS Excel 2010

Kritéria hodnocení praktické maturitní zkoušky z databázových systémů

Jazyk SQL databáze SQLite. připravil ing. petr polách

Základy informatiky. 08 Databázové systémy. Daniela Szturcová

Popis ovládání. Po přihlášení do aplikace se objeví navigátor. Navigátor je stromově seřazen a slouží pro přístup ke všem oknům celé aplikace.

Databázové systémy. Dotazovací jazyk SQL - II

Inovace a zkvalitnění výuky prostřednictvím ICT. Základní seznámení s MySQL Ing. Kotásek Jaroslav

Databáze I. Přednáška 2

Analýza a modelování dat 3. přednáška. Helena Palovská

SQL. strukturovaný dotazovací jazyk. Structured Query Language (SQL)

Dotazování v relačním modelu a SQL

6. blok část B Vnořené dotazy

KIV/ZIS cvičení 6. Tomáš Potužák

5. blok Souhrnné a skupinové dotazy

SQL SQL-SELECT. Informační a znalostní systémy. Informační a znalostní systémy SQL- SELECT

Informační systémy 2008/2009. Radim Farana. Obsah. Jazyk SQL

Databázové systémy a SQL

12. blok Pokročilé konstrukce SQL dotazů - část II

Databáze MS-Access. Obsah. Co je to databáze? Doc. Ing. Radim Farana, CSc. Ing. Jolana Škutová

Základy informatiky. 06 Databázové systémy. Kačmařík/Szturcová/Děrgel/Rapant

Jazyk S Q L základy, příkazy pro práci s daty

VZORCE A VÝPOČTY. Autor: Mgr. Dana Kaprálová. Datum (období) tvorby: září, říjen Ročník: sedmý

Relační DB struktury sloužící k optimalizaci dotazů - indexy, clustery, indexem organizované tabulky

KAPITOLA 9 - POKROČILÁ PRÁCE S TABULKOVÝM PROCESOREM

Základní vzorce a funkce v tabulkovém procesoru

Gymnázium a Střední odborná škola, Rokycany, Mládežníků 1115

Materializované pohledy

Nový způsob práce s průběžnou klasifikací lze nastavit pouze tehdy, je-li průběžná klasifikace v evidenčním pololetí a školním roce prázdná.

Jazyk SQL 2. Michal Valenta. Katedra softwarového inženýrství FIT České vysoké učení technické v Praze c M.Valenta, 2011 BI-DBS, ZS 2011/12

Databázové a informační systémy

4. blok část A Logické operátory

DATABÁZE MS ACCESS 2010

Kapitola 4: SQL. Základní struktura

Databázové systémy. Ing. Radek Holý

Algoritmizace a programování

Obsah. Kapitola 1. Kapitola 2. Kapitola 3. Kapitola 4. Úvod 11. Stručný úvod do relačních databází 13. Platforma 10g 23

Analýza a modelování dat. Přednáška 9

Modely datové. Další úrovní je logická úroveň Databázové modely Relační, Síťový, Hierarchický. Na fyzické úrovni se jedná o množinu souborů.

Relační databáze. V dnešní době existuje řada komerčních DBMS, nejznámější jsou:

Analýza a modelování dat. Přednáška 8

Návrh a tvorba WWW stránek 1/14. PHP a databáze

DUM 12 téma: Příkazy pro tvorbu databáze

Instalace. Produkt je odzkoušen pro MS SQL server 2008 a Windows XP a Windows 7. Pro jiné verze SQL server a Windows nebyl testován.

Úvod do MS Access. Modelování v řízení. Ing. Petr Kalčev

Tiskové sestavy. Zdroj záznamu pro tiskovou sestavu. Průvodce sestavou. Použití databází

Databáze I. 1. přednáška. Helena Palovská

Databázové systémy. - SQL * definice dat * aktualizace * pohledy. Tomáš Skopal

Distanční opora předmětu: Databázové systémy Tématický blok č. 1: Dotazovací jazyk SQL Autor: RNDr. Jan Lánský, Ph.D.

Marketingová komunikace. 2. soustředění. Mgr. Pavel Vávra Kombinované studium Skupina N9KMK1aPH/N9KMK1bPH (um1a1ph/um1b1ph)

Obchodní akademie a Jazyková škola s právem státní jazykové zkoušky Jihlava

DATA CUBE. Mgr. Jiří Helmich

Dotazovací jazyky I. Datová krychle. Soběslav Benda

Výčtový typ strana 67

KIV/ZIS - SQL dotazy. stáhnout soubor ZIS- 04_TestovaciDatabaze accdb. SQL dotazy. budeme probírat pouze SELECT

MS Access Dotazy SQL

Transkript:

Vysoká škola báňská - Technická univerzita Ostrava Fakulta elektrotechniky a informatiky Databázové a informační systémy PROCESOR RELAČNÍ ALGEBRY Petr Lukáš (luk194) 14.12.2009 Ostrava

OBSAH Zadání úlohy... 3 Rozbor zadání... 3 Jazyk SQL... 3 Vlastnosti jazyka SQL... 4 Příkaz SELECT rozbor syntaxe... 4 Výběr seznamu sloupců... 5 Seznam zdrojových tabulek... 5 Omezující podmínka... 7 Seskupení a agregační funkce... 7 Podmínka skupiny... 8 Setřízení... 8 Další možnosti příkazu select... 9 Omezení duplicit... 9 Výběr prvních n záznamů... 9 Množinové operace... 9 Relační algebra... 9 Operátory RA... 10 Množinové operátory... 10 Způspoby zápisu relační algeby... 11 Lineární zápis (materiály VŠB teorie zpracování dat)... 11 Stromové zobrazení relační algebry... 11 Převod jazyka SQL na relační algebru... 12 Rozdíly SQL oproti RA... 12 Převod na RA... 12 Příklady převodu... 14 Implementace překladače... 15 Lexikální analýza... 16 Syntaktická analýza... 16 Překlad na relační algebru... 16 Vizualizace metodou Paint... 16 Lineární zápis... 17 Výsledek implementace... 18 Závěr... 18 Literatura... 19 2/23

ZADÁNÍ ÚLOHY Naimplementujte procesor, který převede SQL dotaz na výraz relační algebry. Zaměřte se pouze na některé základní rysy SQL. Implementaci otestujte. ROZBOR ZADÁNÍ Tato úloha spadá jak do kategorie databázových systémů, tak do kategorie programovacích jazyků a překladačů. Cílem je sestrojit program překladač, který bude umět přeložit SQL dotaz na zápis v jazyce relační algebry a případně vymezit takové podmínky, za jakých bude výsledek dosažitelný a správný. Abychom mohli implementaci provést, je nutné nejprve rozebrat oba jazyky relační algebru (RA) a Structured Query Language (SQL), popsat rozdíly mezi nimi a poté navrhnout, naimplementovat a otestovat algoritmus převodu. JAZYK SQL Jako obvykle, na úvod trochu historie. První implementace vznikla v laboratořích světoznámé firmy IBM na začátku 70. let a postarali se o ni Andrew Richardson, Donald C. Messerly a Raymond F. Boyce. Původně byl jazyk pojmenován SEQUEL nebo SEQL jako zkratka Structured English QUEry Language. Vzhledem k tomu, že název SEQUEL byla registrovaná obchodní značka, změnil se název na SQL Structured Query Language, který je používán dodnes. Cílem jazyka bylo, a stále samozřejmě je, poskytnout standardizovaný způsob přístupu k datům uloženým v databázi. Jazyk SQL není závislý na jazyce, ve kterém je implementovaná samotná aplikace, je to velmi mocný a přitom jednoduchý jazyk. Syntaxe vychází z přirozené formulace vět v angličtině, avšak jako všechny programovací jazyky, i tento má svou strukturu danou přesně definovanou gramatikou. Jak již bylo řečeno, sám o sobě nám SQL nestačí, slouží pouze jako jakási mezivrstva mezi daty a aplikací. Visual Basic Delphi C++ Java SQL Databáze Jedná se o jazyk deklarativní, to znamená, že popisujeme, co chceme, ale nezajímá nás, jak se daná operace provede. Toto je jeden z důležitých rysů, kterým se odlišuje od relační algebry. Rozdíly v principech obou jazyků budou vysvětleny později. V 80. letech začal vývoj tohoto nástroje nabírat na rychlosti. Na scéně se objevuje např. Oracle a díky konkurenci jednotlivé implementace přicházejí s novými možnostmi. Proto je nutno stanovit přesná pravidla. V roce 1987 ISO a ANSI publikují počáteční standard SQL, v roce 1989 ISO publikuje dodatek Integrity Enhancement Feature a začíná se hovořit o SQL89. V roce 1992 dochází k první úpravě tohoto ISO standardu, který je pak znám jako SQL2 nebo SQL92. 3/23

V současné době používá SQL drtivá většina databázových systému. Jedná se např. o již zmiňovaný Oracle, dále MySQL, MS SQL, MS Access a další. Konkrétní nástroje si SQL přizpůsobují svým účelům, avšak myšlenka a základní principy syntaxe zůstávají stejné. VLASTNOSTI JAZYKA SQL Jak již bylo uvedeno, SQL pracuje s relační databází. Relační databáze je množina tabulek, kde každá tabulka charakterizuje nějakou entitu. V typické relační databázi se můžeme setkat s tabulkami např. Zaměstnanci, Faktury, Sklad, Položka atd. Sloupce v tabulkách určují vlastnosti, tzn. např. u Zaměstnance můžeme evidovat jeho jméno, příjmení, rodné číslo a další. Řádky relační databáze pak charakterizují konkrétní objekt, přesně řečeno instanci entity, řádek se z pravidla označuje jako záznam. V rámci databázových technologií rozdělujeme jazyky pro práci s daty na tři kategorie: - Jazyky pro dotazování (DQL Data Query Language) - Jazyky pro definici dat (DDL Data Definition Language) - Jazyky pro manipulaci s daty (DML Data Manipulation Language) Jazyky pro dotazování jsou pro tuto práci nejdůležitější. Ve spojitosti s SQL se jedná přímo o příkaz SELECT. Dotaz znamená, že se žádáme databázi o data podle určitých kritérií. Například potřebujeme zjistit údaje o platu nějakého konkrétního zaměstnance, nebo si potřebujeme vyjet tržby za daný měsíc. Jazyk pro definici dat slouží k nadefinování struktury databáze. Tím se rozumí definice entitních typů a jejich atributů. Zjednodušeně řečeno, potřebujeme vytvořit tabulky a nadefinovat jim sloupce. Definicí dat se také rozumí odstranění tabulek (ne obsahu, ale celých tabulek) nebo úprava sloupců. Jazyky pro manipulaci dat mění obsah tabulek. Jedná se zpravidla o operace vložení řádků a úprava nebo odstranění řádků. SQL pokrývá všechny tři uvedené kategorie, ale pro převod dotazu SQL na RA se budeme dále zabývat pouze jazyky pro dotazování. Důležité je také poznamenat, že jazyk SQL není Case-sensitive, tzn. nerozlišuje velikost písmen, pokud samozřejmě nejde přímo o textový řetězec. Je dobrým zvykem psát veškerá klíčová slova velkými písmeny. O jazyce SQL bylo napsáno mnoho knih a tato práce neslouží jako učebnice SQL. Pro naše potřeby bude nutné popsat pouze funkci příkazu SELECT a hlavně vystihnout všechny možnosti zápisu, které podporuje, protože na základě takových informací pak bude sestavena gramatika SQL, to znamená přesný způsob zápisu. PŘÍKAZ SELECT ROZBOR SYNTAXE Příkaz SELECT je vstupní bránou ke všem datům, které chceme z databáze získat. Základní syntaxe příkazu vypadá takto: SELECT seznam sloupců FROM seznam tabulek a popis vazeb mezi nimi WHERE omezující podmínka, podle které vybíráme řádky GROUP BY seznam sloupců, podle kterých vytváříme skupiny HAVING podmínka seskupených záznamů ORDER BY seznam sloupců, podle kterých chceme vybrané záznamy setřídit 4/23

VÝBĚR SEZNAMU SLOUPCŮ Za klíčovým slovem SELECT následuje seznam sloupců, které chceme dotazem vybrat. Položky oddělujeme čárkami. Pokud chceme vybrat všechny možné sloupce, stačí napsat *. Kromě názvů samotných sloupců se v této části mohou objevit i výrazy a agregační funkce. Vybíráme-li z více tabulek a dojde ke shodě názvu sloupců, můžeme sloupec přesně specifikovat jako tabulka.sloupec. Pokud chceme vybrat všechny sloupce pouze z určité tabulky, stačí napsat tabulka.*. Vybraný sloupec nebo výraz můžeme pro přehlednost přejmenovat tak, že za něj uvedeme alias. Za SELECTem se tedy může objevit například něco takového: SELECT Zamestnanec.Jmeno, Prijmeni, PocetKusu1 + PocetKusu2 kusy, Vyrobek.Jmeno, Seznam.* První vybraný sloupec bude představovat jméno zaměstnance, bylo nutné uvést i název tabulky, protože vidíme, že existuje i tabulka Vyrobek, která má také atribut Jmeno. Systém by pak nevěděl, ze které tabulky by měl sloupec vzít. Následuje sloupec příjmení a matematický výraz pro sečtení hodnot ze sloupců PocetKusu1 a PocetKusu2, výsledek pak bude přejmenován na kusy. Následuje jméno výrobku a všechny sloupce z tabulky seznam. Co přesně atributy znamenají a co bude v příkazu následovat dále, momentálně není důležité, je však jisté, že výstup bude vypadat nějak takto: Zamestnanec.Jmeno Prijmeni kusy Vyrobek.Jmeno Seznam.Cislo Seznam.Nazev Seznam.Poznamka Petr Lukáš 10 Hrnek 1 Položka 1 Poznámka Jan Novák 12 Reproduktor 3 Položka 3 Jakub Novotný 5 Světo 5 Položka 5 SEZNAM ZDROJOVÝCH TABULEK Další části SQL dotazu je seznam zdrojových tabulek. V některých systémech, jako např. Oracle je tato část dotazu povinná. Naproti tomu např. v MS SQL Serveru může SELECT existovat i bez FROM. V této části dotazu uvedeme kromě samotných tabulek také to, jak mají být tabulky spojeny. Spojení dvou tabulek znamená vytvoření jedné univerzální tabulky, která obsahuje sloupce z levé i pravé strany, jedná se tedy o binární operaci. Představme si například takovou situaci. Existuje tabulka Projekt, u které evidujeme číslo projektu, název projektu a zodpovědnou osobu. CisloProjektu Nazev Osoba 1 Jeřáb Martin 2 Výtah Michal Dále existuje tabulka Polozka, která uchovává informace o čísle položky, čísle projektu, do kterého patří, název položky a počet kusů. CisloPolozky CisloProjektu Nazev Kusu 1 1 Rameno 1 2 1 Lano 20 3 2 Kabina 1 4 2 Tlačítko 15 5/23

Spojením vznikne takováto univerzální tabulka : Projekt.CisloProjektu Projekt.Nazev Osoba CisloPolozky Polozka.CisloProjektu Polozka.Nazev Kusu Jak je vidět, spojená tabulka obsahuje sloupce z obou zdrojových tabulek. To, jakým způsobem budou zkombinovány řádky určuje typ spojení. Jaké možnosti tedy máme? 1. Kartézský součin Pokud jednotlivé názvy tabulek oddělíme čárkami, pak dojde ke kartézskému součinu, to znamená, že řádky z jedné a z druhé tabulky se prokombinují všemi možnými způsoby. Teoreticky tedy pokud v jedné tabulce je a záznamů a v druhé b záznamů, pak spojená tabulka bude mít celkem a x b záznamů. V SQL se kartézský součin může provést i nad více než dvěma tabulkami. 2. Vnitřní spojení Zápis vnitřního spojení vypadá takto: FROM Tabulka1 INNER JOIN Tabulka2 ON Podmínka spojení Klíčové slovo INNER lze v zápisu vynechat. Funkci vnitřního spojení si můžeme představit tak, že se provede nejprve kartézský součin a poté se na vybrané záznamy aplikuje podmínka spojení. Typický příklad celého SQL dotazu na výše uvedený příklad s projekty by mohl vypadat takto: SELECT Polozka.Nazev NazevPolozky, Projekt.Nazev NazevProjektu FROM Polozka INNER JOIN Projekt ON Polozka.CisloProjektu = Projekt.CisloProjektu 3. Vnější levé spojení Syntaxe vnějšího levého spojení vypadá následovně: FROM Tabulka1 LEFT OUTER JOIN Tabulka2 ON Podmínka spojení OUTER lze podobně jako INNER vynechat. Levé spojení zajišťuje, že budou záznamy z levé tabulky za každých okolností vybrány alespoň jednou i v případě, že se nenajdou odpovídající záznamy v pravé tabulce. 4. Vnější pravé spojení Pravé vnější spojení se píše podobně jako levé: FROM Tabulka1 RIGHT OUTER JOIN Tabulka2 ON Podmínka spojení Princip spojení je naprosto stejný jako u levého s tím, že budou vybrány všechny záznamy z pravé tabulky. Místo názvů tabulek se může vyskytnout další spojení. Spojení tak lze do sebe libovolně zanořit a zkombinovat, vzniká tím celý výraz spojení, ve kterém můžeme používat kulaté závorky. Místo tabulky jako takové se může vyskytnout rovnou celý poddotaz. Tabulky lze podobně jako sloupce přejmenovat tak, že za ně uvedeme alias. Složitější SQL dotaz pak vypadá třeba takto: SELECT * FROM (Tab1 LEFT JOIN Tab2 ON Tab1.id = Tab2.id) INNER JOIN (Tab3, Tab4) ON (Tab4.id = Tab2.id) RIGHT OUTER JOIN (SELECT pole FROM Tab5) q ON (Tab4.pole = q.pole) Co by takový dotaz logicky znamenal by bylo asi složité odhadnout, avšak vzhledem ke konstrukci parseru SQL je důležité, že i něco takového se může v zápisu objevit. 6/23

OMEZUJÍCÍ PODMÍNKA Omezující podmínka následuje za seznamem tabulek a spojení. Podmínka může a nemusí být v dotazu obsažená. Pokud podmínku neuvedeme, pak vybíráme všechny možné řádky, které vznikly spojením tabulek. Podmínkou se rozumí výraz, který vrací pravdivostní hodnotu. Výrazy lze mezi sebou kombinovat pomocí logických spojek AND a OR, přičemž AND má vyšší prioritu, než OR. Možné je používat také unární logický operátor NOT. Samotné logické členy jsou pak tvořeny relačním operátory >, <, >=, <=, =, <>. Pro práci s řetězci se používá navíc operátor LIKE. Kromě toho ale v jazyce SQL existují některé speciální konstrukce: 1. a BETWEEN b AND c říká, že hodnota výrazu a musí být mezi hodnotami výrazů c a d. 2. a Ѳ ANY (vnořený dotaz) Ѳ je relační operátor a vnořený dotaz musí obsahovat pouze jeden sloupec. Operátor Ѳ se aplikuje na všechny hodnoty, které vrátí poddotaz a pokud podmínka alespoň v jednom případě vyhoví, vrátí celý výraz pravdivou hodnotu. 3. a Ѳ ALL(vnořený dotaz) jde o podobný případ jako v předchozím bodě, s tím rozdílem, že podmínka musí vyhovět pro všechny hodnoty, které vnořený dotaz vrátí. 4. a IS NULL Vrátí pravdivou hodnotu, pokud výraz a nabývá hodnoty null. Zbytek výrazu pak tvoří klasické matematické operace sčítání, odčítání, násobení a dělení (+ - * /) s možností použití unárních operátoru + a. Prioritu operátorů lze měnit pomocí kulatých závorek. Samotnými hodnotami jsou pak buď číselné konstanty (desetinná čísla používají znak. jako oddělovač), textové řetězce, které začínají a končí apostrofem. Zdvojením apostrofu získáme přímo řetězec se znakem apostrof. Jazyk SQL umožňuje použít jako hodnotu také vnořený dotaz. Zde však musí být splněna podmínka, že dotaz vrací přesně jeden sloupec a přesně jeden záznam. To znamená jedinou hodnotu. Následuje ukázka, jak může výraz v jazyce SQL vypadat: NOT(a > b) AND x < (SELECT pole FROM tabulka WHERE id = 4) OR c IN (SELECT pole FROM tabulka2) AND NOT e BETWEEN 1 AND 4+8 SESKUPENÍ A AGREGAČNÍ FUNKCE Po uvedení omezující podmínky následuje v SQL dotazu seznam polí, podle kterých má být provedeno seskupení. Seskupení se obvykle váže k použití agregací, jinými slovy souhrnů. Podle seskupujících polí se vytváří skupiny, pro které se následně počítají hodnoty agregačních funkcí. Seskupovat je možné také podle celých výrazů. Obecně platí, že v seskupení musí být minimálně všechny výrazy z části SELECT, kde nejsou použity agregace. SQL disponuje celkem 5-ti agregačními funkcemi: 1. MIN - Minimum 2. MAX - Maximum 3. AVG - Průměr 7/23

4. SUM - Součet 5. COUNT - Počet Dotaz s použitím agregací pak může vypadat například takto: SELECT Login, Jmeno, Prijmeni, SUM(Plat) FROM Zamestnanec z LEFT JOIN Uvazek u ON z.idzam = u.idzam GROUP BY Login, Jmeno, Prijmeni Při zpracování uvedeného dotazu se po sestavení zdroje dat z tabulek Zamestnanec a Uvazek vytvoří skupiny, tzn. z řádků, kde se Login, Jméno a Příjmení shodují se stane jeden řádek a odpovídající platy se sečtou. Je nutné uvědomit si, že agregační funkce se do sebe nesmí zanořit. Pokud před argument agregační funkce uvedeme klíčové slovo DISTINCT, pak se před výpočtem souhrnu omezí duplicitní hodnoty. Pokud bychom například uvedli místo SUM(plat) SUM(DISTINCT plat), pak v případě, že dva výskyty platu ve skupině budou nabývat stejné hodnoty, započítá se hodnota pouze jednou. PODMÍNKA SKUPINY Podmínka skupiny má podobný význam jako omezující podmínka WHERE s rozdílem, že omezení se aplikuje až po výpočtu agregací. Jinými slovy, pokud bychom chtěli ve výše uvedeném příkladu vybrat zaměstnance s celkovým platem větším než určitá hodnota, nemohli bychom toto omezení vložit do WHERE, protože v momentě, kdy se zpracovává WHERE ještě nebyly zpracován GROUP BY a agregační funkce. Správný zápis by vypadal: SELECT Login, Jmeno, Prijmeni, SUM(Plat) FROM Zamestnanec z LEFT JOIN Uvazek u ON z.idzam = u.idzam GROUP BY Login, Jmeno, Prijmeni HAVING SUM(Plat) > 2000 SETŘÍZENÍ Výsledné hodnoty se před předáním tazateli, tzn. například nám, pokud jsme se ptali, mohou setřídit. Na konci SQL dotazu se může objevit klauzule ORDER BY, za kterou následuje seznam polí z tabulek nebo výrazů, podle kterých chceme třídit. Třízení je standardně vzestupné, pokud chceme provést sestupné třízení, zapíšeme za příslušný sloupec DESC (descending sestupné). Jak bylo uvedeno, třízení se může provádět podle více atributů pokud bude hodnota jednoho shodná, pak se třídí podle dalšího. Například: SELECT Login, Jmeno, Prijmeni, SUM(Plat) FROM Zamestnanec z LEFT JOIN Uvazek u ON z.idzam = u.idzam GROUP BY Login, Jmeno, Prijmeni HAVING SUM(Plat) > 2000 ORDER BY Prijmeni, Jmeno Nad celým výsledkem se provede setřízení podle příjmení, pokud by náhodou dva zaměstnanci měli stejné příjmení, pak budou setřízeni podle jména. 8/23

DALŠÍ MOŽNOSTI PŘÍKAZU SELECT OMEZENÍ DUPLICIT Jazyk SQL pracuje na rozdíl od relační algebry s multimnožinami, resp. s uspořádanými poli záznamů, protože je možné používat setřízení. Relační algebra pracuje pouze s množinami, kde na pořadí nezáleží a nemohou se objevit duplicitní záznamy, protože v tu chvíli by šlo o stejný prvek množiny. Proto je v SQL implementovaná možnost omezit duplicitní záznamy tak, že za klíčové slovo SELECT uvedeme DISTINCT nebo UNIQUE. VÝBĚR PRVNÍCH N ZÁZNAMŮ V určitých případech je potřeba zobrazit pouze prvních n vybraných záznamů. V jazyce SQL je možnost, jak toto omezení provést za klíčové slovo SELECT napíšeme TOP n, kde n značí počet záznamů, které dotaz vrátí. MNOŽINOVÉ OPERACE SQL jazyk umožňuje používání celkem tří množinových operátorů. Tyto operátory provádějí množinové operace nad záznamy, ne nad sloupci. Jedná se o binární operátory, které pracují se dvěma poddotazy. Opět je možné regulovat pořadí a prioritu pomocí kulatých závorek. 1. UNION Sjednocení 2. EXCEPT Rozdíl 3. INTERSECT Průnik Průnik má vyšší prioritu než sjednocení a rozdíl. Podmínkou použití množinových operátorů je, že oba poddotazy musí vracet stejný počet sloupců. V opačném případě by nebylo možné množinové operace provést. Příklad množinové operace: SELECT a, b FROM tabulka1 UNION SELECT c, d FROM tabulka2 Tento SQL dotaz provede nejprve výběr atributů a a b z tabulky tabulka1, pak výběr c a d z tabulky tabulka2 a poté vybrané množiny záznamů sjednotí. Nastává zde problém, protože SQL nepracuje s množinami ale s multimnožinami. Množinové operátory automaticky vypouštějí duplicitu. Pokud bychom chtěli duplicitu zanechat, pak za množinový operátor uvedeme klíčové slovo ALL. Jestliže jsou v dotazu použity množinové operátory, může se setřízení (ORDER BY) vyskytovat až za výrazem všech množinových operací (Setřízení lze aplikovat pouze na výslednou vybranou multimnožinu). Tolik prozatím k SQL dotazům, pojďme se podívat na relační algebru. RELAČNÍ ALGEBRA Dle definice je relační algebra dotazovací jazyk pracující s celými relacemi, operátory RA se aplikují na relace, výsledkem jsou opět relace. Pro operace, a \ musí být relační schémata shodná. 9/23

V 70. letech definoval E.F. Codd relační algebru jako základ dotazovacích jazyků. Implementace SQL ale probíhala částečně odděleně, takže postupně docházelo rozdílům v principech obou jazyků. Jazyk relační algebry je spíše teoretický prostředek a pro dotazování nad SŘBD se nevyužívá. Slouží však jako mezistupeň mezi SQL dotazem a samotným prováděním výběru dat z databáze. Relační algebra totiž na rozdíl od SQL přesně definuje kroky, které vedou k dosažení výsledku. Za určitých okolností lze kroky relační algebry podle přesných pravidel zaměnit tak, aby byla výsledná relace stejná. Na tomto principu pak SŘBD provádí optimalizaci dotazů. Za základě výrazu relační algebry se sestaví fyzický plán, podle kterého dojde k samotnému výběru dat. Jakými operátory relační algebra disponuje? Podle původního návrhu E.F. Codda, obsahovala relační algebra celkem 8 operátorů sjednocení, průnik, rozdíl, kartézský součin, selekce, projekce, spojení a rozdělení. Pro účely této práce jsou popsány operátory, které budou využity při překladu z SQL. OPERÁTORY RA MNOŽINOVÉ OPERÁTORY Relační algebra nám nabízí celkem 3 binární množinové operátory, podobně jako SQL. 1. Sjednocení (R S) Je možné sjednotit záznamy relací, které mají shodné schéma. Tzn. počty atributů musí být na obou stranách stejné. 2. Průnik (R S) Pro průnik platí stejné pravidlo jako pro sjednocení. 3. Rozdíl (R \ S) Opět musí platit, že počty atributů na obou stranách jsou stejné. Podobně jako v SQL, i zde máme možnost spojovat tabulky. 4. Kartézský součin (R x S) Kartézským součinem relace R se stupněm m a relace S se stupněm n je relace R x S stupně m + n. Všechny prvky relace R se spojí se všemi prvky relace S. 5. Vnitřní spojení (R S) Vnitřní spojení funguje obdobně jako u SQL. Lze si představit, že se nejprve provede kartézský součin a na výslednou relaci se aplikuje selekce podle určité podmínky. Speciálním případem vnitřního spojení je tzv. přirozené spojení, kde se jako spojovací podmínka považuje rovnost hodnot stejně pojmenovaných atributů obou relací. 6. Vnější levé spojení (R S) Opět obdoba LEFT OUTER JOIN z SQL. Funguje podobně jako vnitřní spojení s rozdílem, že budou vybrány všechny záznamy z levé tabulky i v případě, že k nim nebude existovat připojitelný záznam z pravé tabulky. 7. Vnější pravé spojení (R S) Opírá se o stejnou logiku jako levé spojení, pouze je prohozeno pořadí relací. 10/23

Dalšími operátory jsou 8. Selekce () Selekce znamená omezení prvků relace podle určité podmínky. Z hlediska pohledu na tabulku se jedná o výběr řádků. 9. Projekce () Projekce znamená omezení atributů relace. Výčtem uvedeme, které atributy relace chceme dále používat. Jedná se o výběr sloupců. 10. Přejmenování () Bez přejmenování se neobejdeme, pokud potřebujeme vybírat data z jedné tabulky vícekrát. Minimálně jednu z tabulek musíme přejmenovat, abychom byli schopni rozlišit, ze které tabulky chceme získat data při zadání názvu atributu. 11. Agregace Některé publikace uvádějí možnost používání agregací. U agregace je nutné uvést podle kterých atributů se provede seskupení a pro které atributy nebo výrazy se souhrny spočítají. Možné je používat opět agregační funkce MIN, MAX, AVG, SUM a COUNT. ZPŮSPOBY ZÁPISU RELAČNÍ ALGEBY Výraz relační algebry lze zapsat více způsoby, obecně lze tvary zápisu rozlišit na lineární a stromový. LINEÁRNÍ ZÁPIS (MATERIÁLY VŠB TEORIE ZPRACOVÁNÍ DAT) Sjednocení: Průnik: Rozdíl: Kartézský součin: Projekce: Selekce: Spojení: Přirozené spojení: R S R S R \ S R x S R[seznam atributů oddělených čárkami] R(podmínka) R[spojovací podmínka]s R[*]S Uvedený způsob zápisu je sice jednoduchý, ale ve složitějších případech výrazů velice nepřehledný. STROMOVÉ ZOBRAZENÍ RELAČNÍ ALGEBRY Výraz v relační algebře je zobrazen jako graf strom, kde kořen stromu je výsledná relace a listy představují zdrojové tabulky. Každý uzel stromu představuje jednu dílčí operaci. Stromové zobrazení je velice přehledný způsob zápisu, ze kterého lze pohodlně zjistit, které operace se v jakém pořadí provedou a co je zdrojem dotazu. 11/23

Na obrázku je uveden příklad stromu relační algebry. PŘEVOD JAZYKA SQL NA RELAČNÍ ALGEBRU ROZDÍLY SQL OPROTI RA Před samotným převodem je potřeba si říct, ve kterých bodech se principiálně liší SQL od relační algebry. Relační algebra podle definice pracuje s množinami hodnot. To znamená, že hodnoty nejsou nijak uspořádané a nemohou se vyskytovat vícekrát. Naproti tomu SQL umožňuje použití setřízení a ve výsledné tabulce, kterou dotaz vrátí, se klidně mohou vyskytovat duplicitní záznamy. Pokud bychom se tedy drželi původní definice RA, pak by bylo možné zpracovat pouze SQL dotazy s klauzulí UNIQUE nebo DISTINCT, kde není použito řazení. Pro účely této práce se tedy dívejme na relační algebru jako na jazyk, který pracuje s uspořádanými multimnožinami stejně jako SQL. Množinové operátory nebudou odstraňovat duplicity a zavedeme novou operaci UNIQUE, která z multimnožiny duplicity vypustí. Aby bylo možné SQL dotaz přeložit je dále nutné zavést ještě další operace ORDER, která setřídí multimnožinu podle daných klíčů, a TOP, která vybere pouze prvních n záznamů. PŘEVOD NA RA Ačkoli bylo řečeno, že SQL je deklarativní jazyk, ve skutečnosti popisuje algoritmus, aniž bychom si to uvědomovali. Systém pak zadaný dotaz sice zoptimalizuje, ale z pohledu na výsledek můžeme říct, jaká je posloupnost zpracování jednotlivých částí SQL dotazu. 1. Nejprve je nutné spojit koncové tabulky. Ve stromu RA jde o listy. a. Kartézský součin jak v SQL, tak v RA existuje operace kartézského součinu. Jediným problémem je, že v SQL můžeme za sebe napsat libovolný počet tabulek (nebo už spojených relací), kdežto RA pracuje pouze s binární operací kartézského součinu. Takovýto součin, ve kterém se vyskytuje více než 2 relace, lze jednoduše rozložit na binární operace. Například FROM A, B, C, D lze převést na takovýto zápis v relační algebře. 12/23

b. Vnitřní, levé a pravé vnější spojení v tomto ohledu pracují oba jazyky se stejnými operacemi. Důležitým faktem je, že v zápisu RA se nemůže objevit přirozené spojení, dokud nemáme informace o struktuře všech tabulek, tzn. dokud nemáme k dispozici systémový katalog. I když je uvedena podmínka spojení, nemůžeme určit, zda obsahuje všechny atributy z levé i pravé tabulky. Jelikož v SQL lze pomocí závorek upravovat způsoby spojení, popř. používat vnořené poddotazy, není problém vytvořit ekvivalentní strom operací RA. 2. Aplikace omezující podmínky (WHERE) Poté, co je spojením vytvořena jedna univerzální tabulka, je možné aplikovat omezující podmínku (WHERE). V terminologii RA se jedná o selekci. Pokud tedy SQL dotaz obsahuje WHERE, převede se podmínka z WHERE do selekce. 3. Výpočet agregací Před výpočtem agregací je vhodné provést projekci na atributy, které budeme dále využívat. Jedná se o atributy nebo výrazy, podle nichž se provádí seskupení, nebo o výrazy, které vstupují do agregačních funkcí. Vezměme v úvahu následující příklad: SELECT a, SUM(b) + COUNT(b) + AVG(c) FROM tabulka GROUP BY a Nejprve se provede spojení všech zdrojových relací. V tomto případě jde pouze o tabulku tabulka. Než nad touto multimnožinou provedeme agregace, je vhodné nejprve vybrat pouze potřebné atributy. Vybereme tedy atribut a, protože podle něj se bude provádět seskupení. Dále vybereme atributy (výrazy) b a c, které vstupují do agregačních funkcí. Jak již bylo uvedeno výše, agregační funkce do sebe nesmí být zanořeny. Po provedení projekce potřebných atributů dojde k vytvoření skupin a výpočtu agregací. Pro úplnost by bylo vhodné počítat i s možností, že součástí výrazu v agregační funkci může být DISTINCT. 4. Aplikace omezující podmínky pro skupiny (HAVING) Máme-li vypočtené agregace (souhrny), pak můžeme opět provést selekci s tím, že se v této chvíli můžeme odvolávat na výrazy, které vznikly výpočtem souhrnu. Nesmíme zapomenout na to, že HAVING může obsahovat i agregační funkce, které nejsou v části SELECT. Při výpočtu agregací tedy nesmíme tyto funkce vynechat. 5. Výběr polí (výrazů) Až v tomto momentu proběhne samotná projekce, tzn. výběr potřebných atributů nebo výrazů, které jsou definovány za klíčovým slovem SELECT. 6. Setřízení Nakonec je možné výslednou multimnožinu setřídit podle klíčů. Pro zjednodušení předpokládám, že se třízení bude provádět podle atributů, které byly vybrány projekcí. Třízení by se sice mohlo provést ještě před samotnou projekcí, to by ale nebylo možné v případě použití množinových operátorů, kde se ORDER BY provádí až nakonec. 7. UNIQUE a TOP Přímo za SELECTem může následovat UNIQUE (DISTINCT) nebo TOP n. Na vypočtenou setřízenou multimnožinu aplikujeme DISTINCT nebo TOP n, pokud je dotaz obsahuje. 13/23

Algoritmus převodu jednoduchého dotazu je tedy popsán. Zbývá vyřešit množinové operace. Zde však relační algebra nabízí shodné možnosti jako SQL. Pouze nesmíme opomenout, že pokud za UNION, INTERSECT nebo EXCEPT neuvedeme klíčové slovo ALL, pak dojde k odstranění duplicit. Je tedy nutné (v případě, že ALL není zadáno) odstranit duplicity pomocí UNIQUE. PŘÍKLADY PŘEVODU 1. Jednoduchý dotaz SELECT a, b, c FROM tabulka WHERE a > b Příklad demonstruje velmi jednoduchý dotaz. Nejprve vybereme z tabulky tabulka všechny záznamy. Poté provedeme selekci těch záznamů, kde a > b. Nakonec vybereme pouze sloupce a, b a c. 2. Spojení tabulek SELECT DISTINCT a, b, c FROM tabulka1 t1 LEFT JOIN tabulka2 t2 ON t1.id = t2.id WHERE a > b Předchozí příklad je rozšířen o spojení tabulek, které jsou předtím přejmenovány. Na výsledek je navíc aplikováno omezení duplicit 14/23

3. Složitější dotaz SELECT DISTINCT a, b, c FROM tabulka1 t1 LEFT JOIN tabulka2 t2 ON t1.id = t2.id, (SELECT id, MAX(x) FROM tabulka3 GROUP BY id) WHERE a > b Ukázka vnořeného poddotazu s agregací a připojení pomocí kartézského součinu. Nejprve je nutné zpracovat poddotaz a levou relaci kartézského součinu, pak dojde k samotné operaci, následuje opět selekce, projekce a omezení duplicit. 4. Množinové operace SELECT a FROM TabA UNION ALL SELECT b FROM TabB EXCEPT ALL SELECT c FROM TabC Poslední ukázka nejprve se provádí projekce nad relacemi TabA, TabB a TabC. Nakonec se aplikují množinové operace sjednocení a rozdíl. IMPLEMENTACE PŘEKLADAČE Konečně se dostáváme k implementaci samotného překladače. Z teorie překladačů je známo, že překlad probíhá v několika fázích, z nichž první je lexikální analýza, následuje analýza syntaxe, sestavení syntaktického stromu a nakonec samotný překlad stromu SQL na strom RA. Pro implementaci jsem zvolil jazyk C#, což je moderní plně objektově orientovaný jazyk, který na bázi.net poskytuje značný komfort při práci. Překladač byl implementován ručně metodou rekurzivního sestupu. 15/23

LEXIKÁLNÍ ANALÝZA Lexikální analýza rozdělí vstupní soubor na posloupnost tzv. tokenů, čili symbolů. Jeden dílčí symbol označuje jeden nedělitelný koncový element (slovo) jazyka. Jedná se například o veškeré operátory, identifikátory, klíčová slova, závorky apod. Během této fáze se vyloučí jakékoli bílé znaky, komentáře a upraví se escapesekvence v textových řetězcích. O tuto proceduru se stará třída SQLScanner, která obsahuje metody pro práci s textem. Výstupem je tedy seznam tokenů. Typ tokenu je popsán následujícím výčtem. KEYWORD, IDENTIFIER, COMMA, DOT, LEFT_BRACKET, RIGHT_BRACKET, ASTERISK, PLUS, MINUS, SLASH, STRING_CONSTANT, NUMERIC_CONSTANT, NO_EQUALS, EQUALS, MORE_THAN, LESS_THAN, MORE_OR_EQUALS, LESS_OR_EQUALS, EOF, UNDEFINED Během této fáze může dojít k chybě Scanneru, pokud narazí na neidentifikovatelné slovo. Je generovaná výjimka typu SQLScannerException, která informuje, na které pozici byla neidentifikovatelá sekvence nalezena. SYNTAKTICKÁ ANALÝZA Po lexikální analýze následuje analýza syntaxe. Tu zajišťuje třída SQLParser, která má jako vstup sekvenci tokenů z lexikální analýzy. Syntaktická analýza jednak kontroluje syntaxi zadaného dotazu a jednak generuje syntaktický strom. Tento strom pak slouží jako podklad pro překlad na strom relační algebry. Během syntaktické analýzy opět může dojít k chybě, která je způsobena nekorektní formulací dotazu. Jedná se např. o nesprávné využití klíčového slova nebo operátoru. Je generována výjimka SQLParserException, která podobně jako SQLScannerException informuje o místu v souboru, kde byla nalezena chyba. Syntaktická analýza je řízena gramatikou, která je uvedena v příloze. Přestože pro účely této úlohy není nezbytně nutné parsovat např. matematické výrazy, je zde tato funkce implementována jednak kvůli rozšiřitelnosti a jednak kvůli úplnosti překladače. PŘEKLAD NA RELAČNÍ ALGEBRU Jakmile proběhne syntaktická analýza a je sestaven syntaktický strom, následuje překlad na relační algebru. Vzhledem k tomu, že není k dispozici systémový katalog, není možné kontrolovat správnost SQL dotazu na použité tabulky a jejich sloupce. Dále se v SQL dotazu nesmí objevit požadavek na všechny sloupce z jedné tabulky nebo všech tabulek, tzn. * nebo table.*, protože opět není možné zjistit, o které sloupce má vlastně jít. Algoritmus převodu na RA byl již popsán výše. Zde bych věnoval několik vět vnitřní struktuře RA a vizualizaci RA stromu. Jak během syntaktické analýzy, tak při vytváření výrazu relační algebry je generován strom. Každý typ uzlu je reprezentován vlastní třídou, ve velké míře zde byla využita dědičnost. Třídní diagram pro strom SQL i RA naleznete v příloze. Veškeré třídy pro strom RA pak implementují metody jednak pro generování stromového zobrazení a jednak pro generování lineárního zápisu. VIZUALIZACE METODOU PAINT Klíčovou metodou je metoda Paint, která má dva výstupní parametry bitmapu a bod napojení. public void Paint(out Bitmap bitmap, out Point junction); 16/23

Metoda vykreslí na bitmapu vykreslí obsah uzlu, doplní potřebné symboly, znaky nebo matematické výrazy. Nakonec celou bitmapu vrátí. Kromě toho vrátí také bod napojení, ke kterému pak směřují spojnice z nadřazených uzlů. Celá procedura samozřejmě probíhá rekurzivně. Metodu musí implementovat všechny uzly, jelikož dědí ze společného předka RANode. Pro zobrazení jednotlivých operací RA ve stromu jsou použity následující symboly Selekce Projekce Pravé vnější spojení Přejmenování relace Agregace Kartézský součin Omezení duplicit Vnitřní spojení Výběr prvních n záznamů Levé vnější spojení Množinové operace (sjednocení, průnik a rozdíl) LINEÁRNÍ ZÁPIS O lineární přepis se stará metoda ToRAString, která funguje na podobném principu jako metoda pro vykreslování. Lineární zápis operací selekce, projekce, vnitřní spojení tabulek a množinové operace byl popsán výše. Jelikož RA strom pracuje i s jinými operátory, bylo nutné vytvořit ekvivalentní zápisy. Levé vnější spojení R[* podmínka]s Pravé vnější spojení R[podmínka *]S Agregace R{seskupující atributy G agregační funkce} Přejmenování R<RENAME alias> Omezení duplicit R<UNIQUE> Výběr prvních n záznamů R<TOP n> 17/23

VÝSLEDEK IMPLEMENTACE Jako produkt celé úlohy vznikla aplikace s grafickým uživatelským rozhraním, která je spustitelná pod systémem Microsoft Windows na platformě.net. Ovládání aplikace je intuitivní a snadné. V horní části se nachází textové pole, kam je možno zadat SQL dotaz. Po kliknutí na tlačítko Convert to RA nebo stisknutím klávesy F5 proběhne samotný překlad. Výsledky jsou dva stromové a lineární zobrazení. Mezi těmito zobrazeními se lze přepínat pomocí záložek. V případě, že při překladu byly objeveny nějaké nejasnosti v zadaném dotazu, zobrazí se panel s chybovým hlášením a kurzor se přemístí do textového pole s SQL dotazem na místo, kde chyba pravděpodobně vznikla. Strom relační algebry je možné exportovat tlačítkem Save tree image a SQL dotaz lze načíst pomocí Load SQL. ZÁVĚR Výsledná aplikace je schopna zanalyzovat jakýkoli zadaný SQL dotaz, který vyhovuje gramatice uvedené níže. Jelikož během překladu není k dispozici systémový katalog, není možné provést typovou kontrolu nad výrazy a není možné určit, zda identifikátory v dotazu skutečně existují. Na dotazy, které jsou součástí výrazů, se neaplikuje další rekurzivní rozklad. Produkt může kromě studijních účelů sloužit také jako vizualizace provádění dotazu. Ze zobrazeného stromu lze snadněji zjistit, co má dotaz provádět. Výsledný program by bylo možné rozšířit na jednoduchý dotazovací nástroj, který by prováděl dotazování nad definovanými tabulkami a v rámci rozloženého výrazu RA by pak bylo možné dotazy optimalizovat. Tyto možnosti však daleko překračují rozsah projektu a celková implementace by zabrala mnohem více času. 18/23

LITERATURA Jana Šarmanová, R. F. (n.d.). Relační datový model. Retrieved from Barborka: http://barborka.vsb.cz/prednasky/presentations//2006-tzd-teorie_zpracovani_dat-slides/05/tzd5_pdf.pdf Parsing Expression Grammar. (n.d.). Retrieved from Wikipedia: http://en.wikipedia.org/wiki/parsing_expression_grammar Relational Algebra. (n.d.). Retrieved from Wikipedia: http://en.wikipedia.org/wiki/relational_algebra 19/23

PŘÍLOHA 1 POUŽITÁ GRAMATIKA JAZYKA SQL Syntaktická analýza se řídí následující gramatikou. <QUERY> <ORDERBYEXPRESSIONS> <ORDERBYEXPRESSIONS1> <ORDERBYITEM> <EXPRESSION> <DISJ> <DISJ1> <CONJ> <CONJ1> <NOT> <REL> <SUM> <SUM1> <FACTOR> <FACTOR1> <TERM> <VALUE> <UNION> [ ORDER BY <ORDERBYEXPRESSIONS>] <ORDERBYITEM> <ORDERBYEXPRESSIONS1>, <ORDERBYITEM> <ORDERBYEXPRESSIONS1> e <EXPRESSION> [ DESC ASC ] <DISJ> <CONJ> <DISJ1> OR <CONJ> <DISJ1> e <NOT> <CONJ1> AND <NOT> <CONJ1> e NOT <NOT> <REL> <SUM> IN <NESTEDSELECT> <SUM> BETWEEN <SUM> AND <SUM> <SUM> IS NULL <SUM> = ( ALL ANY ) <NESTEDSELECT> <SUM> = <SUM> <SUM> <> ( ALL ANY ) <NESTEDSELECT> <SUM> <> <SUM> <SUM> > ( ALL ANY ) <NESTEDSELECT> <SUM> > <SUM> <SUM> < ( ALL ANY ) <NESTEDSELECT> <SUM> < <SUM> <SUM> >= ( ALL ANY ) <NESTEDSELECT> <SUM> >= <SUM> <SUM> <= ( ALL ANY ) <NESTEDSELECT> <SUM> <= <SUM> <SUM> <FACTOR> <SUM1> + <FACTOR> <SUM1> - <FACTOR> <SUM1> e <TERM> <FACTOR1> * <TERM> <FACTOR1> / <TERM> <FACTOR1> e [ + - NOT ] <NESTEDSELECT> [ + - NOT ] ( <EXPRESSION> ) [ + - NOT ] <VALUE> <IDENTIFIER>. <IDENTIFIER> <IDENTIFIER> ( <EXPRESSIONS> ) <IDENTIFIER> <STRINGCONSTANT>

<NUMERICCONSTANT> <UNION> <UNION1> <INTERSECT> <INTERSECT1> <INTERSECT> <UNION1> UNION <INTERSECT> <UNION1> EXCEPT <INTERSECT> <UNION1> e <QUERYELEMENT> <INTERSECT1> INTERSECT <QUERYELEMENT> <INTERSECT1> e <QUERYELEMENT> ( <UNION> ) <SELECT> <SELECT> SELECT [ DISTINCT TOP <NUMERICCONSTANT>] <FIELDS> [ FROM <TABLES> [ WHERE <EXPRESSION>] [ GROUP BY <EXPRESSIONS> [ HAVING <EXPRESSION>]]] <FIELDS> <FIELDS1> <FIELD> <FIELDS1>, <FIELD> <FIELDS1> e <FIELD> <IDENTIFIER>. * * <EXPRESSION> [<IDENTIFIER>] <TABLES> <TABLES1> <JOINS> <JOINS1> <JOIN> <TABLE> <EXPRESSIONS> <EXPRESSIONS1> <JOINS> <TABLES1>, <JOINS> <TABLES1> e <TABLE> <JOINS1> <JOIN> <JOINS1> e LEFT [ OUTER ] JOIN <JOINS> ON <EXPRESSION> RIGHT [ OUTER ] JOIN <JOINS> ON <EXPRESSION> [ INNER ] JOIN <JOINS> ON <EXPRESSION> <NESTEDSELECT> [<IDENTIFIER>] ( <TABLES> ) [<IDENTIFIER>] <IDENTIFIER> [<IDENTIFIER>] <EXPRESSION> <EXPRESSIONS1>, <EXPRESSION> <EXPRESSIONS1> e <NESTEDSELECT> ( <UNION> )

PŘÍLOHA 2 TŘÍDNÍ DIAGRAM SYNTAKTICKÉHO STROMU SQL

PŘÍLOHA 3 TŘÍDNÍ DIAGRAM STROMU RA