
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.
Mohlo by vás zajímat
Blog

Brzdí vás Excel? Vlastní datové aplikace rychle a bez programátorů.

Jak vytváříme jednoúčelové aplikace s pomocí AI

Aritmetický průměr vs. medián
Data Apps

Kouzelný odstraňovač pozadí

Lovely video kompresor

Magická guma
Kurzy

SQL pro analytiky

Python - základy

Programování ve VBA

Python pro každý den

OK, Python


