Lección 5.6: CROSS JOIN - El Producto Cartesiano
Mientras que la mayoría de los joins requieren una condición de coincidencia específica (la cláusula ON), un CROSS JOIN es diferente. Devuelve todas las combinaciones posibles de filas de las tablas unidas. Este resultado se conoce matemáticamente como un Producto Cartesiano.
¿Qué es un CROSS JOIN?
Un CROSS JOIN produce un conjunto de resultados donde el número de filas es el resultado de multiplicar el número de filas en la primera tabla por el número de filas en la segunda tabla. No se utiliza ninguna condición para hacer coincidir las filas; cada fila en la Tabla A simplemente se combina con cada fila en la Tabla B.
Visualización:
Tabla A (Colores) Tabla B (Tamaños)
+-----------+ +-----------+
| color | | tamaño |
+-----------+ +-----------+
| Rojo | --\ | Pequeño |
| Azul | ---|------> | Mediano |
+-----------+ --/ | Grande |
+-----------+
Resultado (Combinaciones):
Rojo, Pequeño
Rojo, Mediano
Rojo, Grande
Azul, Pequeño
Azul, Mediano
Azul, Grande
Si la Tabla A tiene 2 filas y la Tabla B tiene 3 filas, el resultado tendrá 2 x 3 = 6 filas.
Sintaxis de CROSS JOIN
Hay dos formas de escribir un producto cartesiano:
-- Sintaxis explícita
SELECT
table1.column,
table2.column
FROM
table1
CROSS JOIN
table2;
-- Sintaxis implícita con coma
SELECT
table1.column,
table2.column
FROM
table1,
table2;
Es importante entender que estas formas difieren no solo en estilo, sino también en la precedencia de los operadores.
- Un
JOINexplícito tiene mayor precedencia y se procesa en la misma secuencia que otras cláusulasJOINen el texto de la consulta. - La sintaxis con coma tiene menor precedencia y se procesa efectivamente solo después de los
JOINexplícitos.
Debido a esto, mezclar joins con coma y JOIN explícitos en la misma cláusula FROM puede cambiar el significado de la consulta o incluso llevar a un error.
Por ejemplo, la siguiente consulta es inválida:
FROM a, b JOIN c ON (a.x = c.y AND b.z = c.t)
Por qué esto es un error:
- primero, el
b JOIN cexplícito se procesa; - en ese momento, la tabla
aaún no está en el ámbito para esa expresión de join; - por lo tanto, la referencia a
a.xdentro de la cláusulaONes inválida.
Es por eso que el CROSS JOIN explícito suele ser preferible: no solo porque se ve más claro, sino porque se ajusta mejor a otros JOIN y evita problemas ocultos de precedencia.
Advertencia: Ten mucho cuidado al usar
CROSS JOINen tablas grandes. Unir dos tablas con 1,000 filas cada una producirá 1,000,000 filas!
Ejemplos Prácticos (Base de Datos Sakila)
1. Generando Todas las Combinaciones Posibles
Imagina que queremos crear un informe o una cuadrícula que muestre cada categoría de película para cada tienda, incluso si esa tienda no tiene películas en esa categoría.
SELECT
s.store_id,
c.name AS category_name
FROM
store AS s
CROSS JOIN
category AS c;
Esto produce una lista de todas las categorías para la Tienda 1, seguida de todas las categorías para la Tienda 2.
2. Creando Datos de Prueba o Matrices
El CROSS JOIN se utiliza a menudo para generar grandes conjuntos de permutaciones para pruebas o para construir calendarios/horarios donde necesitas ver todos los intervalos de tiempo contra todos los usuarios.
Cuándo Usar CROSS JOIN
- Generando Permutaciones: Cuando necesitas una lista de cada combinación posible (por ejemplo, todos los colores de productos frente a todos los tamaños de productos).
- Llenando Vacíos: Cuando se utiliza con
LEFT JOIN, puede ayudar a identificar combinaciones faltantes en tus datos. - Informes: Para crear el "esqueleto" de un informe que debe incluir todas las categorías, incluso aquellas con valores cero.
Conclusiones Clave de Esta Lección
- CROSS JOIN devuelve el Producto Cartesiano de dos tablas.
- No utiliza una cláusula
ON(sin condición de coincidencia). - El número de filas en el resultado es el producto de los conteos de filas de ambas tablas.
- Úsalo con precaución en conjuntos de datos grandes para evitar problemas de rendimiento.