JOIN permite combinar varias tablas en una sola consulta SELECT según una condición específica, generalmente a través de la palabra clave ON. Una subconsulta (o consulta anidada) es una consulta que se coloca dentro de otra consulta. JOIN funciona mejor para unir tablas grandes con buenos índices, es más transparente para el optimizador y generalmente se ejecuta más rápido. Las subconsultas son útiles cuando se necesita calcular agregados o cuando hay condiciones imposibles de manejar a través de JOIN (por ejemplo, consultas correlacionadas).
Ejemplo de JOIN:
SELECT employees.name, departments.name FROM employees JOIN departments ON employees.dept_id = departments.id;
Ejemplo de subconsulta:
SELECT name FROM employees WHERE dept_id IN ( SELECT id FROM departments WHERE location = 'Moscú' );
“¿Se considera que el uso de subconsultas siempre es más lento que el uso de JOIN?”
Respuesta: ¡No, no siempre! Las subconsultas bien escritas a menudo son transformadas por el optimizador en JOIN internos. Además, a veces una subconsulta es más eficiente, por ejemplo, cuando la consulta externa trabaja con un pequeño conjunto de datos, y la subconsulta devuelve resultados agregados de antemano.
Ejemplo:
SELECT name, salary FROM employees WHERE salary > (SELECT AVG(salary) FROM employees);
Esta subconsulta se ejecutará una vez.
Historia
En un gran proyecto, se utilizaron subconsultas anidadas en lugar de JOIN para un informe. Al aumentar el volumen de datos, la consulta pasó de tardar segundos a varios minutos. Después de reemplazar las subconsultas por JOIN, el rendimiento mejoró diez veces.
Historia
En un proyecto, un analista reescribió una consulta con GROUP BY en una subconsulta, sin darse cuenta de que esto provocó la aparición de duplicados a nivel de JOIN. Esto llevó a datos incorrectos en los informes: las sumas estaban infladas debido al producto cartesiano.
Historia
El uso de una subconsulta correlacionada en el ciclo externo (para cada fila) llevó a una degradación completa del rendimiento a medida que la tabla creció. Se decidió usar JOIN con agregación: el tiempo de procesamiento de las consultas se redujo de horas a minutos.