Databázové systémy I. 4. přednáška
Co nás dnes čeká Základy relační algebry Anatomie příkazu SELECT Srovnávací operátory pro klauzuli WHERE Agregační funkce Jednořádkové funkce Víceřádkové funkce
Relační algebra Je matematickým jazykem pro zápis dotazů (výsledků operace vyhledávání) nad souborem dat Pracuje se vždy s celou relací naráz (rozdíl proti n- ticovému kalkulu) Pro snazší pochopení si představte relace jako jednotlivé věty v souboru (relace jsou řádky v tabulce v Excelu s omezeným počtem sloupců, tj. atributů)
Relační algebra Pojem relace Práce s celými relacemi Množinové operace nad relacemi Projekce, selekce Užití kartézského součinu nad relací totální výčet kombinací možností další aplikací selekce lze vybrat smysluplné varianty právě výběrem variant se zabývá spojení
Relační algebra a spojení Spojení je aplikací selekce na kartézský součin Umožňuje vytvářet smysluplné kombinace relací Přirozené spojení pracuje intuitivně Vnější spojení umožní doplnit údaje jedné relace relací druhou Levé, pravé, plné vnější spojení Přirozené je nejvýše tak velké jako vnější
Využití relační algebry Umožňuje položení dotazů nad relacemi Aplikací selekce lze omezit počet vět Projekce zužuje na vybrané atributy Spojení umožní kombinovat jednotlivé relace dohromady Množinové operace umožní kombinovat výsledky více dotazů Vnořování relací (relace jako část selekce)
Příklad dotazu v RA Verbální zadání: Chceme seznam kin, kde nedávají žádný film s Vladimírem Menšíkem. Dotaz v relační algebře: KINO[NAZEV_K] (FILM(HEREC= Menšík )[JMENO_F] * PROGRAM[NAZEV_K,JMENO_F]) [NAZEV_K]
AUTO(SPZ, ZNAČKA, TYP, POČET_MÍST, ROK_VÝROBY) SPZ ZNAČKA TYP POČET_MÍST ROK_VÝROBY BZX 17-93 Škoda Felicia 5 1998 BZY 27-06 Wolksvagen Caddy 2 1996 9B8 0005 Volvo C30 5 2007 0B7 4949 Škoda Fabia 5 2006 6B3 1754 Renault Mégane 5 2004 3A7 3000 Wolksvagen New Beetle 4 2005 AKR 68-80 Škoda Fabia 5 2000 BMM 17-90 Fiat 128 5 1984 3B3 1234 Renault Clio 4 2000 ZÁKAZNÍK(IDZ, JMÉNO, VĚK, ADRESA) IDZ JMÉNO VĚK ADRESA 1 Martin Dvořák 37 Břeclav 2 František Nový 29 Znojmo 3 Jana Smutná 35 Brno 4 Tomáš Ondřej 52 Znojmo 5 Eliška Sličná 19 Hodonín 6 Matěj Novák 33 Brno 7 Blanka Panenská 56 Brno PUJČENÍ(ZÁKAZNÍK, AUTO) ZÁKAZNÍK AUTO 6 9B8 0005 1 0B7 4949 5 0B7 4949 4 BZX 17-93 6 3A7 3000 7 AKR 68-80 1 6B3 1754 3 AKR 68-80 1 3B3 1234
n-ticový relační kalkul Jiný způsob zadání dotazu (jiný matematický formalismus než RA) { x 1,, x n A(x 1,, x n ) } Umožňuje výběr množiny atributů kladením podmínek na tyto atributy Podmínky mohou vymezovat atributy z jiných relací nebo omezit podmínkami tyto atributy
Příklad na n-ticový kalkul Přirozené spojení dvou relací by v n-ticovém kalkulu bylo možné zapsat : { p.nazev_k, k.adresa, p.jmeno_f, p.datum PROGRAM(p) KINO(k) k.nazev_k = p.nazev_k }
Srovnání RA a NRK Oba nástroje mohou vyřešit stejnou třídu problémů Existují tedy způsoby přepisu operací relační algebry do n-ticového relačního kalkulu Dotazy lze vnořovat do sebe (vytváření příslušných n-tic, které jsou užity v jiné n-tici v omezujících podmínkách)
Data query language Prostředek pro získávání údajů z DB Velmi mocný nástroj odrážející celou relační algebru Strukturovaný příkaz SELECT obsahuje několik jasně definovaných částí Povinné jsou pouze dvě projekce a definice zdrojů Zdroj musí být vždy uveden (dual)
Interní rozdělení SQL Rozdělíme si SQL příkazy na tři postupně probrané kategorie: jednoduché dotazy 1 úroveň, bez množin množinové dotazy 1 úroveň, množiny vnořené dotazy více úrovní, užití množin Uvedené typy SQL lze ve vyspělém RDBMS (jako je Oracle) vhodně kombinovat (jednoduché SQL databáze ne vždy tuto možnost podporují)
Anatomie příkazu SELECT SELECT zdrojová projekce FROM datové zdroje [ WHERE selekce ] [ GROUP BY seskupení [ HAVING selekce seskupení ] ] [ ORDER BY řazení ]
Konvence užití Jednotný zápis, není povinný Je více než vhodný Klíčové slovo (SELECT, FROM) reprezentuje jeden SQL příkaz/funkci Výraz je část SQL příkazu Příkaz definujeme jako kombinaci minimálně dvou výrazů
Základní užití SELECT * FROM tabulka představuje prosté použití relace tabulka SELECT atr 1, atr 2 FROM tabulka představuje navíc aplikaci projekce na relaci tabulka[atr 1, atr 2 ]
Projekce a selekce
Aplikace selekce v dotazu Klasický zápis v relační algebře: tabulka(atr 1 =konst) V SQL se přepíše jako podmínka: SELECT * FROM tabulka WHERE atr 1 = konst Pro přepis selekcí možnosti OR, AND, NOT, závorky, relační operátory
Kombinace selekcí a projekce Klasický zápis v relační algebře: tabulka[atr 1,atr 2 ] (atr 1 =konst 1 atr 2 <konst 2 ) Lze do SQL přepsat jako: SELECT atr 1, atr 2 FROM tabulka WHERE atr 1 = konst 1 AND atr 2 < konst 2
Řazení výsledků v SQL Nejedná se o třídění, ale o řazení!!! Využití klauzule ORDER BY Čárkou oddělený seznam sloupců podle priority řazení (řadí se vzestupně) Možnost stanovit směr pomocí ASC, DESC Implicitní řazení není definováno Specifikace NULLS FIRST LAST Př.: SELECT * FROM tabulka ORDER BY atr 1 DESC, atr 2 ASC
Klauzule WHERE Klauzule WHERE je aplikací SELEKCE z RA WHERE název_sloupce srovnávací_podmínka názvy_sloupců, konstanty nebo seznam hodnot V klauzuli WHERE nelze použít alias Srovnání lze požít srovnávacích oprátorů pro Číselné datové typy Řetězce Datum a čas
Srovnávací operátory Základní množinu tvoří matematické operátory =, je rovno >, větší než >=, vetší nebo rovno <, menší než <=, menší nebo rovno <>, různý od (nebo!=, nebo také ^=) Pro srovnání řetězců nebo data a času uvedeme srovnávaný vzor do jednoduchých uvozovek -
Porovnání řetězců Která z následujících podmínek bude správně? WHERE last_name = vomáčka WHERE last_name = Vomáčka
Porovnání řetězců Porovnání řetězců je implicitně case-sensitive WHERE event_date = 17-MAR-11 WHERE last_name = Vomáčka WHERE price >= 2000 Kromě dříve zmíněných základních jsou možné i jejich kombinace pro specifická data, jsou to BETWEEN... AND... IN LIKE
Porovnání řetězců BETWEEN... AND... IN Zahrnuje rovněž hraniční hodnoty WHERE year >= 1999 AND year <= 2010 Z pohledu výkonnosti není rozdíl v užití BETWEEN nebo výše zmíněné alternativy De facto množina přípustných hodnot Testování náležitosti aktuální hodnoty do výčtu hodnot Lze přepsat pomocí OR operátorů
Porovnání řetězců LIKE V rámci vyhledávaní alternativ lze použít dva zástupné symboly Symbol %, reprezentuje nula nebo více znaků Symbol _, reprezentuje právě jeden znak V případě, že jsou v prohledávaných řetězcích ony dva znaky, pro escapování použijeme \
SELECT last_name FROM employees WHERE last_name LIKE _o% ; Který z náseledujících zaměstnanců vyhovuje? 1. Sommersmith 2. Oog 3. Fong 4. Mo
Práce s NULL IS NULL Pro hledání prázdných, nepřiřazených nebo neznámých dat IS NOT NULL Opak IS NULL, tedy pro data obsažená v databázi SELECT last_name, manager_id FROM employees WHERE manager_id IS NULL;
Logické operátory Kombinují výsledky dvě nebo více podmínek pro získání jednoho výsledku AND, vrací TRUE právě když jsou splněny obě podmínky OR, vrací TRUE když je jedna z podmínek platná NOT, vrací TRUE když podmínka naplatí Jak vyhodnotíte následující dotaz?
Vyhodnoťte následující dotaz SELECT last_name ' ' salary*1.05 As "Employee Raise" FROM employees WHERE department_id IN(50,80) AND first_name LIKE 'C%' OR last_name LIKE '%s%';
Priorita vyhodnocování AND operátor má tedy přednost před OR V případě, kdy jedna z podmínek u AND není splněna, volí se řádky na základě OR podmínky Priorita Operace 1 Aritmetické, + - * / 2 Zřetězení 3 Porovnání <, <=,, <> 4 IS (NOT) NULL, (NOT) IN, LIKE 5 (NOT) BETWEEN 6 NOT 7 AND 8 OR
Vyhodnoťte následující dotaz SELECT last_name, specialty, auth_expense_amt FROM d_partners WHERE (specialty ='All Types OR specialty IS NULL) AND auth_expense_amt = 300000;
Databázové funkce Funkce dělíme na Jedno-řádkové Více-řádkové
Jedno-řádkové funkce Na vstupu mají vždy právě jeden řádek a i jeden řádek vrací Manipulace s datovými položkami Rozlišují argumenty a na jejich základě vrací hodnotu Pracující opakovaně vždy s jedním řádkem Mohou upravovat datové typy
Jedno-řádkové funkce pro znaky Mohou převádět malá písmena na velká a opačně, spojovat, extrahovat, hledat, vkládat a vystřihovat znaky z řetězců Jedno-řádkové funkce mohou být použity v části SELECT, WHERE a ORDER BY Dělíme je na Funkce pro práci s velikostí písma (case) Funkce pro práci se znaky
Jedno-řádkové funkce pro znaky
Funkce pro práci s velikostí písma INITCAP(sloupec výraz) Mění styl prvního znaku na velké písmeno pro každé slovo SELECT title FROM d_cds WHERE INITCAP(title)= Carpe Diem ;
Funkce pro práci se znaky CONCAT('Hello', 'World') HelloWorld SUBSTR('HelloWorld', 1, 5) Hello LENGTH('HelloWorld') 10 INSTR('HelloWorld','W') 6 LPAD(salary, 10, * ) *****24000 RPAD(salary, 10, '*') 24000***** TRIM('H' FROM 'HelloWorld') elloworld REPLACE('JACK and JUE', 'J', 'BL') BLACK and BLUE
Funkce pro práci s velikostí písma Při použití funkcí lze rovněž využívat také aliasů Funkce lze rovněž zanořovat do sebe SELECT LOWER (last_name) LOWER(SUBSTR(first_nam e,1,1)) AS "User Name" FROM f_staffs;
Funkce pro práci s čísly 3 funkce: ROUND, TRUNC, MOD ROUND(column expression, decimal places) Pracuje s číselnými datovými typy i datem a časem ROUND(45.926) 46 ROUND(45.926, 0) ROUND(45.926, 2), vrací 45.93 ROUND(45.926, -1), vrací 50
Funkce pro práci s čísly TRUNC(column expression, decimal places) Pracuje s číselnými datovými typy i datem a časem TRUNC(45.926) TRUNC(45.926, 0) 45 TRUNC(45.926, 2), vrací 45.92 TRUNC na rozdíl od ROUND nezaokrouhluje číslo, ale zkrátí ho na požadovaná desetinná místa
Funkce pro práci s čísly MOD(number1, number2) Vrací zbytek po celočíselném dělení Typicky pro zjišťování zda je číslo sudé nebo liché SELECT MOD(1600,500) FROM DUAL; Vrací 100
Funkce pro práci s datem Výchozí zobrací formát data je DD-MON-RR, ale datum je ukládáno s přesností na sekundy Systémové datum zjistíme pomocí funkce SYSDATE SELECT SYSDATE FROM DUAL;
Funkce pro práci s datem MONTHS_BETWEEN ADD_MONTHS NEXT_DAY LAST_DAY ROUND, TRUNC Počet měsíců mezi dvěma daty Přidá kalendářní měsíce k datu Vrátí den následující po zadaném Vrátí poslední den měsíce Zaokrouhlí/ořízne datum
Použití ROUND a TRUNC SYSDATE = 25-JUL-95 Použitá funkce ROUND (SYSDATE, 'MONTH') ROUND (SYSDATE, 'YEAR') TRUNC (SYSDATE, 'MONTH') TRUNC (SYSDATE, 'YEAR ) Výsledek 01-AUG-95 01-JAN-96 01-JUL-95 01-JAN-95
Konverzní funkce
Konverze DATE na znaky Funkce TO_CHAR TO_CHAR(date column name,'format model') Format model musí být vždy v jednoduchých uvozovkách Umožnuje použití dvojitých uvozovek pro přidání řetězců do format model části
Konverze DATE na znaky Různé formáty pro výstup z funkce TO_CHAR
Konverze znaků na DATE Zajišťuje ji funkce TO_DATE, Umožňuje konverzi řetězců do DATE formátu TO_DATE('character string', 'format model') Př. Převod řetězce Březen 17, 2011 do příslušného datového typu TO_DATE('November 3, 2001', 'Month dd, RRRR')
Konverze čísel na znaky Konverzní funkce umožňuje formátovat různé typy výstupů Př.
Problém jménem NULL Existují situace, kdy je nutné zahrnout výskytu všech hodnot databázi do různých reportů (typicky při přípravě statistik) Hodnoty NULL však mohou výrazně ovlivnit výsledek, je nutné je tedy ošetřit Funkce pro práci s NULL NVL, NVL2 NULLIF COALESCE
NVL Konvertuje NULL hodnotu na definovaný pevný datový typ SELECT NVL(comments, 'no comment') FROM D_PLAY_LIST_ITEMS; Př. NVL(auth_expense_amt,0) NVL(hire_date,'01-JAN-97') NVL(speciality,'None Yet')
NVL2 Má 3 atributy, která ve zkratce pracují takto Není-li hodnota argumentu NULL, pak funkce vrací druhý argument Je-li první hodnota argumentu NULL, pak funkce vrací třetí argument SELECT last_name, salary, NVL2(commission_pct, salary + (salary * commission_pct), salary) AS income FROM employees;
NULLIF Porovnává dvě funkce, výrazy Pokud jsou shodné, funkce vrací NULL Pokud jsou různé, vrací funkce první výraz SELECT first_name, LENGTH(first_name) "Length FN", last_name, LENGTH(last_name) "Length LN", NULLIF(LENGTH(first_name), LENGTH(last_name)) AS "Compare Them" FROM D_PARTNERS;
COALESCE Rozšíření funkce NVL o možnost práce s více výrazy COALESCE ( expression 1, expression 2,... expression n) V případě, že je první výraz NULL, funkce pokračuje v běhu až narazí na první ne-null hodnotu, kterou vrátí
COALESCE SELECT last_name, COALESCE(commission_pct, salary, 10) comm FROM employees ORDER BY commission_pct; Který z prodejců nedostává provizi?
Více-řádkové funkce Pracují s množinou vstupů a vrací jeden souhrnný výsledek AVG COUNT MAX MIN SUM