TGViewer
SQL и Анализ данных SQL и Анализ данных @databases_tg · 12.5K subscribers
Post #985 3.14K
🛢️ SQL-задача с подвохом: NULL ловушка

Условие:

Есть таблица employees:

| id | name | department |
|-----|----------|------------|
| 1 | Alice | Sales |
| 2 | Bob | NULL |
| 3 | Charlie | HR |
| 4 | Diana | NULL |
| 5 | Eve | Sales |

Ты хочешь выбрать всех сотрудников, которые не работают в отделе Sales. Пишешь простой запрос:


SELECT * FROM employees
WHERE department <> 'Sales';


❓ Вопрос:
Какие строки вернёт этот запрос? Почему результат может удивить даже опытных специалистов?

---

🔍 Разбор:

На первый взгляд логика понятна: мы хотим исключить сотрудников из отдела Sales. Кажется, что должны вернуться:

- Bob (NULL)
- Charlie (HR)
- Diana (NULL)

Но вот главный подвох: NULL — это "неизвестное значение", и в SQL любые сравнения с NULL дают UNKNOWN.

Запрос:


WHERE department <> 'Sales'


- Charlie (HR): ✅ вернётся, потому что HR <> Sales.
- Bob (NULL): ❌ НЕ вернётся, потому что NULL <> 'Sales' даёт UNKNOWN (не TRUE).
- Diana (NULL): ❌ по той же причине.
- Alice и Eve: ❌ потому что у них Sales.

---

✅ Фактический результат:

| id | name | department |
|-----|---------|------------|
| 3 | Charlie | HR |

---

💥 Подвох:

Многие думают, что NULL автоматически участвует в сравнении как будто это "значение", но SQL строго следует трёхзначной логике:

- TRUE
- FALSE
- UNKNOWN

В WHERE фильтре остаются только строки, где условие = TRUE. Строки с NULL дают UNKNOWN и отбрасываются.

---

🛠 Как исправить запрос, чтобы включить сотрудников без отдела (NULL):


SELECT * FROM employees
WHERE department <> 'Sales' OR department IS NULL;


Теперь вернётся:

| id | name | department |
|-----|---------|------------|
| 2 | Bob | NULL |
| 3 | Charlie | HR |
| 4 | Diana | NULL |

---

✅ Вывод:

• В SQL сравнения с NULL всегда возвращают UNKNOWN.
• Обычные условия (`<>`, =, >, <`) **не учитывают NULL правильно**, если явно не проверить `IS NULL или IS NOT NULL.
• Даже простой фильтр может дать неожиданный результат, если в данных есть пропуски.

💡 Бонус-вопрос:
Что будет, если использовать NOT department = 'Sales' вместо department <> 'Sales'? 😉

➡ SQL Community |
  • 👍 25
  • 🔥 12
  • ❤ 6
  • 🤨 2
More from @databases_tg
  1. Oct 2, 2026Как SQLite превращает числа в текст в 2 раза быстрее? Трюк с парами цифр Обычно число пере…
  2. Oct 2, 2026В субботу, 17 октября, Москва станет точкой притяжения для всех специалистов в области Rec…
  3. Oct 1, 2026Жиз
  4. Sep 30, 2026📝 5 уровней ИИ-агентов: от промпта до продакшена Context, loop, Jev, harness и evals: раз…
  5. Sep 26, 2026UPDATE — оператор обновления данных в MySQL 🗂️ Если в таблице нужно изменить значение в у…
  6. Sep 25, 2026🧠 SQL-задача с подвохом Есть таблица транзакций: CREATE TABLE transactions ( id int PRIMA…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →