Выборка только ненулевых значений в MySQL: без PHP

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы выбрать записи, в которых не встречаются значения NULL, используйте в соответствии с WHERE условие IS NOT NULL:

SQL
Скопировать код
SELECT * FROM your_table WHERE your_column IS NOT NULL;

Этот запрос вернёт только те строки из таблицы your_table, в которых поле your_column содержит данные, исключая строки с NULL.

Кинга Идем в IT: пошаговый план для смены профессии

Нормализация базы данных

Улучшение структуры базы данных помогает уменьшить необходимость фильтрации NULL значений. Адекватная нормализация предусматривает установление ограничений NOT NULL для полей, которые не предполагают наличие NULL, что упрощает формирование запросов.

Оператор безопасного сравнения с NULL

Если NULL используется как уникальное значимое значение, предпочтительнее использовать оператор безопасного сравнения с NULL <=>:

SQL
Скопировать код
SELECT * FROM your_table WHERE your_column <=> 'value'; -- Даже NULL утверждает: "Я уникален!"

Этот оператор позволяет сравнивать любые значения, включая NULL.

Выборка не NULL значений из нескольких колонок

Для выбора данных без NULL из различных колонок можно объединить UNION ALL и подзапросы:

SQL
Скопировать код
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 в сочетании с псевдонимами может быть весьма эффективным:

SQL
Скопировать код
SELECT your_column, COUNT(*) AS total FROM your_table GROUP BY your_column HAVING your_column IS NOT NULL;
-- Псевдонимы – это серьёзно!

Использование перекрёстных соединений (cross join)

В сложных запросах перекрестное соединение может быть полезно для поиска строк, где несколько колонок одновременно не содержат NULL:

SQL
Скопировать код
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!

Визуализация

Представьте, что вы собираете фрукты в саду 🌳:

Markdown
Скопировать код
🌳 [🍎, null, 🍏, null, 🍎, 🍏]

С помощью SELECT вы выбираете только зрелые плоды, не обращая внимания на nulls:

SQL
Скопировать код
SELECT fruit FROM orchard WHERE fruit IS NOT NULL;

Ваша корзина после сбора:

Markdown
Скопировать код
[🍎, 🍏, 🍎, 🍏]

Мы оставили пустоту на подле, заполнив корзину исключительно спелыми фруктами! 🍎🍏

Взаимодействие операторов сравнения с NULL

Очень важно понимать, что операторы сравнения, такие как = и <>, ведут себя особенно по отношению к NULL. Выражение 'value' <> NULL не равно ни true, ни false, а имеет статус UNKNOWN, что часто приводит к непредсказуемым результатам при выборке.

Получение последних не NULL значений

Когда требуется найти последнее не NULL значение, лучше использовать ORDER BY в комбинации с DESC и LIMIT:

SQL
Скопировать код
SELECT * FROM your_table WHERE your_column IS NOT NULL ORDER BY ID DESC LIMIT 1;
-- Самый свежий не NULL экземпляр в районе!

Таким образом, вы получите самую последнюю запись без NULL.

Обращение со значениями по умолчанию

Стоит быть внимательным к колонкам со значениями по умолчанию, так как они могут требовать особого подхода:

SQL
Скопировать код
SELECT * FROM your_table WHERE your_column <> '' AND your_column IS NOT NULL;
-- '' и NULL – это не одно и то же!

Такой запрос позволит отфильтровать строки с пустой строкой, которые могут быть установлены по умолчанию вместо NULL.

Использование DISTINCT

Для получения уникальных не NULL записей, используйте SELECT DISTINCT:

SQL
Скопировать код
SELECT DISTINCT your_column FROM your_table WHERE your_column IS NOT NULL;
-- Только уникальное, только без NULL!

Такой запрос вернёт только уникальные записи, исключая NULL.

Оценка структуры базы данных

Частая необходимость исключать NULL значения может быть индикатором того, что пора пересмотреть структуру базы данных. Возможно, стоит серьезно подумать о нормализации схемы базы данных для устранения основных причин этой проблемы.

Полезные материалы

  1. MySQL :: MySQL 8.0 Руководство по справочнику :: 13.2.13 Выборка данных (SELECT Statement)официальное руководство по использованию SELECT в MySQL.
  2. SQL join: выбор последних записей в отношениях один-ко-многим – Stack Overflow — обсуждение на Stack Overflow, посвящённое выборке не NULL значений.
  3. SQL NOT NULL Ограничение — руководство от w3schools о использовании ограничения NULL в SQL.
  4. SQL IS NULL и IS NOT NULL – GeeksforGeeks — статья с подробным обсуждением вопроса управления значениями NULL и NOT NULL в SQL.