Sintaxis JOIN

Resumen de las diferentes sintaxis para hacer joins.

Sintaxis FROM-WHERE:

-- Producto vectorial o cross join
SELECT * FROM Profesor, Departamento;

-- Equivalente a inner join
SELECT * 
  FROM Profesor p, Departamento d 
  WHERE p.CodigoDepartamento = d.Codigo;

Sintaxis JOIN-ON:

Sirve para cualquier tipo de join (inner, outer, left, right...)

SELECT * 
  FROM Profesor p JOIN Departamento d
  ON p.CodigoDepartamento = d.Codigo;

También se pueden mezclar las dos sintaxis anteriores en un JOIN-WHERE:

SELECT * 
  FROM Profesor p JOIN Departamento d
  WHERE p.CodigoDepartamento = d.Codigo;

Sintaxis JOIN-USING:

Sólo se puede hacer cuando las columnas en ambas tablas tienen el mismo nombre (en la DB de Departamentos no se puede hacer, pero en Sakila sí):

SELECT * 
  FROM film JOIN film_actor
  USING (film_id);

SELECT * 
  FROM film f JOIN film_actor fa
  ON f.film_if = fa.film_id;

SELECT * 
  FROM film f JOIN film_actor fa
  WHERE f.film_if = fa.film_id;

Joins de múltiples tablas

Es recomendable esta sintaxis para hacer joins entre muchas tablas:

SELECT [...]
FROM t1 JOIN t2 ON [...]
        JOIN t3 ON [...]
        JOIN t4 ON [...]
WHERE [...];

SELECT [...]
FROM t1 JOIN t2 USING (...)
        JOIN t3 USING (...)
        JOIN t4 USING (...)
WHERE [...];

De este modo en el WHERE quedan únicamente las condiciones finales que queramos aplicar, sin las condiciones para hacer los joins, que quedan dentro de los ON ....

Por ejemplo:

-- Recomendable
SELECT * 
  FROM Profesor p JOIN Departamento d ON p.CodigoDepartamento = d.Codigo 
                  JOIN Ordenador o    ON o.CodigoDepartamento = d.Codigo
  WHERE d.codigo = 'INF';

-- Esto mezcla las condiciones de join y resto de condiciones deseadas
SELECT * 
  FROM Profesor p, Departamento d, Ordenador o
  WHERE p.CodigoDepartamento = d.Codigo 
    AND o.CodigoDepartamento = d.Codigo 
    AND d.codigo = 'INF';

Last updated