Não há diferença entre essas duas instruções, e o otimizador transformará o
IN
para o =
quando IN
tem apenas um elemento. No entanto, quando você tiver uma pergunta como essa, apenas execute as duas instruções, execute o plano de execução e veja as diferenças. Aqui - você não encontrará nenhum.
Após uma grande pesquisa on-line, encontrei um documento no SQL para suportar isso (suponho que se aplique a todos os DBMS):
Aqui está o plano de execução de ambas as consultas no Oracle (a maioria dos DBMS processará isso da mesma forma):
EXPLAIN PLAN FOR
select * from dim_employees t
where t.identity_number = '123456789'
Plan hash value: 2312174735
-----------------------------------------------------
| Id | Operation | Name |
-----------------------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | TABLE ACCESS BY INDEX ROWID| DIM_EMPLOYEES |
| 2 | INDEX UNIQUE SCAN | SYS_C0029838 |
-----------------------------------------------------
E para
IN()
:EXPLAIN PLAN FOR
select * from dim_employees t
where t.identity_number in('123456789');
Plan hash value: 2312174735
-----------------------------------------------------
| Id | Operation | Name |
-----------------------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | TABLE ACCESS BY INDEX ROWID| DIM_EMPLOYEES |
| 2 | INDEX UNIQUE SCAN | SYS_C0029838 |
-----------------------------------------------------
Como você pode ver, ambos são idênticos. Isso está em uma coluna indexada. O mesmo vale para uma coluna não indexada (apenas varredura completa da tabela).