CROSS JOIN é o operador SQL para realizar um produto cartesiano completo entre duas tabelas. Por ser um produto cartesiano, não permite nenhuma condição durante a operação , você só pode restringir seu resultado com alguma operação de filtragem (a condição WHERE).
Os operadores JOIN (INNER e OUTER JOIN, ou seja), são simplesmente produto cartesiano junto com o operador de filtragem expresso na parte ON do operador (e de fato na sintaxe original do SQL não havia operador JOIN, simplesmente a “vírgula” notação para denotar o produto com a condição de junção expressa sempre na parte WHERE).
Exemplos:
notação "antiga":
SELECT ...
FROM table1 t1, table2 t2
WHERE t1.attribute = t2.attribute
equivalente à notação "moderna":
SELECT ...
FROM table1 t1 INNER JOIN table2 t2 ON t1.attribute = t2.attribute
enquanto, para o produto cartesiano:
notação "antiga":
SELECT ...
FROM table1 t1, table2 t2
equivalente à notação "moderna":
SELECT ...
FROM table1 t1 CROSS JOIN table2 t2
Em outras palavras, um CROSS JOIN que requer uma condição é na verdade algum tipo de INNER JOIN.