Zkratka proStructured Query Languagees-kjů-el nebo síkvelTakéSequelZákladní
Definice
SQL je deklarativní jazyk pro práci s relačními databázemi, ve kterém se popisuje, jaká data chce uživatel vybrat, změnit nebo definovat, nikoli přesný postup jejich získání. Používá se pro dotazy, vkládání, aktualizace, mazání, tvorbu tabulek, oprávnění i transakční zpracování v mnoha databázových systémech.
Proč databáze čte deklarativní dotazy
SQL stojí na myšlence, že člověk nebo aplikace popíše požadovaný výsledek a databázový systém rozhodne, jak se k němu dostane. Dotaz typu SELECT říká, které sloupce, řádky a vztahy mají ve výsledku být. Neříká, zda má databáze projít celou tabulku, použít index, spojit tabulky v určitém pořadí nebo dočasně uložit mezivýsledek.
Databázový optimalizátor porovnává možné plány provedení podle statistik, dostupných indexů, omezení a odhadované ceny. Stejný SQL dotaz proto může být rychlý v malé databázi, ale po růstu dat potřebovat jiný index, přepsání podmínky nebo rozdělení úlohy.
Části jazyka SQL v běžné práci
SQL není jen SELECT. Jazyk se obvykle dělí podle účelu příkazů. Dotazovací část vybírá data, agregační funkce počítají souhrny a spojení tabulek skládá širší pohled z více entit. Manipulační příkazy jako INSERT, UPDATE a DELETE mění obsah tabulek.
Definiční příkazy, například CREATE TABLE nebo ALTER TABLE, popisují strukturu databáze. Řídicí příkazy řeší oprávnění a transakce. Transakce dávají skupině změn hranici: buď se potvrdí celé, nebo se vrátí zpět. Právě spojení dotazování, struktury a konzistence dělá z SQL hlavní rozhraní relačních databází.
Dva praktické scénáře
Report tržeb podle zákazníků
E-shop potřebuje zjistit, kteří zákazníci utratili za poslední měsíc nejvíc. SQL dotaz spojí objednávky se zákazníky, sečte částky a výsledek seřadí. Výstup může jít do administrace, BI nástroje nebo pravidelného e-mailového reportu.
SELECT c.email, SUM(o.total_price) AS revenue
FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE o.created_at >= DATE '2026-01-01'
GROUP BY c.email
ORDER BY revenue DESC
LIMIT 10;Bezpečná změna stavu objednávky
Skladový systém označuje objednávku jako odeslanou a zároveň zapisuje čas expedice. SQL změna se provede v transakci, aby aplikace neskončila v polovičním stavu. Pokud druhý příkaz selže, databáze může celou operaci vrátit.
BEGIN;
UPDATE orders
SET status = 'shipped'
WHERE id = 1289 AND status = 'paid';
INSERT INTO shipment_log (order_id, event)
VALUES (1289, 'package handed to carrier');
COMMIT;Kde se SQL liší mezi databázemi
Základní konstrukce SQL jsou přenositelné, ale skutečné systémy mají vlastní dialekty. PostgreSQL, SQLite, Microsoft SQL Server, Oracle Database nebo MySQL se liší datovými typy, funkcemi pro datum a čas, prací s JSON, procedurálním rozšířením, syntaktickými zkratkami i chováním okrajových případů.
Přenositelný SQL kód se drží standardních konstrukcí a specifické funkce odděluje do vrstvy, kterou lze při změně databáze nahradit. Praktický vývoj však často dává přednost schopnostem konkrétní databáze, protože lepší indexy, expresivnější dotazy nebo nativní typy mohou výrazně zjednodušit aplikaci.
Příklady z praxe
Report tržeb podle zákazníků
E-shop potřebuje zjistit, kteří zákazníci utratili za poslední měsíc nejvíc. SQL dotaz spojí objednávky se zákazníky, sečte částky a výsledek seřadí. Výstup může jít do administrace, BI nástroje nebo pravidelného e-mailového reportu.
SELECT c.email, SUM(o.total_price) AS revenue FROM customers c JOIN orders o ON o.customer_id = c.id WHERE o.created_at >= DATE '2026-01-01' GROUP BY c.email ORDER BY revenue DESC LIMIT 10;Bezpečná změna stavu objednávky
Skladový systém označuje objednávku jako odeslanou a zároveň zapisuje čas expedice. SQL změna se provede v transakci, aby aplikace neskončila v polovičním stavu. Pokud druhý příkaz selže, databáze může celou operaci vrátit.
BEGIN; UPDATE orders SET status = 'shipped' WHERE id = 1289 AND status = 'paid'; INSERT INTO shipment_log (order_id, event) VALUES (1289, 'package handed to carrier'); COMMIT;
Časté omyly
- MýtusSQL je jenom příkaz SELECT.
- Ve skutečnostiSQL zahrnuje dotazy, změny dat, definici struktury databáze, oprávnění i transakce. SELECT je nejviditelnější část, ale produkční aplikace používá širší sadu příkazů.
- MýtusKdyž dotaz funguje v jedné databázi, poběží stejně všude.
- Ve skutečnostiSQL má standardizované jádro, ale databázové systémy používají vlastní dialekty a rozšíření. Rozdíly se často projeví u datových typů, funkcí, limitování výsledků a práce s časem.
- MýtusSQL injection vyřeší escapování uvozovek.
- Ve skutečnostiEscapování samo o sobě není spolehlivá strategie pro všechny situace. Bezpečnější základ tvoří parametrizované dotazy, oddělení dat od syntaxe a databázový účet s minimálními nutnými právy.
Časté dotazy
- Proč SQL neříká databázi přesný postup vyhledání dat?
- SQL nepopisuje přesný algoritmus, protože relační databáze má vlastní optimalizátor. Optimalizátor zná indexy, statistiky tabulek, omezení a dostupné způsoby spojení dat. Programátor obvykle vyjádří požadovaný výsledek, například filtr, řazení a agregaci. Databáze potom zvolí plán provedení, který může změnit po přidání indexu, růstu tabulky nebo aktualizaci statistik.
- Stačí SQL pro práci s daty v aplikaci?
- SQL stačí pro mnoho operací s uloženými daty, ale aplikace obvykle potřebuje i další vrstvu. Aplikační kód řeší validaci vstupů, autentizaci, volání externích služeb, práci se soubory, fronty a uživatelské rozhraní. SQL je nejsilnější tam, kde se filtrují, spojují, agregují a konzistentně mění strukturovaná data uvnitř databázového systému.
- Proč stejný SQL dotaz nemusí fungovat v PostgreSQL a SQLite?
- SQL má společný standard, ale databázové systémy přidávají vlastní dialekty a rozšíření. PostgreSQL, SQLite nebo Microsoft SQL Server se mohou lišit názvy funkcí, datovými typy, podporou JSON, prací s časem, syntaxí stránkování i chováním při konfliktech. Přenositelné dotazy používají konzervativní konstrukce, zatímco výkonnostně laděný kód často využívá vlastnosti konkrétní databáze.
- Jak SQL souvisí s bezpečností aplikace?
- SQL souvisí s bezpečností hlavně přes vstupy od uživatelů a oprávnění. SQL injection vzniká, když aplikace skládá dotaz jako text a vloží do něj neošetřenou hodnotu. Bezpečnější přístup používá parametrizované dotazy, omezená databázová oprávnění a kontrolu toho, jaké operace smí aplikační účet provádět.
Zdroje
- ISO/IEC 9075-1:2023 Information technology — Database languages SQL — Part 1: Framework (SQL/Framework)(otevře se v novém okně)
- SQL Commands(otevře se v novém okně)
- SQL As Understood By SQLite(otevře se v novém okně)
- Transact-SQL reference (Database Engine)(otevře se v novém okně)