JavaRush /Курси /SQL SELF /Типові помилки при роботі з NULL

Типові помилки при роботі з NULL

SQL SELF
Рівень 10 , Лекція 4
Відкрита

У цій лекції ми ще краще познайомимось із загадковим знайомим NULL. Звісно, твої власні помилки при роботі з ним ще попереду, але... попереджений — озброєний. Розглянемо кілька типових помилок, пов’язаних із NULL.

Помилка 1: Використання звичайного оператора = для перевірки NULL

Мабуть, найпопулярніша помилка серед новачків у SQL — спроба використати оператор = для перевірки, чи дорівнює значення NULL.

Що відбувається?

SELECT *
FROM students
WHERE age = NULL;

Наївно думаючи, що це покаже всіх студентів із невизначеним віком, ти будеш розчарований: цей запит нічого не поверне. Чому? Вся справа в тому, що NULL не є значенням, а отже, звичайні оператори порівняння з ним не працюють. Як сказано у чарівній книзі SQL: "NULL ні з чим не можна порівнювати напряму".

Як треба?

Щоб перевірити, чи значення NULL, використовуй IS NULL:

SELECT *
FROM students
WHERE age IS NULL;

Тепер ти отримаєш усіх студентів, вік яких не вказаний.

Помилка 2: Агрегатні функції ігнорують NULL (крім COUNT(*))

Коли виконуються запити з агрегатними функціями, NULL автоматично виключається з розрахунків. Це може призвести до неочікуваних результатів.

Що відбувається?

SELECT AVG(salary) AS avg_salary
FROM employees;

Якщо в колонці salary є NULL, такі рядки просто ігноруються, і середня зарплата буде порахована без урахування цих записів. Це може створити хибне уявлення про середню зарплату.

Як уникнути?

Перед тим як виконувати агрегування, переконайся, що ти коректно замінюєш NULL на значення за замовчуванням. Наприклад, використовуй COALESCE():

SELECT AVG(COALESCE(salary, 0)) AS avg_salary
FROM employees;

Тепер NULL-значення будуть замінені на 0 перед розрахунком.

Помилка 3: Порівняння NULL між собою

У базі даних NULL не дорівнює буквально нічому, навіть іншому NULL. Це може здивувати.

Що відбувається?

SELECT *
FROM students
WHERE NULL = NULL;

Цей запит теж поверне порожній результат. Чому? Бо SQL вважає, що відсутність одного значення не може бути "рівною" відсутності іншого. Так, SQL — філософська мова.

Як треба?

Якщо треба перевірити два NULL на "рівність", використовуй спеціальні конструкції типу IS NULL. Наприклад:

SELECT *
FROM students
WHERE first_name IS NULL AND last_name IS NULL;

Помилка 4: Ділення на NULL

Ділення на NULL — це не просто помилка, а свого роду математичний злочин, який SQL карає безглуздим результатом — NULL.

Що відбувається?

SELECT 10 / NULL AS result;

Результат? NULL. SQL навіть не намагається зрозуміти, чого ти від нього хочеш.

Як уникнути?

Щоб убезпечити свої запити від таких непорозумінь, використовуй COALESCE() або NULLIF():

SELECT 10 / COALESCE(divisor, 1) AS result
FROM calculations;

У цьому запиті, якщо divisor виявиться NULL, замість ділення на NULL буде ділення на 1.

Помилка 5: Непрацюючі логічні оператори з NULL

NULL ламає логіку, як тільки з’являється у виразах. Наприклад, умова TRUE AND NULL поверне NULL, а не TRUE чи FALSE.

Що відбувається?

SELECT *
FROM students
WHERE age > 18 OR age = NULL;

У цьому випадку навіть якщо age > 18 істинно для деяких записів, частина рядків із NULL у колонці age може бути виключена з результату. Чому? Бо частина виразу age = NULL буде повертати NULL, а не TRUE.

Як треба?

Завжди явно обробляй NULL значення у логічних умовах:

SELECT *
FROM students
WHERE age > 18 OR age IS NULL;

Помилка 6: Неявна поведінка при сортуванні NULL (найбільш "важка" помилка)

Якщо у запиті використовується ORDER BY, поведінка NULL може тебе здивувати. За замовчуванням PostgreSQL сортує рядки з NULL-значеннями в кінці при сортуванні за зростанням і на початку при сортуванні за спаданням.

Що відбувається?

SELECT product_name, price
FROM products
ORDER BY price;

Якщо price має NULL, ці рядки будуть показані в кінці списку.

Як уникнути несподіванок?

Ти можеш явно вказати сортування для NULL за допомогою NULLS FIRST або NULLS LAST:

SELECT product_name, price
FROM products
ORDER BY price NULLS FIRST;

Помилка 7: Неправильна робота із зовнішніми ключами і NULL

NULL значення у стовпцях із зовнішніми ключами іноді можуть призводити до неочікуваної поведінки.

Що відбувається?

Якщо ти додав зовнішні ключі у таблицю і намагаєшся вставити рядок, залишивши поле зовнішнього ключа порожнім, PostgreSQL не подасть жодних ознак життя. Це пов’язано з тим, що NULL-значення не перевіряються на відповідність у пов’язаних таблицях.

Як працювати правильно?

Використовуй обмеження NOT NULL, якщо хочеш виключити можливість використання NULL у таких полях. Або просто враховуй, що NULL значення залишаються "сиротами", які не належать жодній із пов’язаних таблиць.

Більше про пов’язані таблиці та зовнішні ключі ти дізнаєшся у наступній лекції :P

1
Опитування
Умовні вирази, рівень 10, лекція 4
Недоступний
Умовні вирази
Умовні вирази
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