Jazyk SQL
- SQL (Structured Query Language) – standardizovaný dotazovací jazyk pro práci s relačními databázemi; umožňuje definovat strukturu databáze, vkládat, upravovat, mazat a vyhledávat data
- Výhody použití SQL
- Standardizace – podporován prakticky všemi relačními SŘBD (MySQL, PostgreSQL, MS SQL Server, Oracle, MS Access, SQLite), byť s drobnými dialektovými odlišnostmi
- Deklarativnost – uživatel popisuje, co chce získat, ne jak k tomu má systém dojít (na rozdíl od procedurálních jazyků); optimalizaci provedení řeší SŘBD
- Jednotné ovládání – stejným jazykem lze jak definovat strukturu databáze, tak s daty pracovat i řídit přístupová práva
- Efektivita při práci s velkým objemem dat – dotazy nad tisíci až miliony záznamů jsou díky indexům a optimalizátoru rychlé
- Bezpečnost – umožňuje přesně řídit, kdo smí která data číst nebo měnit
Kategorie příkazů SQL
- DDL (Data Definition Language) – definice struktury databáze
CREATE– vytvoření objektu (databáze, tabulky, indexu)ALTER– úprava struktury existujícího objektuDROP– odstranění objektu
- DML (Data Manipulation Language) – práce se samotnými daty
SELECT– výběr (dotazování) datINSERT– vložení nových záznamůUPDATE– úprava existujících záznamůDELETE– smazání záznamů
- DCL (Data Control Language) – řízení přístupových práv
GRANT– přidělení oprávnění uživateliREVOKE– odebrání oprávnění uživateli
- TCL (Transaction Control Language, doplňkově) – řízení transakcí:
COMMIT(potvrzení změn),ROLLBACK(vrácení změn)
Definice struktury – DDL
CREATE DATABASE eshop;
CREATE TABLE zakaznik (
id INT PRIMARY KEY AUTO_INCREMENT,
jmeno VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL
);
CREATE TABLE objednavka (
id INT PRIMARY KEY AUTO_INCREMENT,
datum DATE NOT NULL,
zakaznik_id INT NOT NULL,
FOREIGN KEY (zakaznik_id) REFERENCES zakaznik(id)
);
ALTER TABLE zakaznik ADD telefon VARCHAR(20);
DROP TABLE objednavka;
PRIMARY KEY– definuje primární klíč tabulkyFOREIGN KEY ... REFERENCES– definuje cizí klíč a vazbu na jinou tabulku (referenční integrita)NOT NULL,UNIQUE– integritní omezení na úrovni sloupce
Práce s daty – DML
-- vložení záznamu
INSERT INTO zakaznik (jmeno, email) VALUES ('Jan Novák', 'jan@example.com');
-- úprava záznamu
UPDATE zakaznik SET telefon = '777123456' WHERE id = 1;
-- smazání záznamu
DELETE FROM zakaznik WHERE id = 1;
Výběr dat – SELECT
-- výběr sloupců s podmínkou
SELECT jmeno, email FROM zakaznik WHERE jmeno LIKE 'J%';
-- řazení výsledků
SELECT * FROM objednavka ORDER BY datum DESC;
-- seskupení a agregace
SELECT zakaznik_id, COUNT(*) AS pocet_objednavek
FROM objednavka
GROUP BY zakaznik_id
HAVING COUNT(*) > 2;
WHERE– filtruje záznamy podle podmínkyORDER BY– řadí výsledky (ASCvzestupně – výchozí,DESCsestupně)GROUP BY– seskupuje záznamy podle hodnoty sloupce, obvykle s agregační funkcí (COUNT,SUM,AVG,MIN,MAX)HAVING– filtruje až seskupené výsledky (na rozdíl odWHERE, které filtruje jednotlivé řádky před seskupením)DISTINCT– odstraní duplicitní řádky z výsledku
Propojení tabulek – JOIN
- Vyhledávání napříč propojenými entitami se řeší spojením tabulek přes vazbu primární klíč – cizí klíč
INNER JOIN– vrátí pouze záznamy, které mají shodu v obou tabulkáchLEFT JOIN– vrátí všechny záznamy z levé tabulky, i když k nim není odpovídající záznam v pravé (chybějící hodnoty jako NULL)RIGHT JOIN– obdobně, ale zachová všechny záznamy z pravé tabulky
SELECT z.jmeno, o.datum
FROM zakaznik z
INNER JOIN objednavka o ON z.id = o.zakaznik_id
ORDER BY o.datum;
- Stejný princip se používá při vyhledávání přes číselníky – hodnota se v hlavní tabulce ukládá jako cizí klíč (ID) a spojením s číselníkem se dotazem doplní čitelný text (např. název kraje místo jeho kódu)
Zdroje záznamů, import a export dat
- Zdroj záznamů v informačním systému – tabulka, pohled (view) nebo výsledek dotazu, ze kterého se data čerpají; u víceuživatelských systémů může jít i o vzdálenou databázi nebo externí soubor (CSV, XML, JSON)
- Při práci se zdrojem dat je třeba posoudit
- Umístění – lokální databáze, síťový server, cloudová služba
- Validitu – zda jsou data aktuální, úplná a odpovídají očekávané struktuře (typům, formátům)
- Míru zabezpečení – zda je přístup chráněn autentizací, zda je spojení šifrované, jaká má zdroj přístupová práva
- Hromadný import – vložení velkého množství dat najednou, typicky z souboru (CSV, Excel) pomocí nástrojů jako
LOAD DATA INFILE(MySQL) nebo importních průvodců v grafických nástrojích - Hromadný export – vyexportování dat z databáze do souboru pro přenos, zálohu nebo zpracování v jiném nástroji (např.
SELECT ... INTO OUTFILE, export přes grafického klienta do CSV/Excelu)
Vytvoření databáze a přístupová oprávnění – DCL
CREATE DATABASE firma;
CREATE USER 'petr'@'localhost' IDENTIFIED BY 'heslo123';
GRANT SELECT, INSERT ON firma.* TO 'petr'@'localhost';
REVOKE INSERT ON firma.* FROM 'petr'@'localhost';
GRANT– přiděluje konkrétnímu uživateli konkrétní oprávnění na databázi, tabulce nebo sloupci (např. jen čtení, nebo čtení a zápis)REVOKE– odebírá dříve přidělené oprávnění- Princip minimálních oprávnění – uživatel by měl mít přidělena jen ta práva, která nezbytně potřebuje pro svou roli
Archivace a obnova dat
- Zálohování (backup) – pravidelné vytváření kopie databáze pro případ havárie, chyby uživatele nebo napadení
- Úplná záloha – kopie celé databáze
- Přírůstková (inkrementální) záloha – zálohují se jen změny od poslední zálohy, šetří místo a čas
- Obnova (restore) – načtení dat ze zálohy zpět do databáze po havárii nebo chybě
- Transakce – posloupnost operací, která se provede buď celá, nebo vůbec (atomicita);
COMMITzměny trvale uloží,ROLLBACKje vrátí zpět, pokud dojde k chybě uprostřed zpracování - Archivace – dlouhodobé uložení starších, aktuálně nepotřebných dat mimo hlavní produkční databázi, se zachováním možnosti je later dohledat
Praktické příklady v MySQL
Navazujeme na schéma e-shopu z předchozí kapitoly (zakaznik, objednavka, produkt, polozka_objednavky). Doplníme ho o produkty a položky objednávek a ukážeme si na něm další reálné dotazy.
USE eshop;
-- ukázková data
INSERT INTO zakaznik (jmeno, prijmeni, email, telefon) VALUES
('Jan', 'Novák', 'jan.novak@example.com', '777123456'),
('Eva', 'Svobodová', 'eva.svobodova@example.com', '602987654'),
('Petr', 'Dvořák', 'petr.dvorak@example.com', NULL);
INSERT INTO produkt (nazev, cena, sklad_mnozstvi) VALUES
('Myš USB', 249.90, 120),
('Klávesnice', 599.00, 45),
('Monitor 24"', 3490.00, 15),
('USB flash disk 32GB', 199.00, 200);
INSERT INTO objednavka (datum, zakaznik_id) VALUES
('2026-01-15', 1),
('2026-02-03', 1),
('2026-02-10', 2);
INSERT INTO polozka_objednavky (objednavka_id, produkt_id, mnozstvi) VALUES
(1, 1, 2),
(1, 4, 1),
(2, 3, 1),
(3, 2, 1),
(3, 4, 3);
JOIN přes víc tabulek
-- kdo si co objednal a v jakém množství
SELECT z.jmeno, z.prijmeni, o.datum, p.nazev, po.mnozstvi
FROM zakaznik z
INNER JOIN objednavka o ON z.id = o.zakaznik_id
INNER JOIN polozka_objednavky po ON o.id = po.objednavka_id
INNER JOIN produkt p ON po.produkt_id = p.id
ORDER BY o.datum;
- Dotaz postupně spojuje čtyři tabulky přes vazby primární klíč – cizí klíč (
zakaznik.id = objednavka.zakaznik_id,objednavka.id = polozka_objednavky.objednavka_id,polozka_objednavky.produkt_id = produkt.id)
GROUP BY a HAVING – zákazníci s víc než 5 objednávkami
SELECT z.id, z.jmeno, z.prijmeni, COUNT(o.id) AS pocet_objednavek
FROM zakaznik z
INNER JOIN objednavka o ON z.id = o.zakaznik_id
GROUP BY z.id, z.jmeno, z.prijmeni
HAVING COUNT(o.id) > 5;
- Nejprve se přes
JOINspojí zákazníci s jejich objednávkami,GROUP BYje seskupí po jednotlivých zákaznících aHAVING COUNT(o.id) > 5z výsledku ponechá jen ty, kteří mají víc než 5 objednávek – na tomto malém vzorku dat by tedy dotaz nevrátil žádný řádek, princip je ale stejný i pro tisíce záznamů
ORDER BY a LIMIT
-- 3 nejdražší produkty v nabídce
SELECT nazev, cena FROM produkt ORDER BY cena DESC LIMIT 3;
-- 5 nejnovějších objednávek
SELECT id, datum FROM objednavka ORDER BY datum DESC LIMIT 5;
LIMIT nomezí počet vrácených řádků, v kombinaci sORDER BYse často používá pro žebříčky, poslední záznamy nebo stránkování výsledků
UPDATE a DELETE s konkrétními daty
-- zdražení konkrétního produktu
UPDATE produkt SET cena = 279.90 WHERE nazev = 'Myš USB';
-- odebrání jedné položky z objednávky č. 2
DELETE FROM polozka_objednavky WHERE objednavka_id = 2 AND produkt_id = 3;
-- doplnění telefonu zákazníkovi, který ho zatím nemá
UPDATE zakaznik SET telefon = '605112233' WHERE email = 'petr.dvorak@example.com';
Práce s MySQL z příkazové řádky
Kromě grafických nástrojů lze s MySQL databází pracovat i přímo z terminálu:
mysql -u root -p
Po zadání hesla se otevře příkazová řádka MySQL klienta, ve které lze psát běžné SQL příkazy zakončené středníkem:
SHOW DATABASES;
USE eshop;
SHOW TABLES;
DESCRIBE zakaznik;
SELECT * FROM zakaznik;
SHOW DATABASES;– vypíše seznam všech databází na serveruUSE eshop;– přepne aktivní databázi, se kterou se dál pracuje (další příkazy se pak netýkají celého serveru, ale konkrétní databázeeshop)SHOW TABLES;– vypíše tabulky v aktuálně vybrané databáziDESCRIBE zakaznik;(případněDESC zakaznik;) – zobrazí strukturu tabulky (sloupce, datové typy, klíče)
phpMyAdmin – webová grafická nadstavba nad MySQL, přes kterou lze provádět stejné operace (procházení tabulek, spouštění SQL dotazů, import/export dat) bez nutnosti pamatovat si příkazovou řádku; na školách i webhostinzích bývá nejběžnějším způsobem, jak se s MySQL databází pracuje – vlevo nabízí strom databází a tabulek, v prostřední části pak záložky pro procházení dat (Procházet/Browse), spouštění vlastního SQL (SQL), úpravu struktury (Struktura/Structure) a export/import.