Это ваш первый запрос:
SELECT e.*
FROM employees e
WHERE EXISTS (SELECT 1
FROM employees e2
WHERE e2.department_id = 20
);
В этом запросе внутренняя WHERE
ссылается на внутреннюю таблицу.Таким образом, может произойти одно из двух:
employees
имеет сотрудника в этом отделе.В этом случае все сотрудники возвращаются во внешнем запросе. employees
не имеет сотрудников в этом отделе.В этом случае никакие сотрудники не возвращаются во внешнем запросе.
Это все или все.
Второй запрос:
SELECT e.*
FROM employees e
WHERE EXISTS (SELECT 1
FROM departments d
WHERE e.department_id = 20
);
Внутренняя ссылка на внешний запрос.Для каждой строки в employees
запрос выполняется и проверяет, возвращает ли подзапрос какие-либо строки.Если это так, то строка возвращается.
Подзапрос вернет либо все строки из departments
(если у сотрудника во внешнем запросе есть department_id = 20
), либо строк нет.Итак, это эквивалентно:
SELECT e.*
FROM employees e
WHERE e.department_id = 20;