Volver a la lista de artículos Artículos
Lectura de 7 minutos

¿Cuál es la diferencia entre tener varias tablas en FROM y usar JOIN?

¿Cuál es su enfoque para unir tablas en SQL? En este artículo, discutimos dos enfoques y explicamos por qué muchos desarrolladores de SQL tienen una clara preferencia por JOIN.

¿Prefiere enumerar varias tablas en FROM y utilizar WHERE para establecer las condiciones de unión? ¿O utiliza la palabra clave JOIN? SQL admite ambas, pero hay diferencias significativas entre ellas. Veamos cada una en detalle y luego discutamos por qué se prefiere JOIN.

Unir tablas enumerándolas en FROM

Supongamos que tenemos una juguetería y dos tablas de la base de datos que queremos unir toys y sales.

Juguetes

idnamebrandprice
1BumblebeeTransformers14.99
2Optimus PrimeTransformers19.99
3Lightning McQueenDisney Cars23.97
4RamoneDisney Cars20.99
5Wonder WomanBarbie39.99
6Princess LeiaBarbie99.99
7Wizard of Oz: GlindaBarbie43.95

Ventas

idtoy_idemployee_iddatequantity
1532020-07-011
2112020-07-011
3312020-07-021
4632020-07-031
5232020-07-031

Podemos simplemente listar ambas tablas en la cláusula FROM y establecer en la cláusula WHERE que el id de la tabla toy debe coincidir con el toy_id de la tabla sales tabla:

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.date
FROM toys t, sales s
WHERE t.id = s.toy_id;

Obtendremos el siguiente resultado:

idnamebrandpricequantitydate
1BumblebeeTransformers14.9912020-07-01
2Optimus PrimeTransformers19.9912020-07-03
3Lightning McQueenDisney Cars23.9712020-07-02
5Wonder WomanBarbie39.9912020-07-01
6Princess LeiaBarbie99.9912020-07-03

Todo ha funcionado como se esperaba: hemos unido dos tablas y hemos obtenido los resultados que esperábamos.

Esta es definitivamente una solución que funciona para unir tablas en SQL. Sin embargo, utiliza una sintaxis antigua que era común antes de que el estándar SQL-92 introdujera la palabra clave JOIN. Veamos ahora como podemos obtener el mismo resultado usando un enfoque moderno para unir tablas.

Unir tablas usando la palabra clave JOIN

Podemos utilizar la siguiente consulta con la palabra clave JOIN para hacer lo mismo:

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.date
FROM toys t
JOIN sales s
ON t.id = s.toy_id;

Esta sintaxis se introdujo en el estándar SQL-92. En este caso, sólo tenemos una tabla en la cláusula FROM; la tabla que queremos unir aparece en la cláusula JOIN. Luego, tenemos la palabra clave ON para especificar las columnas que se utilizarán para unir estas tablas.

El resultado de esta consulta es el mismo que el anterior. Sin embargo, este enfoque tiene una serie de ventajas que lo hacen más frecuente entre los profesionales de SQL. Si prefieres utilizar la sintaxis antigua para unir tablas, echa un vistazo a los siguientes argumentos. Puede que le hagan cambiar de opinión.

¿Por qué utilizar la nueva sintaxis para las uniones SQL?

Empecemos por aclarar que , en cuanto al rendimiento, no hay ninguna diferencia entre las dos sintaxis. El uso de la palabra clave JOIN no sólo es un estándar formal en estos días, sino que también es una práctica común entre los usuarios de SQL. Entonces, ¿cuáles son los beneficios de usar la cláusula JOIN?

Las condiciones de unión están separadas de las condiciones de filtrado

Cuando se utiliza la sintaxis antigua, las condiciones de unión y las de filtrado se agrupan físicamente en la cláusula WHERE. Esto puede causar cierta confusión.

Por ejemplo, digamos que queremos ver sólo las ventas del 3 de julio. Tendremos que añadir una condición más a la cláusula WHERE:

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.date
FROM toys t, sales s
WHERE t.id = s.toy_id AND s.date = '2020-07-03';

Ahora tenemos dos condiciones en WHERE, pero sólo una de ellas es una verdadera condición de filtrado. La otra sólo se utiliza para especificar las columnas en las que se van a unir las tablas.

Con la palabra clave JOIN, las condiciones de unión se separan de las condiciones de filtrado:

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.date
FROM toys t
JOIN sales s
ON t.id = s.toy_id
WHERE s.date = '2020-07-03';

Aquí, especificamos la condición de unión en ON y utilizamos WHERE para filtrar los resultados.

Ambas consultas darán el mismo resultado, pero la nueva sintaxis deja claro dónde se unen las tablas y dónde se filtran los resultados.

Es más fácil unir varias tablas

A menudo, necesitarás unir varias tablas con SQL. Por ejemplo, digamos que queremos unir la tabla employees a la tabla toys y sales para saber quién ha vendido cada juguete.

