CREATE TABLE users (user_id INT PRIMARY KEY);
CREATE TABLE orders (order_id INT PRIMARY KEY, buyer_id INT);
INSERT INTO users VALUES (1), (2), (3);
INSERT INTO orders VALUES (101, 1);
SELECT user_id
FROM users
WHERE user_id IN (
SELECT user_id FROM orders
);
Что вернёт запрос? Ошибку, только
1 или всех пользователей?👇 Разбор
Вернёт 1, 2, 3.
В
orders нет user_id, поэтому SQL находит колонку во внешнем запросе. Подзапрос становится коррелированным: для каждого пользователя он возвращает его собственный ID по одному разу на каждую строку orders.Пока в
orders есть строки, условие истинно для каждого пользователя. Если таблица пуста, запрос не вернёт ничего.Правильный вариант:
SELECT u.user_id
FROM users AS u
WHERE u.user_id IN (
SELECT o.buyer_id
FROM orders AS o
);
💡 Указывайте алиасы таблиц:
o.user_id вызвал бы ошибку и сразу выдал опечатку.#SQL