Přednáška 5 Úvod do SQL
SQL Standardizovaný jazyk relačních databází, vytvořený po představení relačního modelu. SQL je zkratka anglických slov Structured Query Language (strukturovaný dotazovací jazyk). Jde o neprocedurální jazyk – je třeba zadat, jaké informace požadujeme, nikoli jak je získat. Ve skutečnosti nejde o jeden jazyk, ale o různé dialekty různých databázových systémů (ORACLE, MS SQL, MySQL, …). Různé vývojové verze. MySQL implementuje ANSI/ISO standard SQL-92 s rozšířeními až po verze jazyka SQL 2008. Budeme se zabývat primárně dialektem RDBMS MySQL.
SQL příkazy SQL příkazy můžeme rozdělit do čtyř skupin. DML (Data Manipulation Language). Množina příkazů pro manipulaci s daty. DDL (Data Definition Language). Množina příkazů pro definici dat. DCL (Data Control Language). Množina příkazů pro definici řízení přístupových práv. TCL (Transaction Control). Množina příkazů pro řízení transakcí. Speciální příkazy.
DML Tato skupina příkazů se používá pro manipulaci s daty. Hlavní příkazy, které spadají do této skupiny jsou: SELECT – vybírá data z databáze. INSERT – vkládá data do databáze. UPDATE – edituje data v databázi. DELETE – odstraňuje data z celých tabulek nebo řádky tabulek odpovídající podmínce. CALL – volá Uložené procedury. LOCK TABLE – zamyká celé tabulky: Zámky čtení (READ) Zámky zápisu (WRITE)
DDL Skupina příkazů používající se pro definici databázových struktur. Hlavní příkazy jsou: CREATE – vytváří objekty databáze (i databázi samotnou). ALTER – mění strukturu databázových objektů. DROP – odstraňuje objekty databáze (tabulky, indexy, databáze). TRUNCATE - odstraní všechny záznamy z tabulky, přičemž zachová strukturu tabulky (objekt tabulky). COMMENT – umožní přidávat komentáře k objektům databáze. RENAME – v MySQL umožňuje měnit název tabulky (pozor ne databáze, to bylo možné do verze 5.1.23).
DCL Skupina příkazů DCL se používá pro řízení uživatelských práv. GRANT – nastavuje uživatelská práva k tabulkám databáze. REVOKE – odebírá přístupová práva přidělená příkazem GRANT.
TCL Množina příkazů pro řízení transakcí. Transakce podporují v MySQL pouze tabulky typu InnoDB: COMMIT – potvrzení provedení transakce. SAVEPOINT – definuje záchytný bod transakce, ke kterému se lze během provádění transakce vrátit. ROLLBACK – ruší transakci a vrací se zpět ke stavu původnímu. START TRANSACTION – zahajuje blok transakce. SET TRANSACTION – umožňuje změnit level izolace transakce globálně nebo pro aktuální session.
Základní pravidla zápisu Dobrým a obecně platným pravidlem zápisu SQL je, že příkazy SQL zapisujeme velkými písmeny a názvy db, tabulek a sloupců zapisujeme malými písmeny: Příklad: INSERT INTO prvnidb.studenti (id, jmeno, prijmeni, narozeni) VALUES (1, 'Marek', 'Stejskal', 1987-05-21); Tento příkaz vloží jednu datovou n-tici (řádek dat) do tabulky studenti. Pokud jsme připojeni přímo ke konkrétní databázi prvnidb, můžeme zapisovat zkráceně bez udání názvu databáze: INSERT INTO studenti (id, jmeno, prijmeni, narozeni)
CASE Senstive Je potřeba si pamatovat, že SQL NENÍ striktně CASE Sensitive. Budeme se ale tvářit, že JE . Stejně existuje libovůle v názvech objektů. Dobře by vám tak zafungoval i následující příkaz: INSERT INTO Studenti (id, JMENO, prijmeni, rok_Narozeni) VALUES (2, 'Diana', 'Zouharová', 1990-03-14); Rozhodně se tomu vyvarujeme! Zapisujeme názvy objektů vždy přesně tak, jak jsou pojmenovány v databázi.
Databáze Vytvoření CREATE Změna ALTER Odstranění DROP Všechny operace s databází lze vykonávat bez znalosti příslušného příkazu SQL a to pomocí průvodců PHPMyAdmina. Měli byste mít základní představu o syntaxi těchto příkazů. Ukážeme si vytvoření databáze a odstranění. Další si můžete najít v manuálu.
Vytvoření databáze Syntaxe: CREATE {DATABASE} [IF NOT EXISTS] db_name [specifikace vytvoření] Specifikace vytvoření: [DEFAULT] CHARACTER SET [=] charset_name | [DEFAULT] COLLATE [=] collation_name {} – povinně volitelné součásti syntaxe [] – volitelné součásti syntaxe
CREATE DATABASE `prvnidb` DEFAULT CHARACTER SET utf8 Příklad Vytvoření databáze prvnidb: CREATE DATABASE `prvnidb` DEFAULT CHARACTER SET utf8 COLLATE utf8_czech_ci;
Odstranění databáze Odstraněním databáze odstraníme všechny data v ní! Syntaxe: DROP {DATABASE} [IF EXISTS] db_name Pozor: Nesmíte vymazat defaultní databázi „mysql“. Obsahuje nastavení uživatelských práv, seznam Uložených procedur, nastavení časového pásma a další důležité ukazatele. Přístup k této db by měl mít pouze hlavní administrátor.
Tabulka v databázi Vytvoření CREATE Změna ALTER Změna jména RENAME Odstranění DROP Odstranění všech dat se zachováním struktury TRUNCATE Operace s daty v tabulce: Vložení INSERT Výběr SELECT Odstranění DELETE Editace UPDATE
Operace s tabulkami SQL syntax pro vytvoření tabulky či její změnu je v této chvíli pro nás velmi náročný. Obsahuje prvky, kterým bychom v této fázi vašeho studia ještě natolik nerozuměli. Např.: Přesná definice datových typů a jejich součástí Definice indexů, omezení, cizích klíčů Definice nastavení tabulky Definice fyzického rozdělení tabulky v souborovém systému Pro tuto chvíli si vystačíme s průvodcem PHPMyAdmina a budeme tabulky tvořit a upravovat pomocí něj.
Příklad Vytvoření jednoduché tabulky pro naše studijní účely v databázi prvnidb: CREATE TABLE `prvnidb`.`studenti` ( `id` INT( 1 ) NOT NULL , `jmeno` VARCHAR( 20 ) CHARACTER SET utf8 COLLATE utf8_czech_ci NOT NULL , `prijmeni` VARCHAR( 40 ) CHARACTER SET utf8 COLLATE utf8_czech_ci NOT NULL , `narozeni` DATE NOT NULL , PRIMARY KEY ( `id` ) ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_czech_ci;
Vložení záznamu do tabulky Máme vytvořenu databázi prvnidb a v ní tabulku studenti. Schéma tabulky je následující: Pro vložení je k dispozici příkaz INSERT: INSERT INTO studenti (id, jmeno, prijmeni, narozeni) VALUES (1, 'Marek', 'Stejskal', 1987-05-21); Zkrácená varianta: INSERT INTO studenti VALUES (1, 'Marek', 'Stejskal', 1987-05-21); id jmeno prijmeni narozeni Prostor pro datové n-tice
Vložení více řádků INSERT umožňuje i v jednom příkazu vložit více řádků dat. Tato varianta je rychlejší, než dílčí příkazy (nemusí se znovu ověřovat struktura tabulky). Příklad: INSERT INTO studenti (id, jmeno, prijmeni, rok_narozeni) VALUES (1, 'Marek', 'Stejskal', 1987-05-21) , (2, 'Diana', 'Zouharová', 1990-03-14) , (3, 'Roman', 'Tomík', 1989-08-22) , (4, 'Jakub', 'Stejskal', 1987-10-15);
Tabulka studenti Do naší tabulky studenti jsme vložili data. Tabulka vypadá následovně: Dále si ukážeme jak záznam v tabulce editovat a odstranit. id jmeno prijmeni narozeni 1 Marek Stejskal 1987-05-21 2 Diana Zouharová 1990-03-14 3 Šimon Tomík 1989-04-17 4 Jakub 1987-06-11
Editace záznamů Příklad: Pomocí příkazu UPDATE můžeme měnit všechny atributy daného záznamu (výjimku může tvořit hodnota primárního klíče) nebo jen některé atributy: Příklad: UPDATE studenti SET prijmeni = 'Tomíková' WHERE id = 2; Potřebujeme-li editovat i další atributy záznamu, oddělíme je čárkou. tabulka Atribut = Nová hodnota Podmínka výběru záznamu jmeno = 'Andrea' , prijmeni = 'Tomíková'
Editace záznamu Důležitou součástí příkazu UPDATE je klauzule WHERE za kterou uvádíme podmínku výběru záznamu. Jako podmínka se nejčastěji uvádí sloupec primárního klíče. POZOR Neuvedeme-li podmínku WHERE, dojde k editaci všech záznamů dané tabulky!! Editace záznamu je dalším z jednoduchých úkonů, které lze provádět v prostředí PHPMyAdmin.
Odstranění záznamu Záznam (řádek) tabulky se odstraňuje vždy jako celý řádek příkazem DELETE. Důležitou roli tak hraje opět podmínka WHERE, pomocí které určíme, o jaký záznam se jedná. POZOR Chybějící podmínka WHERE způsobí odstranění všech řádků tabulky!! Příklad: DELETE FROM studenti WHERE id = 4;
Jednoduché dotazy Úkolem příkazu SELECT je vyvolat a zobrazit data z jedné nebo více tabulek. Jde o nejpoužívanější příkaz SQL. Příkaz SELECT a jeho syntax je potřeba ovládat. PHPMyAdmin nedokáže sestavit komplikovaný dotaz s mnoha jeho doplňky. Základy příkazu SELECT si samostatně nastudujte a PRAKTICKY VYZKOUŠEJTE na příkladech 7 kapitoly skript.
SELECT Velmi zjednodušený syntax příkazu SELECT: SELECT [DISTINCT] {* | [seznam_sloupců] | výraz} [FROM tabulka] [WHERE podmínka] [ORDER BY seznam_sloupců] [LIMIT] FROM – udává tabulku, která se má použít. WHERE – filtruje výstup podle podmínky. ODRER BY – určuje řazení výstupu. LIMIT – omezuje výsledný výstup na stanovenou hodnotu.
Příklad SELECT jmeno, prijmeni FROM studenti WHERE YEAR(narozeni) > 1989; Výstup: Vyzkoušejte: SELECT 1 +1; SELECT curdate(); jmeno prijmeni Diana Zouharová
Zapamatujte si DDL, DML, DCL, TCL Příkazy databáze Příkazy tabulky Příkazy manipulace dat v tabulce Základy příkazu SELECT