Эта тема довольно старая, но часто упоминается. На мой личный вкус это немного неполно, потому что есть другой способ запросить базу данных с ключевым словом EXISTS, которое я нашел быстрее, чем нет.
Так что, если вас интересуют только значения из таблицы a, вы можете использовать этот запрос:
SELECT a.*
FROM a
WHERE EXISTS (
SELECT *
FROM b
WHERE b.col = a.col
)
Разница может быть огромной, если col не проиндексирован, потому что БД не должен находить все записи в b, которые имеют одинаковое значение в col, он должен найти только самую первую. Если на b.col нет индекса и много записей в b, может быть следствием сканирование таблицы. Для IN или JOIN это будет полное сканирование таблицы, для EXISTS это будет только частичное сканирование таблицы (до тех пор, пока не будет найдена первая соответствующая запись).
Если в b много записей с одинаковым значением col, вы также потратите много памяти на чтение всех этих записей во временном пространстве, просто чтобы убедиться, что ваше условие удовлетворено. С существующим этого обычно можно избежать.
Я часто находил EXISTS быстрее, чем IN, даже если есть индекс. Это зависит от системы баз данных (оптимизатора), данных и, что не менее важно, от типа используемого индекса.