Фильтрация и трёхзначная логика
Логические операторы
| Оператор | Смысл |
|---|---|
AND | Истина, только если оба операнда истинны |
OR | Истина, если хотя бы один операнд истинен |
NOT | Инверсия |
Приоритет: NOT → AND → OR.
Без скобок выражение a OR b AND c читается как a OR (b AND c). Для (a OR b) AND c скобки обязательны.
SELECT last_name, department, salary
FROM employees
WHERE (department = 'Sales' OR department = 'Marketing')
AND salary >= 80000;
Сравнение с NULL
В SQL три значения предиката: TRUE, FALSE, UNKNOWN (когда участвует NULL).
| Выражение | Результат |
|---|---|
NULL = NULL | UNKNOWN |
NULL <> NULL | UNKNOWN |
NULL > 5 | UNKNOWN |
5 = NULL | UNKNOWN |
Строка с UNKNOWN в WHERE не попадает в результат (как при FALSE).
Правильная проверка:
SELECT name FROM employees WHERE manager_id IS NULL;
SELECT name FROM employees WHERE manager_id IS NOT NULL;
Ошибка — сравнение с NULL через =:
-- неверно: всегда пустой результат
SELECT name FROM employees WHERE manager_id = NULL;
-- верно
SELECT name FROM employees WHERE manager_id IS NULL;
UNKNOWN в AND и OR
| Выражение | Результат |
|---|---|
TRUE AND UNKNOWN | UNKNOWN |
FALSE AND UNKNOWN | FALSE |
TRUE OR UNKNOWN | TRUE |
FALSE OR UNKNOWN | UNKNOWN |
NOT UNKNOWN | UNKNOWN |
NOT IN и NULL
value NOT IN (1, 2, NULL) даёт UNKNOWN для любого value, потому что сравнение с NULL не даёт TRUE. Итог — пустая выборка.
Используйте NOT EXISTS или исключите NULL из подзапроса (см. Подзапросы, EXISTS и IN).
PostgreSQL: IS DISTINCT FROM
Обычное сравнение не различает «оба NULL» и «оба не NULL». Оператор IS DISTINCT FROM трактует два NULL как равные:
SELECT a, b
FROM t
WHERE a IS DISTINCT FROM b; -- строки, где значения различаются (включая NULL)
SELECT a, b
FROM t
WHERE a IS NOT DISTINCT FROM b; -- эквивалент «равно с учётом NULL»
Практические рекомендации
- При смешении
ANDиORвсегда ставьте скобки, даже если приоритет «очевиден». - Для опциональных полей явно ветвите:
(col = :val OR (:val IS NULL AND col IS NULL))илиCOALESCE. - Избегайте
NOT INс подзапросами без гарантииNOT NULLв сравниваемом столбце. - Для поиска по шаблону:
LIKE 'префикс%'может использовать индекс;LIKE '%суффикс'— обычно нет (безpg_trgm).
Пример: сотрудники без отдела или с зарплатой выше порога
CREATE TABLE employees (
emp_id SERIAL PRIMARY KEY,
last_name TEXT NOT NULL,
department TEXT,
salary NUMERIC(10, 2)
);
SELECT last_name, department, salary
FROM employees
WHERE department IS NULL
OR salary > 100000;
Контрольные вопросы
- Почему
WHERE bonus = NULLне находит строки с пустым бонусом? - Чем
FALSE AND UNKNOWNотличается отTRUE AND UNKNOWN? - Когда
NOT INбезопаснее заменить наNOT EXISTS? - Зачем нужен
IS DISTINCT FROM?
См. также
См. также
Другие статьи этого же раздела в боковом меню (как на странице «О разделе»). Вот SQL как раз обеспечивает такую связь и это главное отличие реляционных БД - реляции (relations), что означает связи. Знакомимся с языком - ставим программы, запускаем, выполняем первые запросы. От файлового хранения к реляционной и современной мультимодельной СУБД — термины, причины появления SQL и базовая классификация систем. Домены, атрибуты, кортежи и отношения — свойства реляционных таблиц и ограничения целостности при проектировании схемы. Функциональные зависимости, нормальные формы 1НФ–3НФ, аномалии обновления и осознанная денормализация при проектировании схемы. Метаданные СУБД через information_schema и pg_catalog — запросы к структуре таблиц, ключей и индексов в PostgreSQL. Логическое и физическое резервное копирование, pg_dump, pg_restore, WAL и восстановление на точку во времени (PITR). Логический порядок выполнения SELECT, проекция, WHERE, DISTINCT, ORDER BY и правила читаемого форматирования запросов. Скалярные и коррелированные подзапросы, EXISTS против IN, особенности NULL и выбор между подзапросом и JOIN. MVCC, уровни блокировок таблиц, FOR UPDATE, SKIP LOCKED, взаимоблокировки и диагностика через pg_locks. Учебная схема интернет-магазина для PostgreSQL — DDL и примеры запросов по темам курса SQL. Принципы работы SQL-движка - подключение к СУБД, разбор и выполнение запроса и возврат результата клиенту.SQL - язык структурированных запросов
Первые шаги с SQL
Эволюция систем хранения данных
Реляционная модель данных
Нормализация данных
Словарь данных и системные каталоги
Резервное копирование и восстановление PostgreSQL
Оператор SELECT — синтаксис и стиль
Подзапросы, EXISTS и IN
Блокировки и конкурентный доступ в PostgreSQL
Практикум shop_data
Принципы работы SQL-движка