CROSS JOIN = (INTERNO) JOIN = vírgula (",")
TL; DR A única diferença entre SQL CROSS JOIN, (INNER) JOIN e vírgula (",") (além de vírgula ter menor precedência para a ordem de avaliação) é que (INNER) JOIN tem ON enquanto CROSS JOIN e vírgula não.
Re produtos intermediários
Todos os três produzem um produto "Cartesiano" relacional conceitual intermediário no estilo SQL, também conhecido como junção cruzada, de todas as combinações possíveis de uma linha de cada tabela. É ON e / ou WHERE que reduz o número de linhas. SQL Fiddle
O padrão SQL define <comma> via produto (7.5 1.b.ii), <junção cruzada> via <comma> (7.7 1.a) e JOIN ON <condição de pesquisa> via <comma> mais WHERE (7.7 1.b )
Como a Wikipedia coloca:
Junção cruzada
CROSS JOIN retorna o produto cartesiano de linhas das tabelas na junção. Em outras palavras, ele produzirá linhas que combinam cada linha da primeira tabela com cada linha da segunda tabela.
Junção interna
[...] O resultado da junção pode ser definido como o resultado de obter primeiro o produto cartesiano (ou junção cruzada) de todos os registros das tabelas (combinando todos os registros da tabela A com todos os registros da tabela B) e depois retornar todos os registros que satisfazem o predicado de junção.
A "notação de associação implícita" simplesmente lista as tabelas para associação, na cláusula FROM da instrução SELECT, usando vírgulas para separá-las. Assim, especifica uma junção cruzada
Re OUTER JOINs e usando ON vs WHERE neles, consulte Condições em LEFT JOIN (OUTER JOIN) vs INNER JOIN .
Por que comparar colunas entre tabelas?
Quando não há linhas duplicadas:
Toda tabela contém as linhas que fazem uma afirmação verdadeira a partir de um determinado modelo de instrução preencher em branco. (Faz uma verdadeira proposição de-- satisfaz --a certo predicado (característica) .)
Uma tabela base mantém as linhas que fazem uma declaração verdadeira de algum modelo de declaração fornecido pelo DBA:
/* rows where
customer C.CustomerID has age C.Age and ...
*/
FROM Customers C
O produto intermediário de uma junção mantém as linhas que fazem uma declaração verdadeira do AND dos modelos de seus 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
As condições ON e ON são ANDed para fornecer um modelo adicional. O valor são novamente as linhas que satisfazem esse modelo:
/* 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
Em particular, comparar colunas para igualdade (SQL) entre tabelas significa que as linhas mantidas do produto nas partes do modelo das tabelas unidas têm o mesmo valor (não NULL) para essas colunas. É apenas coincidência que muitas linhas são normalmente removidas por comparações de igualdade entre tabelas - o que é necessário e suficiente é caracterizar as linhas que você deseja.
Basta escrever SQL para o modelo para as linhas que você deseja!
Sobre o significado de consultas (e tabelas x condições), consulte:
Como obter dados correspondentes de outra tabela SQL para duas colunas diferentes: Junção interna e / ou União?
Existe alguma regra prática para construir a consulta SQL a partir de uma descrição legível por humanos?
Sobrecarregando "junção cruzada"
Infelizmente, o termo "junção cruzada" é usado para:
- O produto intermediário.
- JUNÇÃO TRANSVERSAL.
- (INNER) JOIN com ON ou WHERE que não compara nenhuma coluna de uma tabela a nenhuma coluna de outra. (Como isso tende a retornar muitas das linhas intermediárias do produto.)
Esses vários significados são confundidos. (Por exemplo, como em outras respostas e comentários aqui.)
Usando CROSS JOIN vs (INNER) JOIN vs vírgula
A convenção comum é:
- Use CROSS JOIN quando e somente quando você não comparar colunas entre tabelas. Isso é para mostrar que a falta de comparações foi intencional.
- Use (INNER) JOIN com ON quando e somente quando comparar colunas entre tabelas. (Além disso, possivelmente outras condições.)
- Não use vírgula.
Normalmente, também as condições que não estão em pares de tabelas são mantidas por um WHERE. Mas eles podem ter que ser inseridos em um (n INNER) JOIN ON para obter linhas apropriadas para o argumento de um DIREITO, ESQUERDO ou CHEIO (EXTERNO).
Re "Não use vírgula" A mistura de vírgula com JOIN explícita pode enganar, pois a vírgula tem menor precedência. Mas, dado o papel do produto intermediário no significado de CROSS JOIN, (INNER) JOIN e vírgula, os argumentos para a convenção acima de não usá-lo são instáveis. Uma junção cruzada ou vírgula é como uma junção (interna) que está em uma condição VERDADEIRA. Um produto intermediário, ON e WHERE, todos introduzem um AND no predicado correspondente. Entretanto, pode-se pensar em INNER JOIN ON - digamos, gerando uma linha de saída apenas ao encontrar um par de linhas de entrada que satisfaça a condição ON - mas, no entanto, retorna as linhas de junção cruzada que satisfazem a condição. A única razão pela qual o ON teve que suplementar vírgula no SQL foi escrever OUTERJOINs. Obviamente, uma expressão deve tornar seu significado claro; mas o que está claro depende do significado das coisas.
Diagramas de Re Venn Um diagrama de Venn com dois círculos que se cruzam pode ilustrar a diferença entre as linhas de saída para JUNÇÕES INTERNA, ESQUERDA, DIREITA e CHEIA para a mesma entrada. E quando o ON é incondicionalmente VERDADEIRO, o resultado INNER JOIN é o mesmo que CROSS JOIN. Também pode ilustrar as linhas de entrada e saída para INTERSECT, UNION & EXCEPT. E quando ambas as entradas têm as mesmas colunas, o resultado INTERSECT é o mesmo que para o SQL NATURAL JOIN padrão e o resultado EXCEPT é o mesmo que para certos idiomas que envolvem LEFT & RIGHT JOIN. Mas não ilustra como (INNER) JOIN funciona em geral. Isso parece plausível à primeira vista . Pode identificar casos especiais de peças da entrada e / ou saída parade ON, PKs (chaves primárias), FKs (chaves estrangeiras) e / ou SELECT. Tudo o que você precisa fazer é identificar quais são exatamente os elementos dos conjuntos representados pelos círculos . (Que confusa apresentações não deixam claro.) (Lembre-se que, em geral, para a junta linhas de saída têm diferentes rubricas de linhas de entrada . Mesas e SQL são sacos não conjuntos de linhas com nulos .)
CROSS JOIN
resultará em todas as combinações possíveis das tabelas. por exemplo, Tabela1 com 100 linhas e Tabela2 com 100 linhas resultará em 10000 registros.