Использование в vs существует на MySQL - PullRequest
0 голосов
/ 16 мая 2018

Я знаю, что есть очень похожие вопросы по этой теме. Дело в том, что каждый пример, который я видел, указывает на то, что EXISTS и IN одинаковы и возвращают одинаковые результаты. У меня есть пример использования обоих, но я получаю разные результаты. Возможно я делаю это неправильно. Я новичок в SQl в целом. Вот мои примеры кода с использованием MySQL.

Первый запрос с использованием IN

 select lastname, firstname
 from employees
 where officecode in (select officecode from offices where country = 'USA');

Результат:

enter image description here

Второй запрос с использованием EXISTS:

select lastname, firstname
from employees
 where exists (select officecode from offices where country = 'USA');

Результат:

enter image description here

Очевидно, что запросы не эквивалентны, так как я получаю разные результаты. Я использую IN и EXISTS неправильно?

Ответы [ 4 ]

0 голосов
/ 16 мая 2018

Ваши два запроса очень разные.Первый запрос:

select e.lastname, e.firstname
from employees e
where e.officecode in (select o.officecode from offices o where o.country = 'USA');

(обратите внимание, что я уточнил все имена столбцов.)

Это позволяет сотрудникам, где соответствующий офис находится в США.

Этозапрос совершенно другой:

select e.lastname, e.firstname
from employees e
where exists (select o.officecode from offices o where o.country = 'USA');

Это запрос типа "все или ничего".Возвращает всех сотрудников, если любой офис находится в США.В противном случае он ничего не возвращает.

Чтобы быть эквивалентным первому запросу, вам необходимо условие корреляция .Это связывает внутренний запрос с внешним запросом:

select e.lastname, e.firstname
from employees e
where exists (select 1   
              from offices o
              where  o.officecode = e.officecode and o.country = 'USA'
             );

С этим изменением два запроса должны давать идентичные результаты.

0 голосов
/ 16 мая 2018

Чтобы они могли возвращать одинаковые результаты, вам нужно выражение where для вашего существующего оператора, чтобы связать его с вашим внешним запросом ... from employees e where exists (select o.officecode from offices o where o.country = 'USA' and o.officecode = e.officecode). Возвращение каждого также отличается. EXISTS возвращает BOOLEAN.

0 голосов
/ 16 мая 2018

Левое соединение и проверка нуля быстрее.

Select * from t1 
Left join t2 on(t1.=t2)
Where t2.id is null
0 голосов
/ 16 мая 2018

Exists проверяет условие на истинность.

Таким образом, во втором запросе он будет запускать первую часть запроса всякий раз, когда во внутреннем запросе выполняется условие exists. Exists проверит, возвращает ли внутренний запрос одну или несколько строк. В вашем случае это будет истина и, следовательно, внешний запрос будет выглядеть как select lastname, firstname from employees;

Но в первом случае он проверит условие, при котором все officecode найдены в подзапросе и будет соответствовать officecode во внешнем запросе, и вернет те, которые имеют страну USA

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...