# Поиск записей в таблице, которым нет соответствия в другой

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

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

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

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

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

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

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

[https://shpargalki.org.ua/146/poisk-zapisei-v-odnoi-tablitse-kotorym-net-sootvetstviya-v-drugoi-tablitse](https://shpargalki.org.ua/146/poisk-zapisei-v-odnoi-tablitse-kotorym-net-sootvetstviya-v-drugoi-tablitse)

\
