SQL je přátelský jazyk. Snadno se učí a používá. Můžete si ho představit jako univerzální jazyk. Je to zjednodušená angličtina, která funguje napříč mnoha databázemi.
Tento jazyk dobře zvládají AI modely, včetně těch malých, které si spustíte lokálně. Díky tomu můžete analyzovat data bez toho, aby se posílala někam do cloudu.
Starý jazyk, který pořád drží krok
SQL vzniklo v 70. letech, takže mu už je přes 50 let. I když se vyvíjelo, zásadně se nezměnilo. Zkušený programátor z disko éry by si dnešní SQL přečetl a cítil se jako doma.
Je to jazyk, který se dá pochytit rychle – a i základní znalosti vás dovedou daleko.
Samozřejmě, je to subjektivní. Pro někoho může být syntaxe odrazující. Někteří tvrdí, že je kostrbatá nebo nelogická. Ale nebojte, řešení existuje.
SQL pro 21. století
V posledních letech je DuckDB horké téma mezi datovými profíky. Jedná se o analytickou databázi, která je inovativní v mnoha směrech. Tak moc, že ji někteří dávají přednost před osvědčenou Python knihovnou pandas.
Jedním z jejích hlavních taháků, kromě rychlosti, je vylepšená syntaxe SQL nazývaná „Friendly SQL“.
Tato syntaxe reaguje na výtky, že SQL je příliš rigidní. Tvůrci DuckDB totiž chytře zachovali klasickou syntaxi a přidali nové funkce. Uživatel si tak může vybrat – zůstat u starého, přijmout nové, nebo obojí kombinovat.
Níže je pár ukázek Friendly SQL v akci, které používají soubor randomers.csv a ukazují, jak snadno DuckDB pracuje s CSV daty.
CSV soubor byl vygenerován pomocí naší marimo aplikace Synthetic Data Generator, kterou můžete používat zdarma. A nejen to. Můžete se podívat na kód, stáhnout si ho a klidně upravit podle svých potřeb. 🙂
Nejen čtení CSV
DuckDB umí číst CSV soubory jednoduše. Stačí odkázat na soubor (viz ukázka). A nejlepší část? Soubor může být uložen lokálně nebo v cloudu. DuckDB se k němu chová stejně.
Umí i JSON a Parquet, pro složitější soubory použijte funkce read_csv, read_json nebo read_parquet.
Žádné extra knihovny nebo konfigurační soubory. Datoví analytici tak mají snazší život.
Bez SELECTu
Nemusíte psát SELECT *.
Pokud tuto část vynecháte, DuckDB načte všechny sloupce automaticky.
FROM 'randomers.csv';
| date_of_birth | name | city |
|---------------|-----------------|--------------------|
| 1996-05-04 | Amanda Wilson | Matthewfurt |
| 1999-07-29 | Joseph Gonzalez | Christophershire |
| 1924-03-14 | Mark Werner | West Jennifermouth |
| NULL | Jordan Ballard | Ronaldstad |
| 1995-12-31 | Anthony Henry | NULL |
Ignorujte řádky s NULL
Výraz COLUMNS(*) šetří čas.
Umožní podmínku aplikovat na všechny sloupce, třeba odfiltrovat řádky s hodnotami NULL.
FROM 'randomers.csv'
WHERE COLUMNS(*) IS NOT NULL;
| date_of_birth | name | city |
|---------------|-----------------|--------------------|
| 1996-05-04 | Amanda Wilson | Matthewfurt |
| 1999-07-29 | Joseph Gonzalez | Christophershire |
| 1924-03-14 | Mark Werner | West Jennifermouth |
Group a sort přes všechny sloupce
DuckDB umí seskupovat GROUP BY ALL a řadit ORDER BY ALL přes všechny sloupce, aniž byste je museli vyjmenovávat nebo na ně odkazovat pomocí čísel.
To šetří čas.
SELECT
EXTRACT('year' FROM date_of_birth) AS "Year",
EXTRACT('month' FROM date_of_birth) AS "Month",
COUNT(*) AS "Count"
FROM 'randomers.csv'
GROUP BY ALL
ORDER BY ALL;
| Year | Month | Count |
|-------|-------|-------|
| 1924 | 3 | 1 |
| 1995 | 12 | 1 |
| 1996 | 5 | 1 |
| 1999 | 7 | 1 |
| NULL | NULL | 1 |
Rychlé agregace
Používali jste někdy v pandas funkci describe? DuckDB má něco podobného – funkci SUMMARIZE.
Vrací souhrnné statistiky přes tabulku nebo dotaz.
SUMMARIZE FROM 'randomers.csv';
| column_name | column_type | min | max | approx_unique | avg | std | q25 | q50 | q75 | count | null_percentage |
|---------------|-------------|------------------|--------------------|--------------:|---------------------|------|------------|------------|------------|------:|----------------:|
| date_of_birth | DATE | 1924-03-14 | 1999-07-29 | 4 | 1979-01-10 18:00:00 | NULL | 1960-02-06 | 1996-03-03 | 1997-12-15 | 5 | 20.00 |
| name | VARCHAR | Amanda Wilson | Mark Werner | 5 | NULL | NULL | NULL | NULL | NULL | 5 | 0.00 |
| city | VARCHAR | Christophershire | West Jennifermouth | 4 | NULL | NULL | NULL | NULL | NULL | 5 | 20.00 |
Substringy po vzoru Pythonu
Některé funkce v DuckDB připomínají jednoduchost Pythonu. Např. získání prvních tří znaků ze stringu jde udělat dvěma způsoby:
SELECT
name,
SUBSTR(name, 1, 3) AS "Option 1",
name[1:3] AS "Option 2"
FROM 'randomers.csv';
| name | Option 1 | Option 2 |
|-----------------|----------|----------|
| Amanda Wilson | Ama | Ama |
| Joseph Gonzalez | Jos | Jos |
| Mark Werner | Mar | Mar |
| Jordan Ballard | Jor | Jor |
| Anthony Henry | Ant | Ant |
IF místo CASE
Zdá se vám CASE moc upovídaný?
Použijte IF pro jednoduchou logiku ano/ne, podobně jako v MySQL.
SELECT
date_of_birth,
IF(MONTH(date_of_birth) > 6, 'Druhá polovina roku', 'První polovina roku') AS dob_half
FROM 'randomers.csv'
WHERE date_of_birth IS NOT NULL;
| date_of_birth | dob_half |
|---------------|-------------------------|
| 1996-05-04 | First half of the year |
| 1999-07-29 | Second half of the year |
| 1924-03-14 | First half of the year |
| 1995-12-31 | Second half of the year |
Jednodušší převody datových typů
Pro konverzi datových typů můžete v DuckDB použít zkrácenou syntaxi nebo klasické CAST.
SELECT
date_of_birth::VARCHAR AS "Option 1",
CAST(date_of_birth AS VARCHAR) AS "Option 2"
FROM 'randomers.csv';
| Option 1 | Option 2 |
|------------|------------|
| 1996-05-04 | 1996-05-04 |
| 1999-07-29 | 1999-07-29 |
| 1924-03-14 | 1924-03-14 |
| NULL | NULL |
| 1995-12-31 | 1995-12-31 |
Vyloučení nepotřebných sloupců
Máte tabulku s příliš mnoha sloupci?
Použijte EXCLUDE a snadno odstraňte ty, které nepotřebujete.
SELECT * EXCLUDE(city)
FROM 'randomers.csv';
| date_of_birth | name |
|---------------|-----------------|
| 1996-05-04 | Amanda Wilson |
| 1999-07-29 | Joseph Gonzalez |
| 1924-03-14 | Mark Werner |
| NULL | Jordan Ballard |
| 1995-12-31 | Anthony Henry |
Závěr
DuckDB oživuje SQL, aniž by rozbíjelo to, co funguje. Friendly SQL je promyšlený update, který zjednodušuje práci s daty.
Je to všechno, co DuckDB umí? Samozřejmě, že ne – dokáže toho mnohem víc.
LovelyData