select * from `replays`
where id in (
select replay_id from `players`
where `battletag_name` = 'test')
order by `id` asc
limit 100;
select * from `replays`
where exists (
select * from `players`
where `replays`.`id` = `players`.`replay_id`
and `battletag_name` = 'test')
order by `id` asc
limit 100;
EXISTS took 70 seconds. IN took 0.4 second.
Aside from IN being faster than EXISTS in most cases, readability of IN is a big win. And also with IN, queries can be made modular, e.g.,
with test_players as
(
select replay_id
from players
where battletag_name = 'test'
)
select *
from replays
where id in (select replay_id from test_players)
Cannot do the above when using EXISTS.