- 1 1. Úvod
- 2 2. Co je funkce IFNULL?
- 3 3. Praktické příklady funkce IFNULL
- 4 3.5 Umístit hodnoty NULL na konec v ORDER BY
- 5 4. Rozdíly mezi IFNULL a COALESCE
- 6 5. Funkce pro zpracování NULL v databázích jiných než MySQL
- 7 6. Často kladené otázky (FAQ)
- 8 7. Závěr
1. Úvod
Při práci s databázemi je zpracování hodnot NULL kritickým bodem.
Konkrétně není neobvyklé, že lidé zvyklí na Oracle funkci NVL zjistí, že NVL není k dispozici při migraci na MySQL.
V MySQL můžete hodnoty NULL správně zpracovat pomocí funkce IFNULL místo NVL.
Tento článek podrobně vysvětluje jak pracovat s hodnotami NULL v MySQL, včetně použití IFNULL a rozdílů oproti jiným funkcím pro zpracování NULL.
1.1 Co je hodnota NULL?
V databázích NULL znamená „žádná hodnota nebyla nastavena“.
Protože je to odlišné od „0“ nebo „prázdného řetězce“, nesprávné zacházení s ní může vést k neočekávaným chybám nebo nesprávným výsledkům dotazů.
Například předpokládejme, že máte data jako v následujícím příkladu.
| ID | Name | Age |
|---|---|---|
| 1 | Yamada | 25 |
| 2 | Sato | NULL |
| 3 | Suzuki | 30 |
V uvedených datech je věk pro ID „2“ (Sato) NULL.
Pokud provádíte výpočty tak, jak jsou, můžete získat chyby nebo nechtěné výsledky.
1.2 Jak MySQL zachází s hodnotami NULL
2. Co je funkce IFNULL?
MySQL poskytuje funkci IFNULL jako funkci pro nahrazení hodnot NULL jinou hodnotou.
Plní roli podobnou Oracle funkci NVL.
Správným zpracováním hodnot NULL můžete předejít problémům s výpočty způsobeným chybějícími daty a vytvořit stabilnější SQL dotazy.
Podívejme se podrobněji na základní použití IFNULL.
2.1 Základní syntaxe IFNULL
Základní syntaxe funkce IFNULL je následující.
IFNULL(expression, fallback_value)
- expression : Sloupec nebo hodnota, která se má kontrolovat na NULL
- fallback_value : Hodnota, která se vrátí, když je výraz NULL (pokud není NULL, vrátí se samotný výraz)
Například uvažujme následující SQL příkaz.
SELECT IFNULL(NULL, 'Fallback value');
V tomto případě, protože je specifikováno NULL, výsledek se stane 'Fallback value'.
| Result |
|---|
| Fallback value |
Na druhou stranu, pokud zadáte hodnotu, která není NULL, tato hodnota se vrátí tak, jak je.
SELECT IFNULL('Hello', 'Fallback value');
| Result |
|---|
| Hello |
2.2 Klíčové vlastnosti IFNULL
Funkce IFNULL má následující vlastnosti.
- Může převést hodnoty NULL na konkrétní hodnotu
- Můžete nastavit alternativní výchozí hodnotu pro sloupce, které mohou obsahovat NULL.
- Používá jednoduchou syntaxi
- Je jednodušší napsat než použití
CASEvýrazu.
- Je třeba zvážit datové typy
- Doporučuje se, aby argumenty funkce
IFNULLměly stejný datový typ.
Například následující SQL může způsobit chybu.
SELECT IFNULL(100, 'Error');
Důvod: Smíchání číselného typu (100) a řetězcového typu (‚Error‘).
V tomto případě by měla být náhradní hodnota také číselná.
SELECT IFNULL(100, 0);
2.3 Kdy použít IFNULL
Zde jsou některé praktické situace, kdy je IFNULL užitečný.
- Nastavit výchozí hodnotu pro NULL
- Například pokud je bonus zaměstnance NULL, nastavte jej na 0.
SELECT name, IFNULL(bonus, 0) AS bonus FROM employees;
- Vyhnout se výpočtům zahrnujícím NULL
- Pokud provádíte výpočet s NULL tak, jak je, výsledek se také stane NULL.
- Použití
IFNULLk vyhnutí se NULL umožní požadovaný výpočet.SELECT name, salary, IFNULL(bonus, 0) AS bonus, salary + IFNULL(bonus, 0) AS total_income FROM employees;
- Správně zpracovat NULL v reportech a agregacích
- Pokud je během analýzy přítomen NULL, mohou být vytvořeny nesprávné reporty.
- Nahrazením NULL konkrétní hodnotou pomocí
IFNULLmůžete data zpracovávat konzistentně.
3. Praktické příklady funkce IFNULL
V předchozí sekci jsme vysvětlili základy funkce IFNULL.
V této sekci představíme konkrétní příklady jejího použití s reálnými daty.
3.1 Nahrazení hodnot NULL výchozí hodnotou
Pokud tabulka obsahuje hodnoty NULL, může to způsobit nechtěné chování.
Pro řešení můžete použít IFNULL k nahrazení NULL výchozí hodnotou.
Příklad: Pokud je bonus zaměstnance NULL, nastavte výchozí hodnotu na 0
SELECT name, IFNULL(bonus, 0) AS bonus
FROM employees;
Data před provedením
| name | bonus |
|---|---|
| Sato | 5000 |
| Suzuki | NULL |
| Takahashi | 8000 |
Po použití IFNULL
| name | bonus |
|---|---|
| Sato | 5000 |
| Suzuki | 0 |
| Takahashi | 8000 |
Nahrazení NULL hodnotou 0 usnadňuje agregaci a související zpracování.
3.2 Vyhněte se výpočtům, které zahrnují NULL
V MySQL se výsledek výpočtu, který zahrnuje NULL, stane NULL.
Proto je třeba použít IFNULL, aby se NULL předešlo.
Příklad: Vypočítejte součet platu a bonusu
SELECT name, salary, IFNULL(bonus, 0) AS bonus, salary + IFNULL(bonus, 0) AS total_income
FROM employees;
Data před provedením
| name | salary | bonus |
|---|---|---|
| Sato | 300000 | 5000 |
| Suzuki | 280000 | NULL |
| Takahashi | 320000 | 8000 |
Po použití IFNULL
| name | salary | bonus | total_income |
|---|---|---|---|
| Sato | 300000 | 5000 | 305000 |
| Suzuki | 280000 | 0 | 280000 |
| Takahashi | 320000 | 8000 | 328000 |
Pokud je bonus NULL, součet (salary + bonus) se také stane NULL,
ale použitím IFNULL MySQL považuje NULL za 0 a vypočítá správně.
3.3 Nahraďte NULL jiným řetězcem
Můžete nastavit výchozí řetězec nejen pro čísla, ale i když je hodnota NULL.
Příklad: Zobrazit „Neregistrováno“ pro uživatele bez e‑mailové adresy
SELECT id, name, IFNULL(email, 'Not registered') AS email
FROM users;
Data před provedením
| id | name | |
|---|---|---|
| 1 | Sato | satou@example.com |
| 2 | Suzuki | NULL |
| 3 | Takahashi | takahashi@example.com |
Po použití IFNULL
| id | name | |
|---|---|---|
| 1 | Sato | satou@example.com |
| 2 | Suzuki | Not registered |
| 3 | Takahashi | takahashi@example.com |
Pokud zůstane jako NULL, pole se zobrazí prázdné, ale IFNULL to učiní explicitním s „Neregistrováno“.
3.4 Použijte IFNULL ve WHERE klauzuli
Můžete použít IFNULL ve WHERE klauzuli k filtrování na základě podmínek, které zahrnují hodnoty NULL.
Příklad: Získat pouze uživatele s hodnotou NULL
SELECT *
FROM users
WHERE IFNULL(email, '') = '';
Toto SQL zachází s email jako s '' (prázdným řetězcem), když je NULL, a získává pouze uživatele, jejichž e‑mail je NULL.
3.5 Umístit hodnoty NULL na konec v ORDER BY
Obvykle, když použijete ORDER BY, hodnoty NULL se mohou objevit jako první, ale můžete použít IFNULL k jejich přesunu na konec.
Příklad: Umístit řádky s hodnotou NULL na konec
SELECT name, salary
FROM employees
ORDER BY IFNULL(salary, 0) ASC;
4. Rozdíly mezi IFNULL a COALESCE
MySQL poskytuje několik funkcí pro práci s hodnotami NULL a IFNULL a COALESCE jsou často srovnávány.
Obě nahrazují hodnoty NULL alternativami, ale jejich použití a chování se liší.
V této sekci vysvětlujeme rozdíly mezi IFNULL a COALESCE a jak vybrat ten správný.
4.1 Co je funkce COALESCE?
Funkce COALESCE vrací první nenulovou hodnotu mezi více argumenty.
Jinými slovy, zatímco IFNULL vybírá nenulovou hodnotu mezi dvěma hodnotami,
COALESCE se liší tím, že vybírá první nenulovou hodnotu z více kandidátů.
Syntaxe
COALESCE(expr1, expr2, ... , exprN)
- Vyhodnocuje zleva doprava a vrací první nenulovou hodnotu
- Vrací NULL, pokud jsou všechny argumenty NULL
Příklad: Nahrazení NULL pomocí COALESCE
SELECT name, COALESCE(phone, email, 'Not registered') AS contact_info
FROM customers;
V tomto případě jsou hodnoty určeny následovně.
- Pokud
phonenení NULL, vraťphone. - Pokud je
phoneNULL aemailnení NULL, vraťemail. - Pokud jsou oba
phoneiemailNULL, vrať'Not registered'.
4.2 Rozdíly mezi IFNULL a COALESCE
| Comparison item | IFNULL | COALESCE |
|---|---|---|
| NULL handling | Returns the fallback value if one expression is NULL | Evaluates multiple expressions and returns the first non-NULL value |
| Number of arguments | Only 2 | 2 or more (multiple allowed) |
| Use case | Simple NULL replacement | NULL handling with priority order |
| Execution speed | Fast (compares only 2 values) | Slightly slower (evaluates multiple values in order) |
4.3 Praktické příklady IFNULL a COALESCE
Příklad 1: Jednoduché nahrazení NULL
S IFNULL můžete vybrat nenulovou hodnotu mezi dvěma hodnotami.
SELECT name, IFNULL(phone, 'Not registered') AS contact_info
FROM customers;
Výsledek
| name | phone | contact_info |
|---|---|---|
| Sato | 080-1234-5678 | 080-1234-5678 |
| Suzuki | NULL | Not registered |
Příklad 2: Upřednostnit první dostupnou nenulovou hodnotu
S COALESCE můžete získat první nenulovou hodnotu.
SELECT name, COALESCE(phone, email, 'Not registered') AS contact_info
FROM customers;
Výsledek
| name | phone | contact_info | |
|---|---|---|---|
| Sato | 080-1234-5678 | satou@example.com | 080-1234-5678 |
| Suzuki | NULL | suzuki@example.com | suzuki@example.com |
| Takahashi | NULL | NULL | Not registered |
- Pokud
phonenení NULL, vraťphone - Pokud je
phoneNULL aemailnení NULL, vraťemail - Pokud jsou oba
phoneiemailNULL, vrať'Not registered'
4.4 Jak vybrat mezi IFNULL a COALESCE
✔ Kdy byste měli použít IFNULL
✅ Když chcete jednoduchou náhradu NULL výchozí hodnotou
✅ Když stačí dva argumenty (např. převést NULL na 0)
✔ Kdy byste měli použít COALESCE
✅ Když chcete najít první nenullovou hodnotu (např. phone → email → „Not registered“)
✅ Když potřebujete vyhodnotit tři nebo více hodnot
4.5 Porovnání výkonu mezi IFNULL a COALESCE
Obecně je IFNULL rychlejší než COALESCE.
Je to proto, že IFNULL vyhodnocuje pouze dvě hodnoty, zatímco COALESCE vyhodnocuje více hodnot v pořadí.
Test výkonu
Při aplikaci IFNULL a COALESCE na 1 milion řádků můžete vidět výsledky jako níže.
| Function | Execution time (seconds) |
|---|---|
IFNULL | 0.02 |
COALESCE | 0.05 |
➡ Při velkém objemu dat může být IFNULL mírně rychlejší.
➡ Nicméně, pokud potřebujete jen jeden náhradní výstup, použijte IFNULL; pokud chcete více kandidátů, použijte COALESCE.

