Найти записи, которые присутствуют в одной таблице и отсутствуют во второй

Если ваша СУБД не умеет выполнять вложенные запросы (например, MySQL версий ниже 4.1), то вариант такой:

SELECT * FROM table1
         LEFT JOIN table2 ON table1.id=table2.id
        WHERE table2.id IS NULL;

Для СУБД, умеющих выполнять подзапросы, есть еще два варианта: с использованием конструкции NOT IN и с использованием NOT EXISTS.

SELECT * FROM table1
        WHERE id NOT IN (
            SELECT id FROM table2 
             WHERE id IS NOT NULL
        );

Вариант с NOT IN всегда быстрее варианта с NOT EXIST в случаях, когда число записей в таблице table1 больше числа записей в таблице table2.

SELECT * FROM table1
        WHERE NOT EXISTS (
             SELECT id FROM table2
              WHERE id=table1.id
        );

Если известно, что table2 имеет больше записей, чем table2, то NOT IN будет выполняться быстрее только на таблицах с небольшим числом записей (до сотен тысяч записей), а на больши́х объемах выигрывает NOT EXIST. Причем, чем больше записей в таблице table2 тем существеннее разница в скорости выполнения. Но только при наличии индекса по полю id.

Last updated