Informatika II PAA DOTAZOVACÍ JAZYKY 6.3.2001
Dotazy v DBS Účel dotazovacích jazyků: zprostředkovat informace uživateli umožnit různé pohledy na uložená data zajistit jednoduchý způsob formulace dotazu předat požadovanou odpověď rychle a ve srozumitelné podobě
Dotazy - základní operace operace projekce operace selekce logický součin - operátor AND logický součet - operátor OR logická negace - operátor NOT spec. operátory Like, Blank, Today zástupné operátory .. operace spojení join
Obecné charakteristiky dotazovacích jazyků relační operátory se používají pro celé relace výsledkem operace (dotazu) je vždy nová relace operátory pracují s hodnotami atributů
Dotazovací jazyky Podle způsobu zadávání rozlišujeme: procedurální jazyky nutné zadat algoritmus pro získání požadované odpovědi určeny pro profesionální programátory neprocedulární jazyky jednodušší, zadávají se jen podmínky, které má požadovaná odpověď splňovat QBE, SQL
Relační dotazovací jazyky SQL - založené na množinách relační algebra relační kalkul QBE - založené na predikátové logice
Relační kalkul Kalkul = způsob formalizovaného zápisu. Relační kalkul – formalizovaný a symbolický způsob zápisu stejných operací, které vymezuje relační algebra. n-ticový kalkul – na relaci se nahlíží jako na množinu řádků doménový kalkul – na relaci se nahlíží jako na množinu sloupců (domén).
QBE – Query By Example zadávání dotazů v grafické podobě na základě interaktivní komunikace mezi DBS a uživatelem
QBE – MS Access Spuštění dotazu
QBE – MS Access
QBE – MS Access
SQL – Structured Query Language při jeho tvorbě dodržena zásada přiblížit specifikování dotazu principu kladení otázek v přirozeném jazyce, tj. angličtině je deklarativní – příkazy jazyka specifikují „co“ se má provést a ne „jak“
SQL - představení SQL - Structured Query Language 1974 Sequel, počátky vývoj - nejdříve jednouživatelské SŘBD s SQL přístup k lokální databázi později DB servery založené na SQL víceuživatelské přístupy (klient / server) Časti SQL: DDL - Data Definition Language, pro definici dat DML - Data Manipulation Lang., pro manipulaci s daty DCL - Data Control Lang., definice přístupových práv
SQL – typografické konvence volitelné části příkazu v [] seznam atributů, kterých se příkaz týká: atrib1 [, atrib2…..] Select * znamená všechny atributy (sloupce) Distinct (Unique) zajistí unikáty ve výsledné relaci | použité v některých příkazech znamená větvení {} povinná část příkazu Having podmínka = splňující podmínku (-y)
SQL – vytvoření tabulky CREATE TABLE syntaxe CREATE TABLE jméno_tabulky (jméno_sloupce typ_sloupce, ... ) př. CREATE TABLE Zamestnanci ( OsobniCislo int NOT NULL, Jmeno varchar(40), RC varchar(11), Adresa varchar(60), Plat float, PRIMARY KEY (OsobniCislo) );
SQL – přidání záznamu INSERT INTO syntaxe INSERT INTO jméno_tabulky VALUES (hodnota1, ..., hodnotaN) př. INSERT INTO Zamestnanci VALUES ( 1023, 'Novák Jan', '561220/0235', 'Levá 13, Praha 4', 12000);
SQL – modifikace struktury ALTER TABLE syntaxe ALTER TABLE jméno_tabulky ADD (jméno_sloupce datový_typ, …) př. ALTER TABLE Zamestnanci ADD Telefon varchar(8);
SQL – rušení záznamů DELETE syntaxe DELETE FROM jméno_tabulky [WHERE podmínka] př. DELETE FROM Zamestnanci WHERE OsobniCislo = 1023;
SQL – opravy dat UPDATE syntaxe UPDATE jméno_tabulky SET položka=hodnota, ... WHERE podmínka př. UPDATE Zamestnanci SET Plat = 14000 WHERE OsobniCislo = 1023;
SQL – rušení relace DROP TABLE syntaxe DROP TABLE jméno_tabulky př. DROP TABLE Zamestnanci;
SQL – výběr a prohlížení SELECT syntaxe SELECT * FROM jméno_tabulky SELECT * FROM Zamestnanci; selektivní výběr podmínka za klíčové slovo WHERE př. SELECT * FROM Zamestnanci WHERE Jmeno LIKE 'Novák Jan'; SELECT * FROM Zamestnanci WHERE Jmeno LIKE 'Nov*';
SQL – výběr a prohlížení SELECT * FROM Zamestnanci WHERE OsobniCislo = 1230; WHERE Plat > 10000; lze použít i logické operátory AND a OR WHERE Jmeno LIKE 'Novák *' AND Plat < 6000;
SQL – výběr a prohlížení za SELECT lze uvést seznam atributů, jež se ve výsledku zobrazí př. SELECT Jmeno, Plat FROM Zamestnanci WHERE Plat > 15000; třídění výstupu – ORDER BY za jménem sloupce buďto DESC (sestupně) nebo ASC (vzestupně) př. SELECT * FROM Zamestnanci ORDER BY Plat ASC;
SQL – agregované funkce pracují s hodnotami ve sloupci v rámci celé tabulky (vrací 1 výsledek pro celý sloupec tabulky) COUNT(*) COUNT(jméno_sloupce) SUM(jméno_sloupce) MIN(jméno_sloupce) MAX(jméno_sloupce) AVG(jméno_sloupce)
SQL – agregované funkce SELECT COUNT(*) FROM Zamestnanci WHERE Plat > 14000; doplnění o textový řetězec SELECT ‘Počet zaměstnanců =‘,COUNT(*) FROM Zamestnanci WHERE Plat > 14000; SELECT MAX(Plat), MIN(Plat), AVG(Plat) FROM Zamestnanci;
Predikáty ve výběrové podmínce BETWEEN, IN a LIKE SELECT * FROM Zamestnanci WHERE Plat BETWEEN 12000 AND 15000; SELECT * FROM Zamestnanci WHERE Plat IN (12000, 15000); ODPOVÍDÁ WHERE Plat = 12000 OR Plat = 15000 SELECT * FROM Zamestnanci WHERE Jmeno LIKE “N*”;
Další zástupné znaky * - pro libovolný počet znaků ? – odpovídá jednomu libovol. abecednímu znaku [ae] – odpovídá jednomu ze znaků uvedených v [] [!ae] – odpovídá libovolnému znaku, který není uveden v závorkách [a-e] – odpovídá znakům v daném rozsahu # - odpovídá jakékoliv číslici př. …WHERE Plat LIKE “12*” WHERE Plat LIKE “12??” nebo WHERE Plat LIKE “12##” WHERE Jmeno LIKE “Nov[ae]*” nebo “Nov[!a]*”
Spojení (join) umožňuje zpracovávat data ze dvou či více tabulek vnitřní spojení kombinuje tabulky na základě porovnání hodnot ve sloupcích, které jsou tabulkám společné INNER JOIN jm_tabulky ON společné sloupce používá se „tečková notace“ jm_relace.jm_sloupce
Příklad spojení 2 tabulek př. SELECT idvyrobku, nazevvyrobku, nazevkategorie FROM kategorie INNER JOIN vyrobky ON vyrobky.idkategorie = kategorie.idkategorie; Výsledek idvyrobku nazevvyrobku nazevkategorie 1 Cola Napoje 2 Pepsi 3 Víno 4 Steak Pokrmy Pokrmy 2 Napoje 1 nazevkategorie idkategorie Kategorie Steak 4 Víno 3 Pepsi Cola nazevvyrobku idvyrobku Vyrobky
Příklad spojení 3 tabulek SELECT objednavky.idzakaznika, rozpisobj.idobjednavky, vyrobky.nazevvyrobku, rozpisobj.mnozstvi FROM (rozpisobj INNER JOIN objednavky ON rozpisobj. idobjednavky = objednavky. idobjednavky) INNER JOIN vyrobky ON rozpisobj.idvyrobku = vyrobky. idvyrobku WHERE objednavky. idzakaznika ="vinet"; 16 3 1001 24 1 18 2 1002 15 1000 10 mnozstvi idvyrobku idobjednavky Rozpisobj Ben Vinet kodzakaznika Objednavky Víno Pepsi Cola nazevvyrobku Vyrobky Výsledek kodzakaznika idobjednavky nazevvyrobku mnozstvi vinet 1000 Cola 10 Pepsi 15 1001 24 Víno 16