drop table if exists x1; drop table if exists x2; set @tmp_subselect_nulls=@@optimizer_switch; set optimizer_switch='semijoin=off'; create table x1(k int primary key, d1 int, d2 int); create table x2(k int primary key, d1 int, d2 int); insert into x1 values (10, 10, 10), (20, 20, 20), (21, 20, null), (30, null, 30), (40, 40, 40); insert into x2 values (10, 10, 10), (20, 20, 20), (21, 20, null), (30, null, 30); select * from x1 where (d1, d2) in (select d1, d2 from x2); k d1 d2 10 10 10 20 20 20 select * from x1 where (d1, d2) in (select d1, d2 from x2) is true; k d1 d2 10 10 10 20 20 20 select * from x1 where (d1, d2) in (select d1, d2 from x2) is false; k d1 d2 40 40 40 select * from x1 where (d1, d2) in (select d1, d2 from x2) is unknown; k d1 d2 21 20 NULL 30 NULL 30 select * from x1 where d1 in (select d1 from x2 where x1.d2=x2.d2); k d1 d2 10 10 10 20 20 20 select * from x1 where d1 in (select d1 from x2 where x1.d2=x2.d2) is true; k d1 d2 10 10 10 20 20 20 select * from x1 where d1 in (select d1 from x2 where x1.d2=x2.d2) is false; k d1 d2 21 20 NULL 40 40 40 select * from x1 where d1 in (select d1 from x2 where x1.d2=x2.d2) is unknown; k d1 d2 30 NULL 30 select * from x1 where 1 in (select 1 from x2 where x1.d1=x2.d1 and x1.d2=x2.d2); k d1 d2 10 10 10 20 20 20 select * from x1 where 1 in (select 1 from x2 where x1.d1=x2.d1 and x1.d2=x2.d2) is true; k d1 d2 10 10 10 20 20 20 select * from x1 where 1 in (select 1 from x2 where x1.d1=x2.d1 and x1.d2=x2.d2) is false; k d1 d2 21 20 NULL 30 NULL 30 40 40 40 select * from x1 where 1 in (select 1 from x2 where x1.d1=x2.d1 and x1.d2=x2.d2) is unknown; k d1 d2 select * from x1 where exists (select * from x2 where x1.d1=x2.d1 and x1.d2=x2.d2); k d1 d2 10 10 10 20 20 20 set optimizer_switch= @tmp_subselect_nulls; drop table x1; drop table x2; select (select 1, 2) in (select 3, 4); (select 1, 2) in (select 3, 4) 0 select (select NULL, NULL) in (select 3, 4); (select NULL, NULL) in (select 3, 4) NULL