- Funkce CASE v MySQL umožňuje provádět podmíněná vyhodnocení a vracet vlastní výsledky.
- S klauzulí WHEN lze použít více podmínek a hodnoty null lze zpracovat pomocí klauzule ELSE.
- CASE lze kombinovat s agregačními funkcemi pro optimalizaci dotazů.
- Dodržování osvědčených postupů při používání CASE je nezbytné pro udržení výkonu a čitelnosti kódu.
Funkce CASE v MySQL je mocný nástroj, který vám umožňuje provádět podmíněné operace v rámci vašich dotazů. Pomocí CASE můžete vyhodnotit různé podmínky a vrátit konkrétní výsledky v závislosti na tom, zda jsou tyto podmínky splněny nebo ne. Tuto funkci si vysvětlíme na praktických příkladech, které vám pomohou zvládnout použití CASE v MySQL a zlepší vaše dovednosti ve správě databází.
Co je funkce CASE v MySQL?
Funkce CASE v MySQL je podmíněný výraz, který umožňuje vyhodnocovat různé podmínky a vracet specifické výsledky v závislosti na tom, zda jsou tyto podmínky splněny. Je to velmi užitečný nástroj pro provádění logických operací v rámci dotazů a získávání přizpůsobených výsledků na základě specifických kritérií.
CASE funguje podobně jako řada příkazů IF-THEN-ELSE, kde můžete zadat více podmínek a hodnoty, které se mají vrátit, když jsou tyto podmínky splněny. Pokud není splněna žádná z podmínek, můžete definovat výchozí hodnotu pomocí klauzule ELSE.
Základní syntaxe CASE v MySQL
Základní syntaxe funkce CASE v MySQL je následující:
CASE
WHEN condición1 THEN resultado1
WHEN condición2 THEN resultado2
...
WHEN condiciónN THEN resultadoN
ELSE resultado_predeterminado
END
Zde je vysvětlení každé části syntaxe:
WHEN: Určuje podmínku, která má být vyhodnocena.THEN: Označuje výsledek, který bude vrácen, pokud je splněna odpovídající podmínka.ELSE: (Volitelné) Určuje výsledek, který se má vrátit, pokud není splněna žádná z výše uvedených podmínek.END: Označuje konec výrazu CASE.
Nyní, když znáte základní syntaxi, pojďme prozkoumat několik praktických příkladů!
Příklad 1: Klasifikujte studenty podle jejich průměru
Předpokládejme, že máte tabulku nazvanou „studenti“ s následujícími sloupci: „id“, „name“ a „avg“. Chcete seřadit studenty podle jejich GPA pomocí funkce CASE. Můžete to udělat takto:
SELECT nombre,
CASE
WHEN promedio >= 90 THEN 'Sobresaliente'
WHEN promedio >= 80 THEN 'Notable'
WHEN promedio >= 70 THEN 'Bien'
WHEN promedio >= 60 THEN 'Suficiente'
ELSE 'Insuficiente'
END AS clasificacion
FROM estudiantes;
V tomto příkladu používáme CASE k vyhodnocení průměru každého studenta a přiřazení odpovídajícího pořadí. Pokud je průměr větší nebo roven 90, je klasifikován jako "nevyřízený." Pokud je mezi 80 a 89, je klasifikován jako „pozoruhodný“ a tak dále. Pokud je průměr menší než 60, je klasifikován jako „nedostatečný“.
Příklad 2: Přiřazení kategorií produktů
Představte si, že máte tabulku nazvanou „produkty“ se sloupci „id“, „název“ a „cena“. Ke každému produktu chcete přiřadit kategorii na základě jeho ceny pomocí funkce CASE. Můžete to udělat takto:
SELECT nombre,
CASE
WHEN precio > 1000 THEN 'Premium'
WHEN precio > 500 THEN 'Gama alta'
WHEN precio > 100 THEN 'Gama media'
ELSE 'Económico'
END AS categoria
FROM productos;
V tomto příkladu používáme CASE k vyhodnocení ceny každého produktu a přiřazení odpovídající kategorie. Pokud je cena vyšší než 1000, je klasifikována jako „Premium“. Pokud je mezi 500 a 1000, je klasifikován jako „High-End“ a tak dále. Pokud je cena nižší nebo rovna 100, je klasifikována jako „ekonomická“.
Příklad 3: Vypočítejte slevy na základě zakoupeného množství
Předpokládejme, že máte tabulku nazvanou „prodej“ se sloupci „id“, „produkt“ a „množství“. Chcete vypočítat slevu použitou na každý prodej na základě množství zakoupeného pomocí funkce CASE. Můžete to udělat takto:
SELECT producto,
CASE
WHEN cantidad >= 100 THEN 0.20
WHEN cantidad >= 50 THEN 0.15
WHEN cantidad >= 20 THEN 0.10
ELSE 0
END AS descuento
FROM ventas;
V tomto příkladu používáme CASE k vyhodnocení nakoupeného množství každého produktu a výpočtu odpovídající slevy. Pokud je množství větší nebo rovno 100, je uplatněna sleva 20 %. Pokud je mezi 50 a 99, uplatní se sleva 15 % atd. Pokud je množství menší než 20, sleva se nevztahuje.
Příklad 4: Převod číselných hodnot na rozsahy
Představte si, že máte tabulku nazvanou „zaměstnanci“ se sloupci „id“, „jméno“ a „věk“. Chcete převést věk zaměstnanců na rozsahy pomocí funkce CASE. Můžete to udělat takto:
SELECT nombre,
CASE
WHEN edad >= 60 THEN 'Senior'
WHEN edad >= 40 THEN 'Mediana edad'
WHEN edad >= 20 THEN 'Joven'
ELSE 'Menor de edad'
END AS rango_edad
FROM empleados;
V tomto příkladu používáme CASE k vyhodnocení věku každého zaměstnance a přiřazení odpovídajícího rozmezí. Pokud je věk vyšší nebo roven 60, je klasifikován jako „Senior“. Pokud je vám mezi 40 a 59, jste klasifikováni jako „střední věk“ a tak dále. Pokud je věk nižší než 20 let, je klasifikován jako „nezletilý“.
Příklad 5: Přiřazení štítků na základě více podmínek
Předpokládejme, že máte tabulku nazvanou „objednávky“ se sloupci „id“, „zákazník“, „celkem“ a „stav“. Chcete ke každé objednávce přiřadit štítky na základě jejího součtu a stavu pomocí funkce CASE s více podmínkami. Můžete to udělat takto:
SELECT cliente,
CASE
WHEN total > 1000 AND estado = 'Entregado' THEN 'VIP'
WHEN total > 500 AND estado = 'Entregado' THEN 'Prioritario'
WHEN estado = 'Pendiente' THEN 'En proceso'
ELSE 'Regular'
END AS etiqueta
FROM pedidos;
V tomto příkladu používáme CASE s více podmínkami k vyhodnocení součtu i stavu každé objednávky a přiřazení vhodného štítku. Pokud je součet větší než 1000 a stav je „Doručeno“, je označeno jako „VIP“. Pokud je součet větší než 500 a stav je „Doručeno“, je označen jako „Prioritní“. Pokud je stav „Čeká na vyřízení“, je označen jako „V procesu“. V opačném případě je označena jako „Normální“.
Příklad 6: Zpracování hodnot null pomocí CASE
Představte si, že máte tabulku nazvanou „zákazníci“ se sloupci „id“, „jméno“ a „e-mail“. Někteří zákazníci nemusí mít v záznamech e-mail, což by vedlo k nulovým hodnotám ve sloupci „e-mail“. Ke správnému zpracování těchto hodnot null můžete použít funkci CASE. Například:
SELECT nombre,
CASE
WHEN email IS NULL THEN 'Sin correo electrónico'
ELSE email
END AS informacion_contacto
FROM clientes;
V tomto příkladu používáme CASE k vyhodnocení, zda je sloupec „e-mail“ prázdný. Pokud je hodnota null, zobrazí se text „No email“. V opačném případě se zobrazí skutečná hodnota sloupce „e-mail“. To nám umožňuje elegantně řešit případy, kdy kontaktní informace chybí.
Příklad 7: Kombinace CASE s agregačními funkcemi
Funkci CASE lze také kombinovat s agregačními funkcemi, jako je SUM, AVG, COUNT atd. Předpokládejme, že máte tabulku nazvanou „prodej“ se sloupci „id“, „produkt“, „množství“ a „cena“. Chcete vypočítat celkový prodej podle kategorie produktu pomocí CASE a SUM. Můžete to udělat takto:
SELECT
SUM(CASE WHEN precio > 1000 THEN cantidad ELSE 0 END) AS ventas_premium,
SUM(CASE WHEN precio <= 1000 THEN cantidad ELSE 0 END) AS ventas_regulares
FROM ventas;
V tomto příkladu používáme CASE uvnitř funkce SUM k výpočtu celkových prodejů podle kategorie produktu. Pokud je cena vyšší než 1000, částka se přičte k „premium_sales“. Pokud je cena nižší nebo rovna 1000, částka se přičte k „pravidelnému_prodeji“. To nám umožňuje získat mezisoučty na základě konkrétních podmínek.
Příklad 8: Použití CASE v klauzulích WHERE
Funkci CASE lze také použít v klauzuli WHERE k filtrování záznamů na základě specifických podmínek. Předpokládejme, že máte tabulku nazvanou „zaměstnanci“ se sloupci „id“, „jméno“, „oddělení“ a „plat“. Chcete se zaměřit na zaměstnance, jejichž plat je nad průměrem jejich oddělení. Můžete to udělat takto:
SELECT nombre, departamento, salario
FROM empleados
WHERE salario > (
SELECT AVG(CASE WHEN e.departamento = empleados.departamento THEN e.salario ELSE NULL END)
FROM empleados e
);
V tomto příkladu používáme CASE v dílčím dotazu k výpočtu průměrné mzdy podle oddělení. Poddotaz porovnává oddělení každého zaměstnance s aktuálním oddělením a pro výpočet průměru bere v úvahu pouze platy zaměstnanců ve stejném oddělení. Poté v hlavním dotazu vyfiltrujeme zaměstnance, jejichž mzda je vyšší než průměr vypočtený pro jejich oddělení.
Příklad 9: Generování vypočítaných sloupců pomocí CASE
Funkci CASE lze také použít ke generování vypočítaných sloupců na základě specifických podmínek. Předpokládejme, že máte tabulku nazvanou „objednávky“ se sloupci „id“, „zákazník“, „celkem“ a „datum“. Chcete vytvořit další sloupec s názvem „sleva“, který použije různé procenta slevy v závislosti na celkové objednávce. Můžete to udělat takto:
SELECT id, cliente, total,
CASE
WHEN total > 1000 THEN total * 0.10
WHEN total > 500 THEN total * 0.05
ELSE 0
END AS descuento,
fecha
FROM pedidos;
V tomto příkladu používáme CASE ke generování vypočítaného sloupce „sleva“. Pokud je celková objednávka vyšší než 1000, je uplatněna sleva 10%. Pokud je součet větší než 500, je uplatněna sleva 5 %. V ostatních případech sleva neplatí. Tento vypočítaný sloupec lze použít pro další analýzu nebo pro zobrazení dalších informací ve výsledcích dotazu.
Příklad 10: Implementace komplexní logiky s vnořenými příkazy CASE
V některých případech může být nutné implementovat složitější podmíněnou logiku pomocí vnořených příkazů CASE. Předpokládejme, že máte tabulku nazvanou „students“ se sloupci „id“, „name“, „math_grade“ a „language_grade“. Každému studentovi chcete přiřadit kategorii na základě jeho známek z matematiky a jazyka. Můžete to udělat takto:
SELECT nombre,
CASE
WHEN nota_matematicas >= 90 AND nota_lenguaje >= 90 THEN 'Excelente'
WHEN nota_matematicas >= 80 AND nota_lenguaje >= 80 THEN 'Notable'
ELSE
CASE
WHEN nota_matematicas >= 70 OR nota_lenguaje >= 70 THEN 'Regular'
ELSE 'Necesita mejorar'
END
END AS categoria
FROM estudiantes;
V tomto příkladu používáme vnořené příkazy CASE k implementaci složitější podmíněné logiky. Nejprve vyhodnotíme, zda jsou známky z matematiky i jazyka vyšší nebo rovné 90. Pokud ano, je přiřazena kategorie „Výborně“. Poté vyhodnotíme, zda jsou oba stupně větší nebo rovny 80. Pokud ano, je přiřazena kategorie „Významné“. Pokud není splněna žádná z výše uvedených podmínek, přesuneme se na další úroveň vnořeného CASE. Zde hodnotíme, zda je alespoň jeden ze známek (matematika nebo jazyk) větší nebo roven 70. Pokud ano, je přiřazena kategorie „Normální“. Pokud není splněna žádná z podmínek, je přiřazena kategorie „Potřebuje zlepšení“.
Příklad 11: Optimalizace dotazů pomocí CASE
Funkci CASE lze také použít k optimalizaci dotazů a vyhnout se více samostatným dotazům. Předpokládejme, že máte tabulku nazvanou „prodej“ se sloupci „id“, „produkt“, „množství“ a „datum“. Chcete získat celkový prodej za měsíc a celkový prodej za rok v jediném dotazu. Můžete to udělat takto:
SELECT
SUM(CASE WHEN MONTH(fecha) = 1 THEN cantidad ELSE 0 END) AS ventas_enero,
SUM(CASE WHEN MONTH(fecha) = 2 THEN cantidad ELSE 0 END) AS ventas_febrero,
-- ... (continúa para los demás meses)
SUM(CASE WHEN YEAR(fecha) = 2022 THEN cantidad ELSE 0 END) AS ventas_2022,
SUM(CASE WHEN YEAR(fecha) = 2023 THEN cantidad ELSE 0 END) AS ventas_2023
FROM ventas;
V tomto příkladu používáme CASE uvnitř funkce SUM k výpočtu celkových prodejů podle měsíce a roku v jediném dotazu. U každého měsíce vyhodnotíme, zda se měsíc data prodeje shoduje s konkrétním měsícem a přičteme odpovídající částku. Podobně u každého roku vyhodnotíme, zda se rok data prodeje shoduje s konkrétním rokem a připočteme odpovídající částku. To nám umožňuje získat všechny součty v jednom efektivním dotazu.
Doporučené postupy při používání CASE v MySQL
- CASE používejte pouze v případě potřeby a vyhněte se jeho nadměrnému používání, protože při nadměrném používání může ovlivnit výkon dotazu.
- Snažte se, aby výrazy CASE byly co nejjednodušší a čitelné. Pokud se logika stane příliš složitou, zvažte její rozdělení do více výrazů CASE nebo použití poddotazů.
- Použijte CASE v kombinaci s dalšími klauzulemi a funkcemi MySQL, abyste plně využili jejich potenciál, jako například v WHERE, ORDER BY, SKUPINA VYTVOŘENÁ a agregační funkce.
- Buďte opatrní při vnořování více CASE výrazů, protože to může znesnadnit čtení a údržbu vašeho kódu. V případě potřeby přidejte vysvětlující komentáře.
Časté chyby při používání CASE a jak se jim vyvarovat
- Zapomeňte na klauzuli ELSE: Nezapomeňte zahrnout klauzuli ELSE pro řešení případů, kdy není splněna žádná z podmínek. Pokud není zadáno, bude ve výchozím nastavení přiřazena hodnota NULL.
- Neukončujte výraz CASE pomocí END: Nezapomeňte vždy ukončit výraz CASE klíčovým slovem END. V opačném případě se zobrazí chyba syntaxe.
- Použití nekompatibilních datových typů: Ujistěte se, že výsledky vrácené každou podmínkou WHEN mají stejný datový typ. Pokud kombinujete datové typy, můžete získat neočekávané výsledky nebo chyby.
- Bez ohledu na pořadí podmínek: Podmínky v CASE se vyhodnocují v pořadí, v jakém se objevují. Ujistěte se, že specifičtější podmínky umístíte před obecnější, abyste dosáhli požadovaných výsledků.
Alternativy k CASE v MySQL
Přestože CASE je výkonná funkce, v určitých případech můžete zvážit některé alternativy:
- IF výrazy: Funkce IF v MySQL umožňuje vyhodnotit podmínku a vrátit hodnotu, pokud je podmínka pravdivá, a jinou hodnotu, pokud je nepravdivá. Je to jednodušší alternativa pro případy jedinečných podmínek.
- Vyhledávací tabulky: V některých případech můžete k uložení podmínek a odpovídajících výsledků použít samostatné vyhledávací tabulky. Tyto tabulky pak můžete spojit s hlavní tabulkou a získat požadované výsledky.
- Uložené pohledy nebo funkce: Pokud máte složité dotazy, které opakovaně používají CASE, můžete zvážit vytvoření pohledů nebo uložené funkce zapouzdřit tuto logiku a zjednodušit následné dotazy.
Často kladené otázky o CASE v MySQL
1. Mohu použít CASE v kombinaci s dalšími funkcemi MySQL?
Ano, CASE můžete používat v kombinaci s dalšími funkcemi MySQL, jako jsou agregační funkce (SUM, AVG, COUNT atd.), funkce data a času (YEAR, MONTH, DAY atd.), řetězcové funkce (CONCAT, SUBSTRING, LENGTH atd.) a další.
2. Existuje omezení počtu podmínek WHEN, které mohu použít ve výrazu CASE?
Neexistuje žádné konkrétní omezení počtu podmínek WHEN, které můžete použít ve výrazu CASE. Mějte však na paměti, že čitelnost kódu a výkon dotazů může ovlivnit velké množství podmínek. Pokud máte mnoho podmínek, zvažte zjednodušení logiky nebo její rozdělení do více CASE výrazů.
3. Mohu použít poddotazy uvnitř výrazu CASE?
Ano, v rámci výrazu CASE můžete použít poddotazy, a to jak v podmínkách WHEN, tak ve výsledcích THEN. To umožňuje provádět složitější výpočty nebo porovnávání na základě výsledků jiných dotazů.
4. Jak mohu zpracovat hodnoty null ve výrazu CASE?
Hodnoty null ve výrazu CASE můžete zpracovat pomocí podmínky IS NULL nebo IS NOT NULL. Můžete například použít CASE WHEN column IS NULL THEN 'Null value' ELSE sloupec END k přiřazení konkrétní hodnoty, když je sloupec null, a vrátit skutečnou hodnotu, když tomu tak není.
Případové závěry v Mysql
Funkce CASE v MySQL je výkonný a všestranný nástroj, který vám umožňuje provádět podmíněné operace v rámci vašich dotazů. Pomocí CASE můžete vyhodnotit různé podmínky a vrátit konkrétní výsledky v závislosti na tom, zda jsou tyto podmínky splněny nebo ne. Příklady uvedené v tomto článku vám poskytují pevný základ pro to, abyste mohli začít používat CASE ve svých vlastních dotazech a přizpůsobit jej vašim konkrétním potřebám.
Při používání CASE nezapomeňte dodržovat osvědčené postupy, jako je například udržování jednoduchých a čitelných výrazů, používání CASE v kombinaci s dalšími klauzulemi a funkcemi MySQL a zvažování alternativ, když je to vhodné. S praxí a experimentováním budete schopni plně využít CASE v MySQL a zlepšit efektivitu a čitelnost vašich dotazů.
Máte-li jakékoli další otázky nebo potřebujete další příklady, neváhejte vyhledat další zdroje nebo nahlédněte do oficiální dokumentace MySQL. Pokračujte ve zkoumání a využívání síly CASE ve svých databázových projektech!
Dodatečné zdroje:
Index
- 0.1 Co je funkce CASE v MySQL?
- 0.2 Základní syntaxe CASE v MySQL
- 0.3 Příklad 1: Klasifikujte studenty podle jejich průměru
- 0.4 Příklad 2: Přiřazení kategorií produktů
- 0.5 Příklad 3: Vypočítejte slevy na základě zakoupeného množství
- 0.6 Příklad 4: Převod číselných hodnot na rozsahy
- 0.7 Příklad 5: Přiřazení štítků na základě více podmínek
- 0.8 Příklad 6: Zpracování hodnot null pomocí CASE
- 0.9 Příklad 7: Kombinace CASE s agregačními funkcemi
- 0.10 Příklad 8: Použití CASE v klauzulích WHERE
- 0.11 Příklad 9: Generování vypočítaných sloupců pomocí CASE
- 0.12 Příklad 10: Implementace komplexní logiky s vnořenými příkazy CASE
- 0.13 Příklad 11: Optimalizace dotazů pomocí CASE
- 1 Doporučené postupy při používání CASE v MySQL
- 2 Časté chyby při používání CASE a jak se jim vyvarovat
- 3 Alternativy k CASE v MySQL
- 4 Často kladené otázky o CASE v MySQL
- 5 Případové závěry v Mysql