Этот запрос выглядит логично, но опасен:
WHERE user_id NOT IN (SELECT id FROM users);
Если подзапрос вернёт хотя бы один
NULL, условие станет UNKNOWN, и не вернётся ни одной строки.Правильнее и безопаснее паттерн NOT EXISTS:
WHERE NOT EXISTS (SELECT 1 FROM users u WHERE u.id = orders.user_id);
Он корректно работает при
NULL, не ломает логику и читается однозначно.Хотите повторить? Проверьте разницу сами:
CREATE TABLE users(id int);
INSERT INTO users VALUES (1), (2), (NULL);
Теперь запустите:
SELECT 1 AS test WHERE 3 NOT IN (SELECT id FROM users);
Результат будет пустым.
🔥 А если переписать через
NOT EXISTS, логика вернётся в норму.➡️ SQL Ready | #совет
