Výběr dat
sqlSELECT name, city
FROM customers
WHERE city = 'Praha'
ORDER BY name
LIMIT 5;
SELECT * vybere všechny sloupce, SELECT DISTINCT vynechá opakující se řádky. Výsledný sloupec se dá přejmenovat přes AS, třeba price * stock AS stock_value.
| Podmínka |
Význam |
=, <> |
rovná se, nerovná se |
<, >, <=, >= |
porovnání čísel, textů i dat |
AND, OR, NOT |
spojení podmínek; pořadí určují závorky |
LIKE 'Nike%' |
text podle vzoru: % zastoupí libovolný kus textu, _ jeden znak |
IS NULL, IS NOT NULL |
chybějící hodnota; = NULL neplatí nikdy |
IN ('Praha', 'Brno') |
jedna z vyjmenovaných hodnot |
BETWEEN 1000 AND 2000 |
rozsah včetně krajních hodnot |
LIKE v SQLite nerozlišuje velká a malá písmena, ale jen u písmen bez diakritiky: 'praha' najde Prahu, 'české%' České Budějovice nenajde.
Řazení
sqlSELECT brand, name, price
FROM products
ORDER BY brand ASC, price DESC;
| Zápis |
Jak řadí |
ASC |
vzestupně: čísla od nejmenšího, texty od A do Z, data od nejstaršího |
DESC |
sestupně: čísla od největšího, texty od Z do A, data od nejnovějšího |
ASC je výchozí, takže ORDER BY price a ORDER BY price ASC znamenají totéž. Směr platí jen pro sloupec, za kterým stojí. Ukázka nahoře řadí podle značky od A do Z a v rámci každé značky od nejdražšího produktu. Bez ORDER BY vrátí databáze řádky v pořadí, které nic neznamená.
Dvě věci při řazení překvapí. NULL jde při ASC na začátek a při DESC na konec. A texty SQLite řadí podle kódů znaků, ne podle české abecedy: velká písmena jdou před malá a písmena s diakritikou až za z, takže Šimon skončí za Zdeňkem.
Vložení dat
sqlINSERT INTO customers (name, email, city, registered_at)
VALUES ('Eva Malá', 'eva.mala@example.cz', 'Olomouc', '2026-11-04');
Za názvem tabulky vyjmenujeme sloupce a ve VALUES jim ve stejném pořadí dáme hodnoty. Sloupec id vynecháme a databáze ho doplní sama. Víc řádků najednou vložíme tak, že závorky s hodnotami oddělíme čárkou:
sqlINSERT INTO products (name, brand, category, price, stock)
VALUES ('Ponožky Crew', 'Nike', 'doplňky', 299, 40),
('Kšiltovka Classic', 'Vans', 'doplňky', 649, 15);
Aktualizace dat
sqlUPDATE products
SET price = 2799, stock = stock - 1
WHERE id = 1;
SET říká, který sloupec dostane jakou hodnotu. Novou hodnotu jde spočítat i ze staré, jako tady stock - 1. WHERE vybírá řádky, kterých se změna týká. Bez něj se změní všechny řádky tabulky a nikdo se nezeptá, jestli to tak myslíme.
Mazání dat
sqlDELETE FROM orders
WHERE id = 130;
Stejně jako u UPDATE smaže DELETE bez WHERE celou tabulku. Podmínku si proto nejdřív ověřte dotazem SELECT * FROM … WHERE … se stejnou podmínkou. Když se na mazaný řádek odkazuje cizí klíč jiné tabulky, databáze mazání odmítne:
FOREIGN KEY constraint failed
Spojování tabulek
sqlSELECT o.id, c.name, o.created_at
FROM orders o
JOIN customers c ON o.customer_id = c.id;
| Spojení |
Co vrátí |
JOIN (INNER JOIN) |
jen řádky, které mají protějšek v obou tabulkách |
LEFT JOIN |
všechny řádky levé tabulky (z FROM), chybějící protějšek doplní NULL |
RIGHT JOIN |
všechny řádky pravé tabulky (za JOIN), chybějící protějšek doplní NULL |
Řádky bez protějšku najdeme spojením LEFT JOIN a podmínkou WHERE o.id IS NULL. Zkratky za názvy tabulek (o, c) nejsou povinné, ale bez nich by se u každého sloupce musel opisovat celý název tabulky.
Agregace a skupiny
| Funkce |
Co spočítá |
COUNT(*) |
počet řádků |
COUNT(city) |
počet vyplněných hodnot, NULL nepočítá |
SUM(price), AVG(price) |
součet a průměr |
MIN(price), MAX(price) |
nejmenší a největší hodnotu |
sqlSELECT category, COUNT(*) AS products, ROUND(AVG(price)) AS average_price
FROM products
GROUP BY category
HAVING AVG(price) > 1000
ORDER BY average_price DESC;
GROUP BY spočítá agregační funkce pro každou skupinu zvlášť. WHERE filtruje řádky ještě před seskupením, HAVING až hotové skupiny. Agregační funkce do WHERE nepatří, databáze na to odpoví chybou misuse of aggregate.
Vytvoření tabulky
sqlCREATE TABLE reviews (
id INTEGER PRIMARY KEY,
product_id INTEGER NOT NULL REFERENCES products (id),
rating INTEGER NOT NULL,
comment TEXT
);
Každý sloupec má jméno, datový typ a případně omezení, sloupce se oddělují čárkou. Typy i omezení popisuje sekce Datové typy. Nová tabulka se hned objeví v přehledu tabulek vlevo.
Úprava tabulky
sqlALTER TABLE customers ADD COLUMN phone TEXT;
ALTER TABLE customers RENAME COLUMN phone TO phone_number;
ALTER TABLE customers DROP COLUMN phone_number;
Sloupec jde přidat, přejmenovat a smazat. Změnit typ existujícího sloupce SQLite neumí, na to by se musela tabulka založit znovu.
Smazání tabulky
sql
DROP TABLE smaže tabulku i se všemi daty a na nic se neptá. Tabulku, na jejíž řádky se odkazují jiné tabulky, databáze nesmaže a odpoví stejnou chybou jako u mazání dat. V pískovišti vrátí všechno, co jste smazali, tlačítko Obnovit databázi.
Datové typy
SQLite si vystačí s pěti druhy hodnot. Typ sloupce v CREATE TABLE je pro něj spíš doporučení: do sloupce INTEGER jde zapsat i text a databáze se neohradí. Většina ostatních databází je přísnější, takže se vyplatí typy dodržovat.
| Typ |
Co ukládá |
Příklad |
INTEGER |
celé číslo |
42, -7 |
REAL |
desetinné číslo |
3.14 |
TEXT |
text v jednoduchých uvozovkách |
'Praha' |
BLOB |
binární data, třeba obrázek |
– |
NULL |
chybějící hodnota |
NULL |
Vlastní typ pro datum ani pro ano/ne SQLite nemá. Datum se ukládá jako text ve tvaru 'RRRR-MM-DD', ve kterém se správně řadí i porovnává, a ano/ne jako čísla 1 a 0. Typy z jiných databází, třeba VARCHAR(50), DATE nebo BOOLEAN, SQLite přijme, ale zachází s nimi po svém. Délku textu u VARCHAR(50) například nehlídá.
Za typem sloupce mohou stát omezení, která databáze hlídá při každém zápisu:
| Omezení |
Význam |
PRIMARY KEY |
primární klíč; u INTEGER PRIMARY KEY přidělí hodnotu databáze sama |
NOT NULL |
hodnota nesmí chybět |
UNIQUE |
hodnota se v tabulce nesmí opakovat |
DEFAULT 0 |
výchozí hodnota, když ji INSERT nevyplní |
REFERENCES customers (id) |
cizí klíč, hodnota musí existovat v jiné tabulce |
Užitečné funkce
| Funkce |
Co dělá |
Příklad a výsledek |
ROUND(x, n) |
zaokrouhlí na n desetinných míst, bez n na celé číslo |
ROUND(1432.6) → 1433 |
strftime(formát, datum) |
vytáhne z data jeho část |
strftime('%Y-%m', '2026-11-04') → '2026-11' |
date('now') |
dnešní datum |
'2026-11-04' |
UPPER(text), LOWER(text) |
převede text na velká, nebo malá písmena |
UPPER('nike') → 'NIKE' |
LENGTH(text) |
délka textu ve znacích |
LENGTH('Brno') → 4 |
Pořadí částí dotazu
Části dotazu mají pevné pořadí. Nemusí v něm být všechny, ale ty, které tam jsou, jdou za sebou takhle:
SELECT sloupce a agregační funkce
FROM tabulka
JOIN další tabulka ON podmínka spojení
WHERE podmínka pro řádky
GROUP BY sloupce skupin
HAVING podmínka pro skupiny
ORDER BY řazení
LIMIT počet řádků
Část na špatném místě databáze odmítne a v hlášce jmenuje tu, která ji zarazila, třeba near "WHERE": syntax error.
Zápis dotazu
- Text a data se píšou do jednoduchých uvozovek:
'Praha', '2026-11-04'. Čísla bez uvozovek.
- Příkazy končí středníkem. V editoru jich jde spustit víc najednou a vypíše se výsledek každého, který něco vrací.
- Klíčová slova databázi fungují i malými písmeny. Velkými je píšeme, aby se dotaz lépe četl.
- Dvě pomlčky
-- začínají komentář, databáze zbytek řádku přeskočí.
- Chybová hláška je anglicky a vyplatí se ji přečíst celou. Obvykle jmenuje sloupec nebo místo v dotazu, kde je problém.
Úplný popis najdete v dokumentaci SQLite: datové typy, příkazy jazyka SQL a vestavěné funkce.