Мне трудно понять, что именно EXISTS делает в следующем запросе,
select basket_a.* from basket_a where exists (select from basket_b where basket_b.fruit <> basket_a.fruit);
Почему результат вышеприведенного запроса целиком равен basket_a
? basket_a
содержит
Apple
Orange
Banana
Cucumber
и basket_b
содержит
Orange
Apple
Watermelon
Pear
Сложность проистекает из моей половины понимания аналога запроса
select basket_a.* from basket_a where exists (select from basket_b where basket_b.fruit = basket_a.fruit);
Вывод:
Apple Orange
Я предполагаю, что подзапрос оценивается, чтобы определить, возвращает ли он какие-либо строки. Так, basket_b.fruit = basket_a.fruit возвращает две строки
Apple Orange
, что превышает как минимум на одну строку . Таким образом, там, где существует , оценивается как true для этих двух строк и, поскольку он оценивается как false для двух других строк, которые не совпадают. Таким образом, соответствующие строки из корзины_a выбраны. Правильно ли я здесь с точки зрения моего понимания? Если это так, basket_b.fruit <> basket_a.fruit возвращает
Арбузная груша
И снова подзапрос возвращает две строки. К сожалению, Арбуз и Груша отсутствуют в basket_a, означает ли это, что результат where EXISTS
равен false и select * from basket_a
должен возвращать все строки? Вот как EXISTS
должен себя вести?