Для СУБД, умеющих выполнять подзапросы, есть еще два варианта: с использованием конструкции NOT IN и с использованием NOT EXISTS.
SELECT*FROM table1WHERE id NOTIN (SELECT id FROM table2 WHERE id IS NOT NULL );
Вариант с NOT IN всегда быстрее варианта с NOT EXIST в случаях, когда число записей в таблице table1 больше числа записей в таблице table2.
SELECT*FROM table1WHERENOTEXISTS (SELECT id FROM table2WHERE id=table1.id );
Если известно, что table1 имеет больше записей, чем table2, то NOT IN будет выполняться быстрее только на таблицах с небольшим числом записей (до сотен тысяч записей), а на больши́х объемахвыигрываетNOT EXIST. Причем, чем больше записей в таблице table2 тем существеннее разница в скорости выполнения. Но только при наличии индекса по полю id.