Databázové systémy Cvičení 6: SQL
Co je SQL? SQL = Structured Query Language SQL je standardním (ANSI, ISO) textovým počítačovým jazykem SQL umožňuje jednoduchým způsobem přistupovat k datům v databázi vznášet dotazy na data (agregační funkce apod.), vyzvedávat data z databáze (dataset text, tabulka, XML,...), vkládat nové záznamy do databáze, mazat záznamy z databáze, aktualizovat záznamy v databázi, měnit strukturu databáze (struktura záznamů, indexy,...) standardní počítačový jazyk pro přístup a manipulaci s databází.
SQL je standard, ale... Standardní SQL nalezneme v mnoha DB prostředích (MS Access, DB2, Informix, MS SQL Server, Oracle, Sybase,...) Všechna tato prostředí obsahují různě zpracované interpretery SQL, základní operace stanovené ANSI (např. příkazy SELECT, UPDATE, DELETE, INSERT, klauzule WHERE, ) však obsahují všechny. Nejčastěji diskutované rozdíly v různých interpretacích SQL spočívají v proprietárních rozšířeních původního standardu.
Data ke kterým přistupujeme SQL Databáze je zpravidla tvořena jednou nebo více tabulkami. Každá tabulka je jednoznačně identifikovatelná svým jménem (např. Adresář, Objednávky..). Tabulky obsahují záznamy/struktury s daty, např. Jméno: Příjmení: Adresa: Město: PSČ: Alois Vocásek Severní 10 Brno 606 00 Kryšpín Jelítko Jižní 11 Praha 116 00 Felix Bůček Západní 3 Ostrava 825 00 Tadeáš Jelítko Východní 8 Plzeň 322 00
SQL: Jazyk pro manipulaci s daty (DML) SQL (Structured Query Language) je syntaktický předpis pro vykonávání dotazů na data: SELECT Příjmení FROM Adresář Where PSČ LIKE '6????' Obsahuje však i syntaktické struktury pro manipulace se záznamy: UPDATE aktualizace dat v určeném záznamu dané tabulky DELETE smazání vybraných záznamů z konkrétní tabulky INSERT INTO vložení nového záznamu do dané tabulky
SQL: SELECT Základní syntax: SELECT column_name(s) FROM table_name; Výběr všech sloupců zvolené tabulky: symbol * SELECT * FROM table_name; Příklad výběru zvolených sloupců: SELECT Příjmení, Jméno FROM Adresář; Příjmení: Jméno: Vocásek Alois Jelítko Kryšpín Bůček Felix Jelítko Tadeáš Výběr jen unikátních záznamů: Prefix DISTINCT SELECT DISTINCT Příjmení FROM Adresář;
SQL: SELECT Klauzule alias: Aliasy mohou být využity pro tabulky i sloupce: SELECT column AS column_alias FROM table; (typicky pro vlastní pojmenování sloupců na výstupu) SELECT column FROM table AS table_alias; (typicky pro substituci jmen při definici relací uvnitř jedné tabulky) Klauzule OrderBy: Předpis pro třídění řádek výstupu, např.: SELECT Jméno, Příjmení FROM Adresář ORDER BY Příjmení, Jméno; Třídění v opačném pořadí: suffix DESC SELECT Distinct Příjmení FROM Adresář ORDER BY Příjmení DESC;
SQL: SELECT Klauzule Where: Definice pravidel pro výběr záznamů: SELECT <sloupce> FROM <tabulky> Where <Podmínky>; Jednotlivé podmínky je možné logicky spojovat pomocí And/Or K definici vyhodnocovacích podmínek je možné použít Porovnávání ordinárního obsahu polí: <, >, =, < > (nebo!=), > =, < = SELECT... WHERE PSČ < '600 00'; Test přítomnosti řetězce ve výrazu: <výraz> LIKE <řetězec> SELECT... WHERE Jméno Like 'x'; Test zda hodnota výrazu leží mezi dvěma mezemi: Between.. And.. SELECT... WHERE Příjmení BETWEEN 'D' AND 'T'; Test zda výraz nabývá něktré z hodnot: IN (hodnota1, hodnota2,..) SELECT... WHERE Příjmení IN ('Vocásek','Buřt');
SQL: SELECT Formátování výstupů dotazu: Group By: Seskupování (agregace) dat dle určitého kritéria: SELECT Partner, SUM(platba) FROM PenezniDenik GROUP BY Partner; Having: Dodatečné filtrování výstupních (typicky agregovaných) dat SELECT Partner, SUM(platba) FROM PenezniDenik GROUP BY Partner Having SUM(platba)>1000000;
SQL: SELECT Agregační funkce (výběr): AVG(sloupec) : Aritmetický průměr agregovaných hodnot COUNT(sloupec) : Počet neprázdných řádek v daném sloupci COUNT(*) : Počet vybraných řádek FIRST(sloupec) : První nalezená hodnota v daném sloupci LAST(sloupec) : Poslední nalezená hodnota v daném sloupci MAX(sloupec) : Nejvyšší nalezená hodnota v daném sloupci MIN(sloupec) : Nejmenší nalezená hodnota v daném sloupci SUM(sloupec) : Součet nalezených hodnot v daném sloupci
SQL: SELECT Skalární funkce: Funkce na úrovni jednotlivých hodnot UCASE (c) : Převod výrazu c na velká písmena LCASE (c) : Převod výrazu c na malá písmena MID (c, první[,poslední]) : Výběr zvoleného počtu znaků z textového výrazu c LEN (c) : Délka textového výrazu c INSTR (c) : Numerická pozice substringu ve výrazu c LEFT (c, n) : Výběr prvních n znaků v textovém výrazu c RIGHT (c, n): Výběr posledních n znaků v textovém výrazu c ROUND (c, místa): Zaokrouhlení na daný počet desetinných míst MOD (x, y) : Vrací výsledek x mod y (zbytek po dělení) NOW () : Vrací aktuální systémové datum (bez parametru) FORMAT (c, format) : Změna formátu zobrazení pole DATEDIFF (d, datum1, datum2) : Datové kalkulace
SQL: SELECT Propojování tabulek je v SQL realizováno pomocí klíčů tabulek a konstrukcí WHERE: (výpis všech řádků na kterých je shoda v levé i pravé tabulce) SELECT Zam.Jmeno, Obj.Produkt FROM Zam, Obj WHERE Zam.ID=Obj.Vystavil_ID INNER JOIN: (dtto) SELECT Zam.Jmeno, Obj.Produkt FROM Zam INNER JOIN Obj ON Zam.ID=Obj.Vystavil_ID LEFT JOIN: (výpis všech záznamů levé tabulky, doplněných o data z Obj) SELECT Zam.Jmeno, Obj.Produkt FROM Zam LEFT JOIN Obj ON Zam.ID=Obj.Vystavil_ID RIGHT JOIN (výpis všech záznamů pravé tabulky, doplněných o data Zam) SELECT Zam.Name, Obj.Produkt FROM Zam RIGHT JOIN Obj ON Zam.ID=Obj.Vystavil_ID
SQL: Poddotazy Při tvorbě výrazů v SQL dotazech můžeme místo odkazů na hodnoty ve fyzických sloupcích použít i odkazy na virtuální tabulky, vytvářené dynamicky pomocí tzv. vnořených SQL dotazů Příklad: SELECT jméno, příjmení FROM platy WHERE plat > (SELECT AVG(plat) FROM platy)
SQL : UNION Sloučení výstupů více dotazů: Spojka UNION SQLquery1 UNION SQLquery2;
SQL: UPDATE, INSERT INTO, DELETE Modifikace dat v tabulkách je možná příkazy: INSERT INTO <tabulka> (<seznam sloupců>) VALUES (<seznam hodnot>); DELETE FROM <tabulka> WHERE <podmínky pro výběr řádek> UPDATE <tabulka> SET <sloupce> = <výrazy> WHERE <podmínky pro výběr řádek>;
SQL: Jazyk pro definici dat (DDL) CREATE TABLE vytvoření nové tabulky ALTER TABLE změna struktury tabulky DROP TABLE zrušení dané tabulky CREATE INDEX vytvoření indexu (klíče) DROP INDEX zrušení daného indexu
SQL: CREATE CREATE TABLE table_name( NázevSloupce1 <typ>, NázevSloupce2 <typ>,...) Používané typy: integer(n), int(n), smallint(n), tinyint(n): Celočíselné, n je max. počet míst decimal(n,d), numeric(n,d): Desetinná čísla, d je počet desetinných míst. char(délka): Řetězec s pevně danou délkou. varchar(max_délka): Řetězec s danou maximální délkou. date: Datum CREATE UNIQUE INDEX jméno_indexu ON table_name (<seznam sloupců zahrnutých v indexu>)
SQL: TRUNCATE a DROP Smazání dat v tabulce, zachování struktury: TRUNCATE TABLE table_name Změna struktury: ALTER TABLE table_name ADD jméno_odstavce <typ> DROP COLUMN <jména rušených odstavců> Odstranění stávajících struktur: DROP INDEX table_name.index_name DROP TABLE table_name DROP DATABASE database_name