CROSS JOIN = (INTERIOR) JOIN = coma (",")
TL; DR La única diferencia entre SQL CROSS JOIN, (INNER) JOIN y la coma (",") (además de que la coma tiene menor prioridad para el orden de evaluación) es que (INNER) JOIN tiene un ON mientras que CROSS JOIN y la coma no.
Re productos intermedios
Los tres producen un producto "cartesiano" relacional conceptual intermedio de estilo SQL, también conocido como unión cruzada, de todas las combinaciones posibles de una fila de cada tabla. Está ENCENDIDO y / o DONDE eso reduce el número de filas. Violín de SQL
El estándar SQL define <comma> a través del producto (7.5 1.b.ii), <cross join> a través de <comma> (7.7 1.a) y JOIN ON <condición de búsqueda> a través de <comma> más DONDE (7.7 1.b )
Como dice Wikipedia:
Cruz unirse
CROSS JOIN devuelve el producto cartesiano de las filas de las tablas en la unión. En otras palabras, producirá filas que combinan cada fila de la primera tabla con cada fila de la segunda tabla.
Unir internamente
[...] El resultado de la combinación se puede definir como el resultado de tomar primero el producto cartesiano (o combinación cruzada) de todos los registros en las tablas (combinando cada registro en la tabla A con cada registro en la tabla B) y luego devolviendo todos los registros que satisfacen el predicado de unión.
La "notación de unión implícita" simplemente enumera las tablas para unirse, en la cláusula FROM de la instrucción SELECT, usando comas para separarlas. Por lo tanto, especifica una unión cruzada
Re EXTERIOR Las juntas y utilizando EN DONDE vs en ellos ver Condiciones en combinación izquierda (OUTER JOIN) vs INNER JOIN .
¿Por qué comparar columnas entre tablas?
Cuando no hay filas duplicadas:
Cada tabla contiene las filas que hacen una declaración verdadera a partir de una determinada plantilla de declaración de relleno en blanco [con nombre]. (Hace una proposición verdadera de-- satisface --un cierto predicado (característico) .)
Una tabla base contiene las filas que hacen una declaración verdadera de alguna plantilla de declaración dada por DBA:
/* rows where
customer C.CustomerID has age C.Age and ...
*/
FROM Customers C
El producto intermedio de una unión contiene las filas que hacen una declaración verdadera del AND de las plantillas de sus operandos:
/* rows where
customer C.CustomerID has age C.Age and ...
AND movie M.Movie is rented by customer M.CustomerID and ...
*/
FROM Customers C CROSS JOIN Movies M
ENCENDIDO Y DONDE las condiciones se ANDAN para dar una plantilla adicional. El valor es nuevamente las filas que satisfacen esa plantilla:
/* rows where
customer C.CustomerID has age C.Age and ...
AND movie M.Movie is rented by customer M.CustomerID and ...
AND C.CustomerID = M.CustomerID
AND C.Age >= M.[Minimum Age]
AND C.Age = 18
*/
FROM Customers C INNER JOIN Movies M
ON C.CustomerID = M.CustomerID
AND C.Age >= M.[Minimum Age]
WHERE C.Age = 18
En particular, comparar columnas para la igualdad (SQL) entre tablas significa que las filas guardadas del producto de las partes de las tablas unidas de la plantilla tienen el mismo valor (no NULL) para esas columnas. Es una coincidencia que muchas filas se eliminen típicamente mediante comparaciones de igualdad entre tablas; lo que es necesario y suficiente es caracterizar las filas que desea.
¡Simplemente escriba SQL para la plantilla para las filas que desee!
Consulte el significado de las consultas (y las tablas frente a las condiciones):
¿Cómo obtener datos coincidentes de otra tabla SQL para dos columnas diferentes: Unión interna y / o Unión?
¿Hay alguna regla general para construir una consulta SQL a partir de una descripción legible por humanos?
Sobrecarga de "unión cruzada"
Lamentablemente, el término "unión cruzada" se usa para:
- El producto intermedio.
- CROSS JOIN.
- (INTERIOR) ÚNASE con un ENCENDIDO o DONDE que no compare ninguna columna de una tabla con ninguna columna de otra. (Dado que eso tiende a devolver muchas de las filas de productos intermedios).
Estos diversos significados se confunden. (Por ejemplo, como en otras respuestas y comentarios aquí).
Uso de CROSS JOIN vs (INNER) JOIN vs comma
La convención común es:
- Use CROSS JOIN cuando y solo cuando no compare columnas entre tablas. Eso es para mostrar que la falta de comparaciones fue intencional.
- Use (INNER) JOIN con ON cuando y solo cuando compare columnas entre tablas. (Además, posiblemente otras condiciones).
- No uses coma.
Por lo general, también las condiciones que no están en pares de tablas se mantienen para un DÓNDE. Pero es posible que tengan que colocarse en una (n INNER) JOIN ON para obtener las filas apropiadas para el argumento de una DERECHA, IZQUIERDA o COMPLETA (EXTERIOR).
Re "No usar comas" Mezclar comas con JOIN explícito puede inducir a error porque la coma tiene menor prioridad. Pero dado el papel del producto intermedio en el significado de CROSS JOIN, (INNER) JOIN y la coma, los argumentos para la convención anterior de no usarlo son inestables. Una CROSS JOIN o una coma es como una (INNER) JOIN que está en una condición VERDADERA. Un producto intermedio, ON y WHERE, todos introducen un AND en el predicado correspondiente. Sin embargo, se puede pensar en INNER JOIN ON, por ejemplo, generar una fila de salida solo cuando se encuentra un par de filas de entrada que satisfacen la condición ON, sin embargo, devuelve las filas de unión cruzada que satisfacen la condición. La única razón por la cual ON tenía que complementar la coma en SQL era escribir OUTERUniones. Por supuesto, una expresión debe aclarar su significado; pero lo que está claro depende de lo que se entiende que significan las cosas.
Re Diagramas de Venn Un diagrama de Venn con dos círculos que se cruzan puede ilustrar la diferencia entre las filas de salida para las uniones INNER, LEFT, RIGHT y FULL para la misma entrada. Y cuando el ON es incondicionalmente VERDADERO, el resultado de INNER JOIN es el mismo que CROSS JOIN. También puede ilustrar las filas de entrada y salida para INTERSECT, UNION & EXCEPT. Y cuando ambas entradas tienen las mismas columnas, el resultado INTERSECT es el mismo que para SQL NATURAL JOIN estándar, y el resultado EXCEPT es el mismo que para ciertos modismos que involucran IZQUIERDA DERECHA E IZQUIERDA. Pero no ilustra cómo funciona (INNER) JOIN en general. Eso parece plausible a primera vista . Puede identificar partes de entrada y / o salida paracasos especiales de ON, PK (claves primarias), FK (claves foráneas) y / o SELECT. Todo lo que tiene que hacer para ver esto es identificar exactamente cuáles son los elementos de los conjuntos representados por los círculos . (Que las presentaciones confusas nunca dejan en claro). (Recuerde que, en general, para las filas de salida de las combinaciones tienen encabezados diferentes de las filas de entrada . Y las tablas SQL son bolsas, no conjuntos de filas con NULL ).
CROSS JOIN
dará como resultado todas las combinaciones posibles de las tablas. por ejemplo, Tabla1 con 100 filas y Tabla2 con 100 filas dará como resultado 10000 registros.