Empleados

idname
1Rob Stevens
2Jane White
3Sofia Clark

Con la sintaxis antigua, tendríamos la siguiente consulta:

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.date, e.name AS employee
FROM toys t, sales s, employees e
WHERE t.id = s.toy_id AND e.id = s.employee_id;

Para unir las mismas tres tablas con la sintaxis JOIN, utilizaríamos esta consulta:

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.date, e.name AS employee
FROM toys t
JOIN sales s
ON t.id = s.toy_id
JOIN employees e
ON e.id = s.employee_id;

El resultado es el mismo:

idnamebrandpricequantitydateemployee
1BumblebeeTransformers14.9912020-07-01Rob Stevens
2Optimus PrimeTransformers19.9912020-07-03Sofia Clark
3Lightning McQueenDisney Cars23.9712020-07-02Rob Stevens
5Wonder WomanBarbie39.9912020-07-01Sofia Clark
6Princess LeiaBarbie99.9912020-07-03Sofia Clark

La "cadena" de tablas que queremos unir es más visible en la nueva sintaxis, donde primero unimos dos tablas en columnas específicas y luego unimos la tercera tabla usando otra condición de unión. Con la sintaxis antigua, tenemos las tres tablas juntas en FROM, y luego ambas condiciones de unión especificadas (en cualquier orden) en WHERE. Qué condición corresponde a qué unión, especialmente si necesitamos unir más de tres tablas, se vuelve rápidamente confuso en esta sintaxis.

Los LEFT / RIGHT/ FULL JOINs son más fáciles

La sintaxis JOIN hace que todo tipo de uniones externas sean muy sencillas. Puede realizar uniones izquierdas (externas), derechas (externas) o completas (externas) simplemente utilizando las palabras clave respectivas (LEFT JOIN, RIGHT JOIN o FULL JOIN).

Digamos que queremos unir las tablas toys y sales para que aparezcan todos los juguetes en el resultado, aunque no haya habido ventas de un juguete durante el periodo dado. Puede hacer esta unión fácilmente en cualquier base de datos simplemente utilizando LEFT JOIN:

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.date
FROM toys t
LEFT JOIN sales s
ON t.id = s.toy_id;

El resultado incluirá todos los juguetes y la información de ventas correspondiente, cuando sea aplicable:

idnamebrandpricequantitydate
5Wonder WomanBarbie39.9912020-07-01
1BumblebeeTransformers14.9912020-07-01
3Lightning McQueenDisney Cars23.9712020-07-02
6Princess LeiaBarbie99.9912020-07-03
2Optimus PrimeTransformers19.9912020-07-03
4RamoneDisney Cars20.99NULLNULL
7Wizard of Oz: GlindaBarbie43.95NULLNULL

Si no conoce las LEFT JOINs, lea esta guía completa sobre cómo unir varias tablas a la izquierda.

¿Y qué pasa con la sintaxis antigua? Eso es complicado. Algunas bases de datos pueden permitir ciertos trucos para unir tablas a la izquierda sin usar la palabra clave JOIN, pero no hay una solución consistente que funcione en todos los casos.

Por ejemplo, en Oracle se puede utilizar el operador (+) para hacer una unión a la izquierda:

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.day
FROM toys t, sales s
WHERE t.id = s.toy_id (+);

Sin embargo, esta sintaxis no funciona en otras bases de datos.

Se evitan los CROSS JOINs accidentales

Otro problema común al unir tablas con FROM es el CROSS JOIN accidental. Si omite una condición de unión en WHERE, obtendrá todas las filas de la primera tabla combinadas con todas las filas de la segunda tabla. Así, el número de filas en el conjunto de resultados será la multiplicación del número de filas en cada tabla. Este error puede ser difícil de detectar y depurar.

Al mismo tiempo, cuando se utiliza el estándar SQL-92 para unir tablas, se obtiene un error de sintaxis si se omite la condición de unión. Por supuesto, puede unir sus tablas de forma cruzada con la nueva sintaxis, pero sólo si utiliza explícitamente la palabra clave correspondiente (CROSS JOIN).

¡Es hora de aprender la nueva sintaxis para Tipos de JOIN en SQL!

La mayoría de los profesionales de SQL están de acuerdo en que la nueva sintaxis es más legible una vez que te acostumbras a ella. Con suerte, usted también está convencido de que el enfoque moderno para unir tablas en SQL merece su atención.

LearnSQL ofrece un curso completo sobre Tipos de JOIN en SQL que incluye 93 ejercicios interactivos. Tendrás la oportunidad de practicar las uniones internas, todo tipo de uniones externas, uniones no equis y autouniones.

Además de los ejercicios, puede resultarte útil refrescar tus conocimientos de Tipos de JOIN en SQL con nuestras guías para principiantes:

¡Feliz aprendizaje!