Me cuesta entender el origen de la duda, porque pese a lo que dice Perr0, se trata de cosas conceptualmente diferentes, y además no existe una real dicotomía entre ambas porque
una está contenida en la otra, en determinados contextos.
Una
subconsulta es en realidad una consulta que genera una tabla derivada (tabla resultado, en memoria o en buffer), la cual puede ser usada en diferentes contextos:
- Usarla para obtener un conjunto referido a un único campo o a varios para el WHERE.
- Para obtener un único valor dentro de las columnas del SELECT.
- Usarla como parte de un UNION.
- La puedes usar como tabla del FROM.
Como se pude apreciar, su uso no está restringido a un mismo caso, a diferencia del INNER JOIN.
El INNER JOIN es
exclusivamente una operación algebraica entre tablas. No existe en otro contexto y
sólo se usa para realizar un matching entre tablas basado en dominios.
Lo que hace el INNER JOIN es realizar una comparación rápida entre valores entre dos tablas (más de dos tablas implica también más de un INNER JOIN)
a medida que las tablas van siendo recuperadas, tal que sólo se toman en cuenta aquellos registros de ambas tablas que cumplan con la relación indicada, sin importar ningún otro valor que exista en los otros campos.
La subconsulta, por su lado, es en realidad una
consulta, y como tal debe producir una tabla resultado conforme las condiciones puestas. Pero la subconsulta como tabla derivada
debe haber sido completamente ejecutada para poder ser usada en su contexto. Sin eso no opera, y dependerá de la optimización lograda en ella la utilidad de la misma; además, como toda consulta, está afectada por índices, condiciones de WHERE etc. Pero también como toda consulta,
puede a su vez contener algún INNER JOIN... Entonces no se trata de operaciones comparables, son cosas complementarias.
¿Se entiende?
Simplificando:
No se trata de cosas que se puedan oponer o comparar. Se
complementan y una está incluida en la otra.
La mayor o menor optimización lograda en una consulta
no depende de si se usa una subconsulta o un INNER JOIN porque no son cosas
excluyentes. En todo caso depende del contexto del uso: Puede ser muy eficiente usar una subconsulta para obtener una tabla derivada, que se usa en la consulta principal como tabla de un INNER JOIN..., por ejemplo, pero sólo será eficiente si y sólo si esa subconsulta implica una operación de
alta selectividad (un SELECT que devuelva muy pocos registros en una tabla de muchos registros), sino le estás agregando overhead a la operación completa.
Espero que todo esto se haya entendido...