0

El objetivo de la pregunta es tener una respuesta con fundamento a la cual poder hacer referencia para que el OP pueda tener una idea clara sobre la conveniencia de usar JOIN o WHERE a la hora de unir una o más tablas en una consulta.

Dada una estructura de tablas parecida a esta o similar (usaré sólo dos tablas por motivos de simplicidad, pero imaginemos que haya varias tablas implicadas en una posible juntura...):

SQL Fiddle

MySQL 5.6 Schema Setup:

CREATE TABLE personas
    (`id_persona` int, `nombre` varchar(150), `id_ciudad` int)
;

INSERT INTO personas
    (`id_persona`, `nombre`, `id_ciudad`)
VALUES
    (1, 'Pedro', 1),
    (2, 'Santiago', 2),
    (3, 'Juan', 3),
    (4, 'Andrés', 1)
;

CREATE TABLE ciudades
    (`id_ciudad` int, `ciudad` varchar(150), `id_provincia` int)
;

INSERT INTO ciudades
    (`id_ciudad`, `ciudad`, `id_provincia`)
VALUES
    (1, 'Galilea', 1),
    (2, 'Betsaida', 2),
    (3, 'Patmos', 3)
;

Query 1:

SELECT p.nombre, c.ciudad
FROM personas p
INNER JOIN ciudades c ON p.id_ciudad=c.id_ciudad

Results:

|   nombre |   ciudad |
|----------|----------|
|    Pedro |  Galilea |
| Santiago | Betsaida |
|     Juan |   Patmos |
|   Andrés |  Galilea |

Query 2:

SELECT p.nombre, c.ciudad
FROM personas p, ciudades c
WHERE p.id_ciudad=c.id_ciudad

Results:

|   nombre |   ciudad |
|----------|----------|
|    Pedro |  Galilea |
| Santiago | Betsaida |
|     Juan |   Patmos |
|   Andrés |  Galilea |

En la Query 1 he usado JOIN para juntar las tablas, mientras que en la Query 2 he usado WHERE. Como se puede ver, el resultado es exactamente el mismo.

Sin embargo, he leído que el uso de WHERE es menos eficaz que el uso de JOIN y que incluso el uso de WHERE es deprecated en algunas versiones recientes de bases de datos. ¿Es esto cierto? ¿Por qué motivos sería mejor usar JOIN en vez de WHERE.

Nota: A los posibles cerradores de preguntas

Planteo esta pregunta porque he respondido a varias dudas en las que el código usado para unir tablas es WHERE... yo tengo asumido que JOIN es mejor, pero nunca me he detenido a investigar el por qué. La respuesta me ayudará a confirmar si estoy o no equivocado y puede servir como referencia a quienes continúan usando el menos eficaz de los dos métodos. O... puede que sea sólo un mito y dé exactamente igual usar JOIN o usar WHERE.

Espero tener una respuesta interesante, sin tener que desprenderme mediante recompensa :) , aunque esa opción nunca se descarta.

A. Cedano
  • 86,578
  • 19
  • 122
  • 221
  • 3
    Para un `INNER JOIN` ambos son exactamente iguales en cuanto a performance, esto porque el plan de ejecución de ambos será el mismo – Lamak May 30 '17 at 19:20

2 Answers2

4

En términos generales, no hay diferencia en términos de eficiencia ya que esto ocurre durante la etapa de interpretación del comando, antes de la generación del plan de ejecución. La mayoría de los motores de bases de datos analizan durante la misma etapa las cláusulas FROM y WHERE para determinar el mejor plan de ejecución.

La preferencia de una sintaxis sobre otra tiene que ver más con utilizar el estándar definido por ANSI del lenguaje SQL y así generar consultas con código portátil, especialmente con los OUTER JOIN.

Por ejemplo en Transact-SQL de Sybase las siguientes consultas son equivalentes:

Sintaxis extendida de Sybase:

select p.nombre, c.ciudad
from persona p, ciudad c
where p.id_ciudad *= c.id_ciudad

Sintaxis ANSI SQL:

select p.nombre, c.ciudad
from
    persona p
    left join ciudad c on c.id_ciudad = p.id_ciudad

La sintaxis extendida de Sybase solo funciona en Sybase, en cambio la sintaxis ANSI SQL funciona en cualquier motor de base de datos que pueda interpretar la sintaxis ANSI SQL, esto incluye: MySQL, Microsoft SQL Server, Oracle. Por lo que es preferible utilizar la sintaxis ANSI SQL. Además, en mi gusto personal queda más claro el tipo de operación que se va a realizar.

Xint0
  • 583
  • 4
  • 12
1

En ambos casos estás haciendo un JOIN, solo que en el "Query 1" le estás diciendo explícitamente que haga un INNER JOIN mientras que en el "Query 2" estás dejando que el DBMS resuelva cuál usar.

En cuanto a la performance de la consulta, creo que lo mejor es hacer una prueba empírica... ¿Cuánto demora cada una de las consultas que pusiste en la pregunta? ¿Cómo crece el tiempo cuando crece la cantidad de registros?

Ten en cuenta que también puede haber diferencia en los resultados, cuando una de las foreign keys tiene valor NULL, por ahí cambia el comportamiento según el tipo de JOIN que hagas.

Marcos Crispino
  • 3,435
  • 12
  • 25