我有3张桌子:
CREATE TABLE test1 (
id INTEGER
);
CREATE TABLE test2 (
id INTEGER
);
CREATE TABLE test3 (
id INTEGER
);
我将 10 插入
test1
,将 10 和 20 插入 test2
,将 10、20 和 30 插入 test3
,方法如下:
INSERT INTO test1 (id)
VALUES (10);
然后我尝试通过以下两种方式检索数据:
第一种方式:
SELECT *
FROM test1, test2, test3;
第二种方式:
SELECT *
FROM test1
CROSS JOIN test2, test3;
两种方式我都得到相同的结果:
"10" "10" "10"
"10" "10" "20"
"10" "10" "30"
"10" "20" "10"
"10" "20" "20"
"10" "20" "30"
正如我所见,没有区别,那有什么用呢
CROSS JOIN
?
就它们返回的结果而言,没有有什么区别。 来自 SQLite 文档:
“INNER JOIN”、“JOIN”和“,”连接运算符之间没有区别。它们在 SQLite 中是完全可以互换的。 “CROSS JOIN”连接运算符产生与“INNER JOIN”、“JOIN”和“,”运算符相同的结果,但查询优化器的处理方式不同,因为它会阻止查询优化器对连接中的表重新排序。
无论哪种方式,您都会获得指定表中行的笛卡尔积。
但从风格上来说,显式使用
JOIN
关键字使得查询的意图比旧的逗号连接语法更清晰。