Firemní školení - posilte datové dovednosti svého týmu
DuckDB: Přátelské SQL

DuckDB: Přátelské SQL

AI shrnutí

  • Tento článek se zabývá „Friendly SQL“ od DuckDB a zdůrazňuje jeho výhody v datově orientovaném světě. Ačkoli počátky SQL sahají až do 70. let 20. století, DuckDB modernizuje jeho syntaxi, čímž jej činí přístupnějším a přizpůsobuje jej současným postupům zpracování dat.
  • Mezi klíčové inovace patří zjednodušené načítání dat (CSV, JSON, Parquet), zjednodušená agregace (pomocí SUMMARIZE) a přijetí IF a dalších funkcí podobných Pythonu, to vše v rámci SQL. Článek představuje tyto funkce pomocí praktických úryvků kódu a vysvětluje jejich snadné použití.
  • Hlavní sdělení je, že Friendly SQL, implementovaný v DuckDB, činí SQL intuitivnějším a efektivnějším. Pokrývá aspekty jako zpracování sloupců a datových typů, výběr, třídění a agregace, což dokazuje snahu o zjednodušení manipulace s daty a generování poznatků pro vývojáře a analytiky.

SQL je přátelský jazyk. Snadno se učí a jednoduše používá. Můžete si ho představit jako univerzální jazyk. Je to zjednodušená angličtina, která funguje napříč mnoha databázemi.

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ů 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, který byl vygenerován pomocí synthetic data generator, a ukazují, jak snadno DuckDB pracuje s CSV daty.



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, které zvládá stejně jednoduše jako CSV. Pro složitější soubory můžete použít 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) i řadit (ORDER BY ALL) přes všechny sloupce, aniž byste je museli vyjmenovávat. Šetří to čas, i když někdy je lepší uvést sloupce explicitně.

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ů

Konverze datových typů je v DuckDB jednodušší. Můžete 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

Na pár ukázkách jsme demonstrovali, že 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.

Líbil se vám článek? Sdílejte ho s ostatními nebo nám napište něco hezkého. Děkujeme!

Mohlo by vás zajímat

Blog

Data Apps

Kurzy

Copyright © 2026, Colorbee, s.r.o.

Web by KodingKitty