No hay diferencia entre esas dos declaraciones, y el optimizador transformará el IN
al =
cuando IN
tiene solo un elemento.
Aunque cuando tenga una pregunta como esta, simplemente ejecute ambas declaraciones, ejecute su plan de ejecución y vea las diferencias. Aquí, no encontrarás ninguno.
Después de una gran búsqueda en línea, encontré un documento en SQL para admitir esto (supongo que se aplica a todos los DBMS):
Este es el plan de ejecución de ambas consultas en Oracle (la mayoría de los DBMS procesarán esto de la misma manera):
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 |
-----------------------------------------------------
Y 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 puedes ver, ambos son idénticos. Esto está en una columna indexada. Lo mismo ocurre con una columna no indexada (solo exploración completa de la tabla).