5. Funkce pro zpracování NULL v databázích jiných než MySQL
MySQL poskytuje funkci IFNULL pro zpracování hodnot NULL, ale jiné systémy řízení databází (DBMS) používají různé funkce.
V hlavních databázích jako Oracle, PostgreSQL a SQL Server je běžné používat funkce, které se od MySQL liší při zpracování NULL.
Tato sekce vysvětluje jak jsou hodnoty NULL zpracovávány v databázích jiných než MySQL.
5.1 Zpracování NULL v Oracle: funkce NVL
V Oracle je k dispozici funkce NVL, která je ekvivalentem MySQL IFNULL.
Funkce NVL vrací jinou hodnotu, pokud je zadaná hodnota NULL.
Syntaxe
NVL(expression, fallback_value)
- expression : Sloupec nebo hodnota, která se má kontrolovat na NULL
- fallback_value : Hodnota, která se vrátí, když je NULL (pokud není NULL, vrátí se výrazu beze změny)
Příklad
SELECT name, NVL(salary, 0) AS salary
FROM employees;
Výsledek
| name | salary |
|---|---|
| Sato | 5000 |
| Suzuki | 0 |
| Takahashi | 8000 |
Chování NVL je téměř stejné jako u MySQL IFNULL, takže v Oracle můžete jednoduše použít NVL.
5.2 Zpracování NULL v PostgreSQL a SQL Server: funkce COALESCE
V PostgreSQL a SQL Server se používá funkce COALESCE k nahrazení hodnot NULL alternativami.
Tato funkce může vrátit první nenullovou hodnotu mezi více kandidáty.
Syntaxe
COALESCE(expr1, expr2, ..., exprN)
- Vyhodnocuje zleva doprava a vrací první nenullovou hodnotu
- Vrátí NULL, pokud jsou všechny argumenty NULL
Příklad
SELECT name, COALESCE(phone, email, 'Not registered') AS contact_info
FROM customers;
Výsledek
| name | phone | contact_info | |
|---|---|---|---|
| Sato | 080-1234-5678 | satou@example.com | 080-1234-5678 |
| Suzuki | NULL | suzuki@example.com | suzuki@example.com |
| Takahashi | NULL | NULL | Not registered |
Jak je uvedeno výše, v PostgreSQL a SQL Server umožňuje použití COALESCE flexibilnější zpracování NULL než MySQL IFNULL.
5.3 Porovnání funkcí pro zpracování NULL napříč databázemi
| Database | NULL-handling function | Role |
|---|---|---|
| MySQL | IFNULL(expression, fallback_value) | Convert NULL to a fallback value |
| Oracle | NVL(expression, fallback_value) | Convert NULL to a fallback value (equivalent to IFNULL) |
| PostgreSQL / SQL Server | COALESCE(expr1, expr2, ...) | Return the first non-NULL value |
- Jednoduché zpracování NULL →
IFNULL(MySQL) neboNVL(Oracle) - Výběr nejlepší hodnoty z více kandidátů →
COALESCE(PostgreSQL, SQL Server)
5.4 Poznámky při migraci mezi různými DBMS
Při migraci systémů mezi různými databázemi musíte věnovat pozornost rozdílům ve funkcích pro zpracování NULL.
Zvláště při migraci z Oracle do MySQL je nutné přepsat NVL na IFNULL.
Příklady přepisů během migrace
- Oracle (NVL)
SELECT NVL(salary, 0) AS salary FROM employees;
- MySQL (IFNULL)
SELECT IFNULL(salary, 0) AS salary FROM employees;
- PostgreSQL / SQL Server (COALESCE)
SELECT COALESCE(salary, 0) AS salary FROM employees;
Also, because COALESCE can accept multiple arguments, it is more flexible than Oracle’s NVL or MySQL’s IFNULL.
During migration, it’s important to choose the correct function for the target database.
6. Často kladené otázky (FAQ)
Otázky ohledně funkce IFNULL v MySQL a zacházení s NULL jsou důležité pro vývojáře a správce databází.
Tato sekce shrnuje běžné otázky o IFNULL.
Q1. Jsou funkce IFNULL a NVL stejné?
➡ Poskytují téměř stejnou funkčnost, ale název funkce se liší podle databáze.
| Database | NULL-handling function |
|---|---|
| MySQL | IFNULL(expression, fallback_value) |
| Oracle | NVL(expression, fallback_value) |
| PostgreSQL / SQL Server | COALESCE(expr1, expr2, ...) |
V MySQL použijte IFNULL; v Oracle použijte NVL k převodu NULL hodnot na náhradní hodnotu.
Q2. Jaký je rozdíl mezi IFNULL a COALESCE?
➡ IFNULL vrací nenullovou hodnotu mezi dvěma argumenty, zatímco
COALESCE vrací první nenullovou hodnotu mezi více argumenty.
| Function | Feature |
|---|---|
IFNULL(a, b) | If a is NULL, return b (only two arguments) |
COALESCE(a, b, c, ...) | Evaluates left to right and returns the first non-NULL value |
Příklady
SELECT IFNULL(NULL, 'Fallback value'); -- Result: 'Fallback value'
SELECT COALESCE(NULL, NULL, 'First non-NULL value'); -- Result: 'First non-NULL value'
✔ Kdy použít IFNULL
✅ Vrátit konkrétní výchozí hodnotu, když je NULL (např. pokud je NULL, pak 0)
✅ Když porovnáváte pouze dvě hodnoty
✔ Kdy použít COALESCE
✅ Získat první nenullovou hodnotu (např. telefon → e‑mail → výchozí hodnota)
✅ Když potřebujete vyhodnotit tři nebo více hodnot
Q3. Lze IFNULL použít s datovými typy jinými než čísly?
➡ Ano. IFNULL lze použít s řetězci, daty, čísly a dalšími typy.
Příklad 1: Použití řetězců
SELECT name, IFNULL(email, 'Not registered') AS email
FROM users;
Příklad 2: Použití dat
SELECT name, IFNULL(last_login, '2000-01-01') AS last_login
FROM users;
Nicméně míchání různých datových typů (např. čísel a řetězců) může způsobit chyby, proto buďte opatrní.
SELECT IFNULL(100, 'Error'); -- May cause an error due to different data types
Q4. Snižuje použití IFNULL výkon?
➡ Obecně je dopad na výkon minimální, ale může být významný při zpracování velkých objemů dat.
IFNULLje obvykle rychlý, protože kontroluje jen dvě hodnoty- Nicméně časté používání
IFNULLna velmi velkých datových sadách (miliony řádků) může ovlivnit optimalizaci indexů v některých případech
🔹 Tipy pro optimalizaci výkonu
- Nastavte indexy vhodně
- Dotazy jako
IFNULL(column, 0) = 100mohou v některých případech zabránit použití indexů - Jedním přístupem je ukládat hodnoty s vhodnou výchozí hodnotou místo NULL od začátku
IFNULLje lehčí nežCOALESCE
- Protože
COALESCEvyhodnocuje více hodnot postupně,IFNULLmůže být v mnoha případech rychlejší
Q5. Lze místo IFNULL použít CASE?
➡ Ano. Podobné chování lze dosáhnout pomocí CASE, ale kód se stane podrobnějším.
S IFNULL
SELECT name, IFNULL(salary, 0) AS salary
FROM employees;
S CASE
SELECT name,
CASE WHEN salary IS NULL THEN 0 ELSE salary END AS salary
FROM employees;
✔ IFNULL je stručný a snadno použitelný
✔ CASE podporuje flexibilnější podmínky (např. můžete zahrnout i podmínky, které nejsou NULL)
Q6. Lze IFNULL použít ve WHERE klauzuli?
➡ Ano. IFNULL lze použít uvnitř WHERE klauzule.
Příklad: Nahrazení NULL konkrétní hodnotou při vyhledávání
SELECT * FROM users WHERE IFNULL(status, 'Not set') = 'Not set';
Toto získá záznamy, kde je status NULL.
Shrnutí
IFNULLaNVLmají téměř stejnou funkčnost, ale liší se podle DBMSIFNULLvyhodnocuje 2 hodnoty;COALESCEvyhodnocuje více hodnot- Funguje s řetězci, daty, čísly a dalšími typy
- U velkých datových sad zvažte optimalizaci indexů
- Můžete použít
CASEmístoIFNULL IFNULLlze také použít veWHEREklauzulích
7. Závěr
V tomto článku jsme podrobně probrali funkci IFNULL v MySQL, včetně toho, jak zacházet s hodnotami NULL, jak se liší od jiných funkcí a praktických příkladů.
Nakonec si stručně shrneme, co jsme pokryli.
7.1 Co je funkce IFNULL?
IFNULLvrací náhradní hodnotu, když je zadaná hodnota NULL- Syntaxe :
IFNULL(expression, fallback_value)
- Vyhýbáním se NULL můžete předejít chybám ve výpočtech a problémům s chybějícími daty
7.2 Praktické příklady IFNULL
- Nahradit NULL výchozí hodnotou (0 nebo konkrétním řetězcem)
SELECT name, IFNULL(bonus, 0) AS bonus FROM employees;
- Správně zacházet s výpočty, které zahrnují NULL
SELECT name, salary + IFNULL(bonus, 0) AS total_income FROM employees;
- Převést NULL na vhodný řetězec, například “Neregistrováno”
SELECT id, IFNULL(email, 'Not registered') AS email FROM users;
- Použít ve
WHEREklauzulích k filtrování hodnot NULLSELECT * FROM users WHERE IFNULL(status, 'Not set') = 'Not set';
7.3 Rozdíly mezi IFNULL a COALESCE
IFNULLvrací nenullovou hodnotu mezi dvěma argumentyCOALESCEvrací první nenullovou hodnotu mezi více argumenty- Jak vybrat
- Jednoduché zacházení s NULL →
IFNULL - Vybrat první nenullovou hodnotu →
COALESCE
7.4 Zacházení s NULL v jiných DBMS
| Database | NULL-handling function |
|---|---|
| MySQL | IFNULL(expression, fallback_value) |
| Oracle | NVL(expression, fallback_value) |
| PostgreSQL / SQL Server | COALESCE(expr1, expr2, ...) |
NVLv Oracle je téměř stejný jakoIFNULLv MySQL- PostgreSQL a SQL Server běžně používají
COALESCE - Při migraci musíte funkce vhodně nahradit
7.5 Výkon a opatrnost u IFNULL
IFNULLje lehčí nežCOALESCE- U velkých datových sad může výkon klesat, pokud je ovlivněna optimalizace indexů
- Dejte pozor, aby typy dat zůstaly konzistentní (nemíchejte číselné a řetězcové typy)
7.6 Závěrečné poznatky
- V MySQL použijte
IFNULLpro správné zacházení s NULL - Můžete zpracovávat data, aniž by vás ovlivňoval NULL
- Rozumějte rozdílům mezi
COALESCEaNVLa použijte správnou funkci - Při migraci mezi databázemi věnujte pozornost rozdílům v funkcích pro zacházení s NULL


