Выборка только ненулевых значений в MySQL: без PHP
Быстрый ответ
Чтобы выбрать записи, в которых не встречаются значения NULL
, используйте в соответствии с WHERE
условие IS NOT NULL
:
SELECT * FROM your_table WHERE your_column IS NOT NULL;
Этот запрос вернёт только те строки из таблицы your_table
, в которых поле your_column
содержит данные, исключая строки с NULL
.
Нормализация базы данных
Улучшение структуры базы данных помогает уменьшить необходимость фильтрации NULL
значений. Адекватная нормализация предусматривает установление ограничений NOT NULL для полей, которые не предполагают наличие NULL
, что упрощает формирование запросов.
Оператор безопасного сравнения с NULL
Если NULL
используется как уникальное значимое значение, предпочтительнее использовать оператор безопасного сравнения с NULL <=>
:
SELECT * FROM your_table WHERE your_column <=> 'value'; -- Даже NULL утверждает: "Я уникален!"
Этот оператор позволяет сравнивать любые значения, включая NULL
.
Выборка не NULL значений из нескольких колонок
Для выбора данных без NULL
из различных колонок можно объединить UNION ALL
и подзапросы:
SELECT column1 AS result FROM your_table WHERE column1 IS NOT NULL
UNION ALL
SELECT column2 FROM your_table WHERE column2 IS NOT NULL;
-- Объединение – моё всё!
Обратите внимание, что использование UNION ALL
может потребовать повторного прохода по таблице, что осложняет работу с большими объемами данных.
Использование псевдонимов с HAVING
Применение клаузы HAVING
в сочетании с псевдонимами может быть весьма эффективным:
SELECT your_column, COUNT(*) AS total FROM your_table GROUP BY your_column HAVING your_column IS NOT NULL;
-- Псевдонимы – это серьёзно!
Использование перекрёстных соединений (cross join)
В сложных запросах перекрестное соединение может быть полезно для поиска строк, где несколько колонок одновременно не содержат NULL
:
SELECT t1.column1, t2.column2 FROM
(SELECT column1 FROM your_table WHERE column1 IS NOT NULL) t1
CROSS JOIN
(SELECT column2 FROM your_table WHERE column2 IS NOT NULL) t2;
-- Nulls? Нам не нужны страшные nulls!
Визуализация
Представьте, что вы собираете фрукты в саду 🌳:
🌳 [🍎, null, 🍏, null, 🍎, 🍏]
С помощью SELECT
вы выбираете только зрелые плоды, не обращая внимания на nulls:
SELECT fruit FROM orchard WHERE fruit IS NOT NULL;
Ваша корзина после сбора:
[🍎, 🍏, 🍎, 🍏]
Мы оставили пустоту на подле, заполнив корзину исключительно спелыми фруктами! 🍎🍏
Взаимодействие операторов сравнения с NULL
Очень важно понимать, что операторы сравнения, такие как =
и <>
, ведут себя особенно по отношению к NULL. Выражение 'value' <> NULL не равно ни true
, ни false
, а имеет статус UNKNOWN, что часто приводит к непредсказуемым результатам при выборке.
Получение последних не NULL значений
Когда требуется найти последнее не NULL значение, лучше использовать ORDER BY
в комбинации с DESC
и LIMIT
:
SELECT * FROM your_table WHERE your_column IS NOT NULL ORDER BY ID DESC LIMIT 1;
-- Самый свежий не NULL экземпляр в районе!
Таким образом, вы получите самую последнюю запись без NULL.
Обращение со значениями по умолчанию
Стоит быть внимательным к колонкам со значениями по умолчанию, так как они могут требовать особого подхода:
SELECT * FROM your_table WHERE your_column <> '' AND your_column IS NOT NULL;
-- '' и NULL – это не одно и то же!
Такой запрос позволит отфильтровать строки с пустой строкой, которые могут быть установлены по умолчанию вместо NULL
.
Использование DISTINCT
Для получения уникальных не NULL записей, используйте SELECT DISTINCT
:
SELECT DISTINCT your_column FROM your_table WHERE your_column IS NOT NULL;
-- Только уникальное, только без NULL!
Такой запрос вернёт только уникальные записи, исключая NULL.
Оценка структуры базы данных
Частая необходимость исключать NULL
значения может быть индикатором того, что пора пересмотреть структуру базы данных. Возможно, стоит серьезно подумать о нормализации схемы базы данных для устранения основных причин этой проблемы.
Полезные материалы
- MySQL :: MySQL 8.0 Руководство по справочнику :: 13.2.13 Выборка данных (SELECT Statement) — официальное руководство по использованию SELECT в MySQL.
- SQL join: выбор последних записей в отношениях один-ко-многим – Stack Overflow — обсуждение на Stack Overflow, посвящённое выборке не NULL значений.
- SQL NOT NULL Ограничение — руководство от w3schools о использовании ограничения NULL в SQL.
- SQL IS NULL и IS NOT NULL – GeeksforGeeks — статья с подробным обсуждением вопроса управления значениями NULL и NOT NULL в SQL.