MySQL NOT IN versus LEFT JOIN

Author: Osiris Alejandro Gomez <osiux@osiux.com.ar>
Copyright: CreativeCommons CC-BY-SA [1]
Date: 2010-05-10 19:40

Detailed Example

Create tables

create table a (id int null, name varchar(10) null);
create table b (id int null, name varchar(10) null);

Insert Values

insert into a (id,name) values (1,'a');
insert into a (id,name) values (2,'b');
insert into a (id,name) values (3,'c');
insert into a (id,name) values (4,'d');
insert into a (id,name) values (5,'e');
insert into a (id,name) values (6,'e');
insert into a (id,name) values (7,'f');
insert into a (id,name) values (8,'g');
insert into a (id,name) values (9,'h');

insert into b (id,name) values (6,'e');
insert into b (id,name) values (7,'f');
insert into b (id,name) values (8,'g');
insert into b (id,name) values (9,'h');

View table a

select a.id, a.name from a
+------+------+
| id   | name |
+------+------+
|    1 | a    |
|    2 | b    |
|    3 | c    |
|    4 | d    |
|    5 | e    |
|    6 | e    |
|    7 | f    |
|    8 | g    |
|    9 | h    |
+------+------+

View table b

select b.id, b.name from b

+------+------+
| id   | name |
+------+------+
|    6 | e    |
|    7 | f    |
|    8 | g    |
|    9 | h    |
+------+------+

NOT IN

select a.id, a.name from a where a.id not in (select id from b)

+------+------+
| id   | name |
+------+------+
|    1 | a    |
|    2 | b    |
|    3 | c    |
|    4 | d    |
|    5 | e    |
+------+------+
5 rows in set (0.01 sec)

LEFT JOIN

select a.id, a.name from a left join b on a.id=b.id where b.id is null;

+------+------+
| id   | name |
+------+------+
|    1 | a    |
|    2 | b    |
|    3 | c    |
|    4 | d    |
|    5 | e    |
+------+------+
5 rows in set (0.00 sec)

[1]http://creativecommons.org/licenses/by-sa/2.5/ar/