в чем разница между «не в» и «не существует»?

#database #oracle #url-rewriting #cost-based-optimizer

#База данных #Oracle #переписывание URL #оптимизатор на основе затрат

Вопрос:

sql1: выберите * из t1, где не существует (выберите a из t2, где t2.a = t1.a);

sql2: выберите * из t1, где t1.a не в (выберите a из t2, где t2.a не равно нулю);

Я думаю, что sql1 такой же, как sql2, они перепишут на anti join, верно?

Комментарии:

1. mysql или oracle? Пожалуйста, отметьте только одну базу данных, которую вы используете.

2. Я думаю, что и mysql, и oracle имеют одинаковое действие.

Ответ №1:

Два запроса дадут разные результаты, если у вас есть NULL значения.

Пример в Oracle:

 create table t1 (a integer);

insert into t1 (a) values (1);
insert into t1 (a) values (2);
insert into t1 (a) values (null);
commit;

create table t2 (a integer);

insert into t2 (a) values (1);
insert into t2 (a) values (3);
insert into t2 (a) values (null);
commit;

set null "{NULL}"

prompt First Query...

select * from t1 where not exists (select a from t2 where t2.a = t1.a);

prompt Second Query...

select * from t1 where t1.a not in (select a from t2 where t2.a is not null);
  

Вывод:

 First Query...

         A
----------
         2
{NULL}    

2 rows selected.

Second Query...

         A
----------
         2

1 row selected.