SQL Přednáška DB1
Literatura CONNOLLY, T.M.-BEGG,C.E.-STRACHAN,A.D.: Database Systems – A Practial Approach to Design, Implementation and Management. University of Paisley, Addison-Wesley Publ. Comp., ISBN , POKORNÝ,J.: Počítačové databáze. Výběr informací z organizační a výpočetní techniky, Kancelářské stroje, Praha, 1991.
Základní vlastnosti SQL Structured Query Language Vytvoření databáze a struktury relací ISO SQL standard obsahuje dvě základní komponenty –DDL –DML Neprocedurální jazyk užití: administrátor (DBA), management, vývojář aplikace, koncový uživatel
Základní příkazy SQL DDL –CREATE TABLE, ALTER TABLE, DROP TABLE –totéž pro VIEW –CREATE INDEX, DROP INDEX –SET TRANSACTION –GRANT, REVOKE DML –SELECT –INSERT –UPDATE –DELETE
Jak psát příkazy Každý příkaz musí začínat na nové řádce. Příkaz SQL rozlišuje rezervovaná slova a uživatelem definovaná slova (názvy objektů). Rezervovaná slova nesmí být dělená do dvou řádků. Příkaz SQL bývá dost často ukončen, a to středníkem „;“ SQL není case sensitive, jen hodnoty textového argumentu musí být napsány přesně.
Příkaz SELECT SELECT [ DISTINCT | ALL ] { * | [ sloupcový_výraz [AS nový_název] ] [, …] } FROM název_tabulky [alias] [, … ] [ WHERE podmínka ] [GROUP BY seznam_sloupců ] [ HAVING podmínka ] [ORDER BY seznam_sloupců ] Sloupcový výraz - název sloupce nebo výraz
Získání celé tabulky SELECT Isbn, Inv_č, D_nákupu, Cena, Země_vydání FROM Exemplář; SELECT * FROM Exemplář;
Projekce SELECT Země_vydání FROM Exemplář; SELECT DISTINCT Země_vydání FROM Exemplář;
Vypočítaná položka SELECT Isbn, Inv_č, D_nákupu, Cena, Cena/1.05 AS bez_DPH, Země_vydání FROM Exemplář;
Selekce SELECT * FROM Exemplář WHERE Země_vydání = ‘GB‘; =, != nebo <>,, >=, AND, OR, NOT SELECT * FROM Exemplář WHERE Země_vydání = ‘GB‘ OR Země_vydání = ‘USA‘; SELECT * FROM Exemplář WHERE Cena BETWEEN 300 AND 900; SELECT * FROM Exemplář WHERE Země_vydání IN (‘GB‘, ‘USA‘ ); výčet hodnot interval
Výběr podle vzoru SELECT * FROM Exemplář WHERE Země_vydání LIKE ‘G%‘; SELECT * FROM Exemplář WHERE Země_vydání LIKE ‘G_‘; SELECT * FROM Exemplář WHERE Země_vydání LIKE ‘U_ _‘ ; SELECT * FROM Exemplář WHERE Země_vydání LIKE ‘%A‘ ; SELECT * FROM Exemplář WHERE Země_vydání NOT LIKE ‘G%‘; SELECT * FROM Exemplář WHERE Země_vydání LIKE ‘%A%‘;
Test prázdné hodnoty SELECT * FROM Exemplář WHERE Země_vydání IS NULL; SELECT * FROM Exemplář WHERE Země_vydání IS NOT NULL;
Řazení SELECT * FROM Exemplář ORDER BY Cena; SELECT * FROM Exemplář ORDER BY Cena Desc; SELECT * FROM Exemplář ORDER BY Země_vydání, Cena
Agregované funkce COUNT počet hodnot ve sloupci (počet řádků) SUM součet hodnot ve sloupci AVG průměr hodnot z daného sloupce MIN minimální hodnota MAX maximální hodnota SELECT COUNT(*) AS z_GB FROM Exemplář WHERE Země_vydání = ‘GB’ SELECT COUNT( DISTINCT Země_vydání) AS různých_zemí FROM Exemplář SELECT SUM(Cena) AS za_kolik_z_GB FROM Exemplář WHERE Země_vydání = ‘GB’
Vnořený select Najdi čísla čtenářů, kteří bydlí v Plzni a mají vypůjčenou nějakou knihu. SELECT Č_čt FROM Čtenář WHERE adresa LIKE ’%Plzeň%’ AND Č_čt IN (SELECT Č_čt FROM Výpůjčka); Najdi jména čtenářů, kteří mají rezervovanou knihu Babička. SELECT Jméno FROM Čtenář WHERE Č_čt IN (SELECT Č_čt FROM Rezervace WHERE ISBN = (SELECT ISBN FROM KNIHA WHERE Titul = ’Babička’)); Poznámka: máme zaručeno, že existuje právě jeden záznam Babičky s ISBN
Grupování SELECT COUNT(Inv_č), SUM(Cena) AS celkem, Země_vydání FROM Exemplář GROUP BY Země_vydání ORDER BY Země_vydání početCelkemZemě_vydání 31950GB 21562USA SELECT COUNT(Inv_č), SUM(Cena) AS celkem, Země_vydání FROM Exemplář GROUP BY Země_vydání HAVING COUNT(Inv_č) > 2 ORDER BY Země_vydání
Agregované funkce ve vnořeném selektu Vypiš zaměstnance, kteří mají nadprůměrný plat a uveď o kolik SELECT Číslo_zam, Jméno, Funkce, Plat – (SELECT AVG(Plat) FROM Zaměstnanci) AS nad_průměr FROM Zaměstnanci WHERE plat > (SELECT AVG(Plat) FROM Zaměstnanci); ORDER BY nesmí být ve vnořeném selektu použito, vnořený SELECT musí obsahovat jméno jednoho sloupce nebo výraz (vyjma EXISTS), jméno sloupce se vztahuje k tabulce uvedené ve vnořeném selektu, jestliže je vnořený selekt jedním ze dvou operandů, musí být uveden na pravé straně.
Sjednocení UNION – sjednocení dvou tabulek se stejnými sloupci Najdi čísla čtenářů, kteří mají vypůjčené nebo rezervované knihy do SELECT Č_čt FROM Výpůjčka WHERE D_zpět < ’ ’ UNION SELECT Č_čt FROM Rezervace WHERE D_rez < ’ ’; Č_čt INTERSECT - průnik EXCEPT - rozdíl
Spojení - SELECT přes více tabulek 1:N Najdi čísla čtenářů a knihy, které mají vypůjčeny. SELECT a.Č_čt, Inv_č FROM Čtenář a, Výpůjčka b WHERE a.Č_čt = b.Č_čt; Najdi čísla čtenářů a názvy knihy, které mají rezervovány. SELECT a.Č_čt, Název FROM Čtenář a, Rezervace b, Kniha c WHERE a.Č_čt = b.Č_čt AND b.ISBN = c.ISBN Poznámka: - FROM Čtenář a JOIN Výpůjčka b ON a.Č_čt = B.Č_čt; - FROM Čtenář JOIN Výpůjčka USING Č_čt¨; - FROM Čtenář NATURAL JOIN Výpůjčka - nepoužijeme-li WHERE, získáme kartézský součin, totéž lze SELECT ….. FROM Čtenář CROSS JOIN Výpůjčka (formálně ano, logicky nesmysl)
SELECT – FROM - WHERE je v praxi základní konstrukcí jazyka SQL
LEFT, RIGHT a FULL spojení Zahrnuje i neporovnatelné řádky ze spojení SELECT a.*, b.* FROM Čtenář a LEFT JOIN Výpůjčka b ON a.Č_čt = b.Č_čt; LEFT JOIN poskytne nejen ty čtenáře, ke kterým byla nalezene výpůjčka, a to každého tolikrát, kolik výpůjček mají, ale i ty čtenáře, kteří výpůjčku nemají. Hodnoty z Výpůjčky jsou NULL. Obecně: LEFT JOINT připojí i ty řádky, které z levé (první) tabulky nemají v pravé (druhé) relaci (tabulce) odpovídající prvek (řádku). - RIGHT JOIN – připojuje neporovnané řádky z pravé (druhé) tabulky - FULL JOIN – připojuje neporovnané řádky jak z první tak ze druhé tabulky
Test existence (EXISTS a NOT EXISTS) Najdi jména čtenářů, kteří mají rezervovanou nějakou knihu, SELECT Jméno FROM Čtenář WHERE EXISTS ( SELECT * FROM Rezervace WHERE Č_čt = Čtenář.Č_čt) Výsledkem je hodnota true tehdy a jen tehdy, je-li v tabulce poddotazu alespoň jedna řádka. Jinak je hodnota false.
Vložení prvku relace (řádky) INSERT INTO název_tabulky [(seznam_sloupců)] VALUES (seznam_dat) Hodnoty se uzavírají do apostrofů, pouze číselné hodnoty ne. Hodnoty se oddělují čárkou. INSERT INTO Čtenář ( Č_čt, Jméno) VALUES (‘123’,’Novák Petr’); INSERT ukládá výsledek dotazu do tabulky. Vytvořme relaci obsahující čtenáře a počet vypůjčených knih. CREATE TABLE Statistika (Č-čt char (4), Počet SMALLINT); INSERT INTO Statistika SELECT Č_čt, COUNT(Inv_č) FROM Výpůjčka GROUP BY Č_čt;
Zrušení prvku relace (řádky) DELETE FROM název_tabulky WHERE podmínka DELETE FROM Kniha WHERE Autor = ‘B.Němcová’; zrušení všech řádek DELETE FROM Kniha
Změna prvku relace (řádky) UPDATE název_tabulky SET název_sloupce = hodnota_dat, [ název_sloupce_2 = hodnota_dat] [WHERE podmínka] UPDATE Čtenář SET Adresa = ‘Plzeň, Univerzitní 8’ WHERE Č_čt = ‘123’
Výraz relační algebry x příkaz SELECT StudentZnámka 1 N Č_stud Studijní_obor Předmět Známka Vypiš jména všech studentů studijního oboru počítačové sítě, kteří mají z předmětu DB1 jedničku. ((Student (studijní_obor = ‘počítačové sítě’) * (Známka (Předmět = ‘DB1’ AND Známka = 1)) [Jméno] SELECT Jméno FROM Student a, Známka b WHERE Studijní_obor = ‘počítačové sítě’ AND a.Č_stud = b.Č_stud AND Předmět = ‘DB1’ AND Známka = 1
DDL Datové typy ISO SQL – tabulky, pohledy, jména, sloupce –znaková sada: A … Z, a … z, 0 … 9 a „_“, –identifikátor max. 128 znaků, –identifikátor musí začínat písmenem, –identifikátor nesmí obsahovat mezeru
Definice tabulky CREATE TABLE jméno_tabulky ( { název_sloupce datový_typ [ NOT NULL ] [ UNIQUE ] [ DEFAULT hodnota ] [ CHECK ( výběrová_podmínka ) [, název_sloupce … ]} [ PRIMARY KEY ( seznam_názvů_sloupců ), ] { [ FOREIGN KEY ( seznam_názvů_sloupců_tvořící_cizí_klíč ) REFERENCES název_nadřazené_tabulky [( seznam_názvů _sloupců )], [ MATCH { PARTIAL | FULL }] [ ON UPDATE referenční akce ] [ ON DELETE referenční akce ] ] [, … ] } { [ CHECK ( výběrová_podmínka ) [, …] } )
Datový typ Logická proměnná BOOLEAN TextCHARVARCHAR BitBITBIT VARYING Přesné výpočty NUMERICDECIMALINTEGERSMALLINT Přibližné výpočty FLOATREALDOUBLE PRECISION ČasDATETIMETIMESTAMP IntervalINTERVAL Rozsáhlé objekty CHARACTER LARGE OBJECT BINARY LARGE OBJECT
Výběrová podmínka - příklady den_v_týdnu CHAR (2) NOT NULL CHECK ( den_v_týdnu IN ( ‘Po’, ‘Út’, ‘St’, ‘Čt’, ‘Pá’, ‘So’, ‘Ne’)) plat INT CHECK ( plat > 0 ), odmena INT CHECK ( odmena < 0.5 * plat ) pocet_kreditu SMALLINT CHECK ( pocet_kreditu BETWEEN 1 AND 6 ) Podle ANSI SQL89 mohl být odkaz jen na položky definované v tabulce. Podle ANSI SQL92 (též SQL2) může být odkaz i na jinou tabulku – pomocí konsturkce SELECT.
Deklarativní realizace integritních omezení CREATE TABLE Předmět ( …. FOREIGN KEY ( garant ) REFERENCES ucitele (cislo_ucitele) …. ) UcitelePredmet 1 N cislo_ucitele Předmět Garant ANSI SQL-86pouze NOT NULL a UNIQUE ANSI SQL-89 PRIMARY KEY CHECK (viz „výběrová kriteria“) FOREIGN KEY a REFERENCES
Deklarativní realizace integritních omezení pokr. ANSI SQL-92 (též SQL2) definice cizího klíče doplněna ON DELETE CASCADE ON UPDATE CASCADE ON DELETE SET NULL ON UPDATE SET NULL nová syntaxe CHECK – možnost vložení příkazu SELECT Př.: Vedoucím katedry může být jen profesor nebo docent. Informace o titulu je uložena v tabulce Učitelé. CREATE TABLE katedry ( … vedoucí CHAR (8) CHECK ( EXISTS SELECT * FROM Ucitele WHERE vedouci = ucitele.cis AND titul IN ( ‘Prof’, ‘Doc’ )) … )
Referenční IO UcitelePredmet 1 N cislo_ucitele Zkratka Garant Vyuka Zkratka Garant 11 N N CREATE TABLE Vyuka ( … FOREIGN KEY ( Garant) REFERENCES Ucitele (cislo_ucitele) ON UPDATE CASCADE ON DELETE CASCADE, FOREIGN KEY ( Zkratka) REFERENCES Predmet ON UPDATE CASCADE ON DELETE CASCADE …. ) CREATE TABLE Předmět (… FOREIGN KEY ( Garant) REFERENCES Ucitele (cislo_ucitele) ON UPDATE CASCADE ON DELETE NULL … )
Pohledy CREATE VIEW jméno_pohledu [ (nové_jméno_sloupce [, …])] AS subselect [WITH [CASCADED | LOCAL] CHECK OPTION] Dynamická struktura Výsledek jedné nebo více relačních operací Vznik nové relace, která je virtuální, v databázi neexistuje, je uložen pouze její popis.