)Struktura obsahující datum a čas s požadovanou přesností INTERVAL YEAR ( ) K vyjádření relativně kratšího časového intervalu. Datové typy pro objemná data (LOB) BLOB binární objekty do 4GB CLOB – textové (CHAR) objekty do 4GB NCLOB textové objekty v národních sadách do 4GB
7.
Operace DDL
Create table CREATE TABLE
MODIFY (<specifikace sloupce>) Příkaz se používá pro úpravu specifikace sloupců či omezení do tabulky. DROP COLUMN
DROP TABLE
8.Omezení Klíče •Primární klíč – zvolený kandidátní klíč, který definuje ntici
•Cizí klíč – atribut, nebo skupina atributů, která odpovídá kandidátnímu klíči v jiné nebo stejné relaci
Hodnota NULL •NULL – představuje hodnotu, která je prázdná, neplatná nebo neznámá
Unique • Jedná se o atribut nebo skupinu atributů, která jednoznačně identifikuje instanci entity mezi ostatními • Typy: –Jednoduché (simple UID) –Složené (compose UID) –Umělé (artifical UID)
–Kandidátní (cadidate UID)
Sekvence umožňují generovat jedinečné identifikátory, například hodnoty primárního klíče tabulek, databázová platforma Oracle používá tzv. sekvence, (v MySQL je např. volba autoincrement pro vybraný sloupec tabulky) při použití sekvence například pro generování primárního klíče je dobré si uvědomit, zda sekvenčně zvolený (umělý) klíč je správné řešení (někdy je vhodné použít již existující primární klíče např. z evidence obyvatel, nebo přirozené klíče). CREATE SEQUENCE seq_cyklus MINVALUE 2 MAXVALUE 5 CYCLE NOCACHE; bude postupně generovat hodnoty 2, 3, 4, 5, 2, 3, 4, 5, 2 … CREATE SEQUENCE seq_st_inc START WITH 100 INCREMENT BY 200; bude postupně generovat hodnoty 100, 300, 500, 700, 900, 1100, 1300
9. Operace DML Příkazy pro manipulaci s daty (DML) Data Manupation Language příkazy pro získání dat z databáze a pro jejich úpravy se označují zkráceně DML (data Manipulation Language) SELECT – vybírá data z databáze INSERT – vkládá do databáze nová data. INSERT INTO dodavatele (dodavatel_id, nazev, zastoupeni, mesto) VALUES (1, 'Acer','Acer Czech Republic s.r.o.','Praha 4'); UPDATE – mění data v databázi (editace).
UPDATE dodavatele SET nazev = 'HP' WHERE nazev = 'Compaq'; DELETE – odstraňuje data (záznamy) z databáze. DELETE FROM produkty WHERE dodavatel_id = 7 or dodavatel_id > 10; EXPLAIN PLAN FOR – speciální příkaz, který zobrazuje postup zpracování SQL příkazu. Pomáhá uživateli optimalizovat příkazy tak, aby byly rychlejší.
10. Příkaz select •Projekce – nám říká, které sloupce budeme zobrazovat •Restrikce (selekce) – nám říká, které řádky budeme zobrazovat Klauzule WHERE •Klauzule WHERE – provádí v dotazu restrikci •Rozšiřuje syntaxi příkazu SELECT na: SELECT <sloupce> FROM
Operátory Umožňují na základě původních hodnot vypočítat hodnoty nové. Sčítání + (unární i binární) Odčítání (unární i binární) Násobení * Dělení / Priorita •Nejprve se vyhodnocují části výrazu uzavřené v závorkách •Násobení a dělení mají přednost před sčítáním a odečítáním •Operátory se stejnou prioritou se vyhodnocují zleva doprava Umožňuje spojovat hodnoty ze sloupců a znakové řetězce Zřetězení ||
Operátory pro porovnání = rovnost <> nerovnost < menší než > větší než <= menší nebo rovno >= větší nebo rovno BETWEEN x AND y [není] větší nebo rovno x a menší nebo rovno y [NOT] IN [ne] patří do množiny ANY, SOME porovnání hodnoty s každou hodnotou v seznamu nebo řádkem vnořeného dotazu, musí být doplněn jedním z operátorů =, <,>, <=, >=. Výraz je pravdivý, pokud je pravdivý alespoň pro JEDNU položku seznamu. ALL porovnání hodnoty s každou hodnotou v seznamu nebo řádkem vnořeného dotazu, musí být doplněn jedním z operátorů =, <,>, <=, >=. Výraz je pravdivý, pokud je pravdivý pro VŠECHNY položky seznamu. [NOT] EXISTS ve vnořeném dotazu je vrácen alespoň jeden řádek IS [NOT] NULL test na [ne] rovnost NULL X [NOT] LIKE y porovnání řetězce s maskou obsahující zástupné znaky _ právě jeden libovolný znak % nula nebo více libovolných znaků
Logické operátory a hodnota NULL Všechny logické operátory mají stejnou prioritu. AND && OR | | NOT ! Použití : v definicích za WHERE.Konkrétní příklad: Chceme vybrat sloupec skladem a hledáme ve sloupci typ 'šroubky', které mají ve sloupci velikost hodnotu 7 .Použijeme následující příkaz: SELECT skladem WHERE typ = 'šroubky' AND velikost ='7' anebo : SELECT skladem WHERE typ = 'šroubky' && velikost = '7'
11.Spojení tabulek Samospojení (self–join, recursive join): spojení, v němž jsou záznamy z tabulky kombinovány s jinými záznamy z téže tabulky Kartézský součin (cartesian productjoin): Spojení bez podmínek. Záznamy z tabulek jsou kombinovány stylem každý s každým. Výsledná množina obsahuje MxN záznamů. Varianta kartézského součinu od Oracle
je crossjoin. Přirozené spojení (naturaljoin): Spojení, kde si systém sám najde nejvhodnější sloupce, přes které bude spojovat
Vnitřní spojení INNER INNER JOIN, JOIN Do výsledku budou zahrnuty pouze ty řádky, pro které byla nalezena odpovídající hodnota v druhé tabulce. Příklady využití vnějších spojení: Zobrazení všech dodavatelů, tedy i těch, kteří nedodávají žádný výrobek Zobrazení všech výrobků, tedy i těch, které nejsou přiřazeny žádnému dodavateli S využitím agregačních funkcí zobrazení počtu výrobků, které dodávají jednotliví dodavatelé (s vnějším spojením se zobrazí i hodnoty 0 u těch dodavatelů, kteří žádný výrobek nedodávají, v případě vnitřního spojení ve výsledku nebudou vůbec zahnuti) Vnější spojení OUTER Ve výsledku budou i ty řádky, pro které nebyly nalezeny odpovídající hodnoty v druhé tabulce. Pravé (RIGHT JOIN) .. Ve výsledku budou všechny řádky z pravé (druhé tabulky). Nebylli nalezen aspoň jeden odpovídající řádek v levé tabulce, budou ve výsledku hodnoty NULL ve všech sloupcích z první tabulky. Levé (LEFT JOIN) .. Ve výsledku budou všechny řádky z levé (první tabulky). Nebylli nalezen aspoň jeden odpovídající řádek v pravé tabulce, budou ve výsledku hodnoty NULL ve všech sloupcích z druhé tabulky. Úplné (FULL JOIN) .. Ve výsledku budou všechny řádky z levé i pravé (první i druhé tabulky).
Aliasy Tabulkové aliasy V řadě případů je dobré (nebo dokonce nutné) nahradit název tabulky aliasem – tedy zpravidla kratším názvem, což může být i jedno písmeno. Kromě toho, že je to kratší, daleko snadněji se pak změní název tabulky, protože to stačí upravit jen na jednom místě. V neposlední řadě pak může být zápis dotazu přehlednější, protože se nemusí stále opakovat (třeba i) dlouhý název tabulky. Vezměme tento příklad, kdy se obě tabulky několikrát v dotazu opakují. SELECT SUM(Objednavky.Castka), Ulice FROM Objednavky INNER JOIN Zakaznici ON Objednavky.IdZakaznika = Zakaznici.ID WHERE Zakaznici.Mesto = "Praha 8" GROUP BY Zakaznici.Ulice
A takto to bude vypadat při použití aliasů – za název tabulky uvedeme jeho alias a dále se pak na něj odkazujeme. SELECT SUM(o.Castka), Ulice FROM Objednavky o INNER JOIN Zakaznici z ON o.IdZakaznika = z.ID WHERE z.Mesto = "Praha 8" GROUP BY z.Ulice V případě, že bude třeba dotaz upravit na tabulku zahraniční objednávky, bude stačit jedna jediná změna: SELECT SUM(o.Castka), Ulice FROM ZahranicniObjednavky o INNER JOIN Zakaznici z ON o.IdZakaznika = z.ID WHERE z.Mesto = "Praha 8" GROUP BY z.Ulice Sloupcové aliasy Jiné pojmenování sloupce je velmi užitečné při používání agregačních funkcí. Sloupec s výsledkem takové funkce může být pojmenován třeba Expr1000, což není zrovna pěkné. Pokud použijete dokonce funkcí více, stává se takový výsledek velmi nepřehledný.
Při použití aliasů je výsledek mnohem lepší. SELECT MIN(Castka) AS Minimum, MAX(Castka) AS Maximum, AVG(Castka) AS Prumer, STDEV(Castka) AS VybSmerOdch FROM Objednavky
Je třeba dát pozor ale na jednu trochu nepříjemnou věc – sloupcový alias nelze použít (na rozdíl od tabulkového) na dalších místech dotazu. Řazení výsledku dotazu dle oříznutého názvu takto realizovat nelze. SELECT TRIM(Nazev) AS OriznutyNazev FROM Produkty ORDER BY OriznutyNazev A musí se bohužel znovu zopakovat celá funkce. SELECT TRIM(Nazev) AS OriznutyNazev FROM Produkty ORDER BY TRIM(Nazev) Je tu ovšem jedna výjimka, a to v případě, že je alias použit v poddotazu. SELECT IdZakaznika, Soucet FROM (SELECT IdZakaznika, SUM(Castka) AS Soucet FROM Objednavky GROUP BY IdZakaznika) WHERE Soucet > 2000
Vysvětlení toho, proč to zde funguje, je snadné. Alias reálně vzniká až při vykonání dotazu. Zde se tedy provede nejprve vnitřní dotaz, který „vytvoří“ alias a ten pak existuje i pro vnější hlavní dotaz. V předchozím příkladu toto nebylo možné – chtěli jsme řadit podle něčeho, co ještě neexistuje.
12. Funkce Funkce jsou programové bloky, které provádějí požadované operace například s číselnými, znakovými či datovými hodnotami. Seznam lze najít např. na: http://www.techonthenet.com/oracle/functions/index.php Obecně je můžeme rozdělit: a) Jednořádkové funkce •Analytické •Konverzní Bin_To_Num(posloupnost 0 a 1 oddělená čárkami) převod binárního čísla na číslo desítkové soustavy To_Char(řet) převádí řetězec do standardní znakové sady To_Char(number [, formátovací_řetězec, nsl_par]) převádí datový typ NUMBER na typ VARCHAR2 To_Char(datetime [, formátovací_řetězec, nsl_par]) převádí datové typy na typ VARCHAR2 To_Date(řet, formátovací_řetězec [, nsl_par]) převádí textové datové typy na datový typ DATE To_Number(řet, formátovací_řetězec [, nsl_par]) převádí datový typ VARCHAR2 na číselný typ NUMBER nsl_par … parametr určující národní formát pro zápis data a času, čísel .. •Funkce pro práci s datem a časem •Matematické •Funkce pro práci s hodnotou NULL •Řetězcové funkce
•Objektové funkce •Funkce pro práci s formátem XML • b) Agregační funkce agregační_funkce ::= { COUNT | SUM | AVG | MIN | MAX } ([ ALL | DISTINCT ] výraz) | COUNT(*)
13. Agregační funkce Agregační funkce pracují nad množinou řádků, přičemž vrací právě jeden výsledek pro celou vstupní množinu dat. Tyto funkce pomocí matematických a statistických operací zpracovávají agregované hodnoty z celých sloupců (neníli uvedeno jinak v podmínce). AVG ([DISTINCT] [ALL] výraz) aritmetický průměr COUNT ([DISTINCT] [ALL] výraz) počet hodnot MAX (výraz) maximum MIN (výraz) minimum SUM ([DISTINCT] [ALL] výraz) součet hodnot Skupinové dotazy Na rozdíl od souhrnných dotazů dochází k výpočtu agregačních funkcí pro konkrétní skupiny řádků. Nevzniká tedy na výstupu jeden jediný řádek, ale řádky pro jednotlivé skupiny. Kolik zaměstnanců mají jednotlivá oddělení společnosti ? Jaké jsou tržby poboček společnosti ? Kolik lidí jede průměrně v jednom vlaku na dané trase ? Jaká je průměrná délka života pro muže a ženy ? Jaká je průměrná mzda v různých sektorech ? Kolik vstupenek se prodalo na jednotlivá utkání ? Jaká je nejvyšší a nejnižší vyplácená sociální dálka v krajích ? Kdo získal nejméně bodů z testu v daném předmětu ? SELECT <sloupec_1>, <sloupec_2>, ... <sloupec_n>,
Všechny sloupce, které nejsou agregovány a jsou uvedeny za klíčovým slovem SELECT (definují skupiny, pro něž dochází k výpočtu agregačních funkcí) musí být uvedeny i za klauzulí GROUP BY. Dotazy obsahující klauzuli GROUP BY označujeme jako skupinové dotazy, neboť seskupují data ze zdrojových tabulek do skupin a pro každou z těchto skupin vytváří jediný souhrnný řádek. Sloupce uváděné za klauzulí GROUP BY označujeme jako seskupující sloupce.
Souhrnné dotazy Velice často nás nezajímají jednotlivé detaily uložené v konkrétních řádcích v jednotlivých tabulkách, ale několik málo souhrnných informací, které sumarizují obsah databáze, například: SELECT AVG(cena) FROM produkty; průměrná hodnota ve sloupci cena v tabulce produkty, počítají se jen z uvedených hodnot – tj. NOT NULL SELECT MIN(cena) FROM produkty; minimální (uvedená) hodnota ve sloupci cena v tabulce produkty SELECT count(cena) FROM produkty; počet nenulových hodnot ve sloupci cena v tabulce produkty SELECT count(*) FROM produkty; počet řádků tabulky produkty
14.Vnořené dotazy •Jednořádkové jednosloupcové vnořené dotazy vrací jen jednu hodnotu ● •Jednořádkové vícesloupcové vnořené dotazy vrací jen jeden řádek, ale více sloupců (například jeden řádek tabulky nebo výsledek souhrnného dotazu) •Víceřádkové jednosloupcové vnořené dotazy vrací více řádků, ale jen jediný sloupec (například seznam všech různých hodnot v konkrétním sloupci) •Vícesloupcové víceřádkové vnořené dotazy výsledkem je tabulka s více sloupci a více řádky (obecný stav) Vnořené dotazy musí být zapsány v závorkách: (SELECT ….) Nejdříve se provede vnořený dotaz a teprve nad jeho výsledky se aplikuje hlavní dotaz. Vnořený dotaz může být umístěn do hlavního dotazu například: •za klauzuli FROM •za klauzuli WHERE
•za klauzuli HAVING •případně v dalších částech (i v části bezprostředně za SELECT)
Korelované x nekorelované Jedná se o poddotazy obsahující hodnotu vnějšího dotazu. Tato hodnota je dostupná pomocí aliasu. Nekorelovaný poddotaz je na vnějším dotazu nezávislý – vyhodnocuje se pouze jednou. Korelovaný poddotaz se vyhodnocuje opakovaně pro každý řádek vnějšího dotazu Množinové operátory Existují situace, kdy potřebujeme spojit dohromady výsledky z více jak jednoho dotazu. Pro tuto situaci poskytuje jazyk SQL množinové operátory. Každý výsledek dotazu můžeme chápat jako množinu a na tuto množinu můžeme aplikovat operátory, díky kterým dosáhneme požadovaných výsledků. Množinové operátory nám pomohou řešit následující problémy: •Získat řádky z výsledků dvou a více dotazů. •Získat takové řádky z dotazu, které se nevyskytují ve výsledku jiného dotazu. •Získat řádky, které se vyskytují ve výsledcích všech dotazů. •Získat řádky z výsledku dotazu, které se nevyskytují ve výsledku dotazu jiného. K řešení těchto problémů disponuje jazyk SQL těmito množinovými operátory: •UNION ALL •UNION •MINUS •INTERSECT
15. Index Vlastnosti: zrychlení jen tehdy, pokud potřebujeme najít několik záznamů, pokud je cílem najít více než 5% záznamů, bude obvykle rychlejší hledání bez použití indexu, zvýšení režie při vkládání a změně dat (INSERT, UPDATE, DELETE), protože kromě zápisu do tabulky je třeba zapsat indexový údaj na přesně definované místo v indexu, nedoporučuje se používat indexy (kromě bitmapových indexů) nad tabulkami obsahujícími malé množství řádků (řádově desítky) nebo nad sloupci s nízkou variabilitou (např. sloupec pohlaví žena/muž), odstraněním indexu zůstane tabulka nezměněná.
Použití, vytvoření Vytvoří index nad uvedeným sloupcem definované tabulky. CREATE [BITMAP] INDEX
Metody prohledávání Přímý přístup pomocí adresy ROWID nebo algoritmu hash Typické použití pro přístup k tabulce po jejím prohledání pomocí některého typu indexu při použití dotazu typu: SELECT * FROM nazev_tabulky WHERE indexovany_sloupec = hodnota; Databáze provede tyto kroky: 1.Prohledá index u indexovaného sloupce 2.Načte hodnotu ROWID řádku, na který odkazuje 3.Podle hodnoty ROWID přistoupí k tabulce a načte konkrétní řádek 4.Kroky 2) a 3) opakuje, pokud více řádku splňuje danou podmínku (v případě, kdy indexovaný sloupec není unikátní) Použití tohoto přístupu lze i přímo z dotazu, pokud známe ROWID řádku, příklad: SELECT * FROM studenti WHERE ROWID='AAAVlyAAFAAAGQ3AAG' ; ROWID lze zjistit například příkazem : SELECT ROWID FROM studenti; Indexové přístupy (např. prohledávání indexu) Jde pravděpodobně o nejoblíbenější přístupovou metodu Bloky na nejnižší úrovni stromu (listy) obsahují všechny indexované klíče a adresu ROWID, odkazující na konkrétní řádek Vnitřní bloky (větví) slouží k navigaci strukturou indexu Listové uzly indexu jsou ve skutečnosti dvojitě propojeným seznamem. Jakmile zjistíme, kde začít, je prohledání seřazených hodnot (prohledání rozsahů indexů) snadné (lze pokračovat v dalších listech, dokud nenarazíme na hodnotu vyšší než zadaná) Všechny listové bloky by měly být na stejné úrovni stromu, Většina indexů bude mít výšku 2 až 3, tj. pro vyhledání klíče bude třeba 2 nebo 3 vstupněvýstupních operací Úplné prohledávání (nutný průchod všemi řádky tabulky)
Bitmapový index Klasické použití bitmapových indexů, jak již bylo uvedeno v úvodu, spočívá v jejich nasazení v úlohách zpracovávajících velká množství statických dat. Výhodou bitmapových indexů je to, že na rozdíl od klasických indexů je není třeba neindexovat. V praxi je důležitým kritériem při rozhodování, zda v určité situaci použít klasické indexování (textové) nebo indexování bitmapové, četnost výskytu různých hodnot dané vlastnosti/sloupce v tabulce. Pro každou různou hodnotu vlastnosti se totiž vytváří nové pole hodnot true/false. Mějme například tabulku Osoba se sloupci RodneCislo, Jmeno, Prijmeni a Pohlavi. Z definice tabulky je zřejmé, že rodné číslo bude pro každou osobu jiné (odhlédneme-li pro zjednodušení od duplicit). Jméno a Příjmení bude mít poměrně velký rozptyl hodnot, avšak pohlaví bude nabývat pouze hodnot M nebo F. Z toho plyne že indexovat bitmapově má smysl pouze nad sloupcem Pohlavi. V tomto případě se bez ohledu na počet záznamů v tabulce vytvoří pouze dvě bitmapová pole, jedno pro podmínku "osoba je M(ale)", druhé pro podmínku "osoba je F(emale)".
Tabulka Osoba Další výhodou bitmapových indexů je možnost jejich efektivního komprimování. V praxi totiž dochází k velice častému opakování dlouhých úseků složených buď z binárních nul nebo jedniček. Oproti textovým indexům, kde každý znak je reprezentován buď jedním nebo dvěma bajty (slovy) se každých N binárních jedniček či nul převede na jeden bajt.