cross join 的核心作用是生成两个表的笛卡尔积,即将第一个表的每一行与第二个表的每一行进行组合,结果集行数为两表行数的乘积,例如2行的students表与3行的courses表通过cross join产生6行结果,其语法无需on子句,如select s.studentname, c.coursename from students s cross join courses c;它与inner join等基于匹配条件的连接不同,cross join不依赖关联字段,而是生成所有可能的组合,因此常用于需要全排列的场景,如生成产品颜色与尺寸的所有搭配、构建日历表、创建测试数据等,但因结果集增长迅速,当表数据量大或无需全部组合时应避免使用,否则可能导致性能严重下降,故实际应用中需谨慎评估其必要性与效率。
CROSS JOIN
要使用
CROSS JOIN
ON
SELECT column1, column2, ... FROM TableA CROSS JOIN TableB;
举个例子,假设我们有两个简单的表:
Students
StudentID | StudentName |
---|---|
1 | Alice |
2 | Bob |
Courses
CourseID | CourseName |
---|---|
101 | Math |
102 | History |
103 | Art |
如果我们对这两个表执行
CROSS JOIN
SELECT s.StudentName, c.CourseName FROM Students s CROSS JOIN Courses c;
结果会是这样:
StudentName | CourseName |
---|---|
Alice | Math |
Alice | History |
Alice | Art |
Bob | Math |
Bob | History |
Bob | Art |
可以看到,
Students
Courses
CROSS JOIN
FROM
FROM TableA, TableB
CROSS JOIN
CROSS JOIN
CROSS JOIN
说实话,
CROSS JOIN
INNER JOIN
LEFT JOIN
CROSS JOIN
ON
拿
INNER JOIN
ON
SELECT * FROM Orders o INNER JOIN Customers c ON o.CustomerID = c.CustomerID;
CustomerID
CustomerID
但
CROSS JOIN
CROSS JOIN
当然,你也可以在一个
CROSS JOIN
WHERE
INNER JOIN
SELECT s.StudentName, c.CourseName FROM Students s CROSS JOIN Courses c WHERE s.StudentID = c.CourseID; -- 假设这是一种匹配条件,虽然不合理
但这种做法通常效率不高,而且可读性也差,因为它首先生成了大量的中间结果(笛卡尔积),然后再进行过滤。所以,如果你的目标是基于某个条件进行匹配,那毫无疑问应该直接使用
INNER JOIN
CROSS JOIN
CROSS JOIN
用
CROSS JOIN
CROSS JOIN
所以,我通常会避免在以下几种情况下盲目使用
CROSS JOIN
CROSS JOIN
INNER JOIN
LEFT JOIN
ON
JOIN
CROSS JOIN
WHERE
我通常会这样想:如果一个
CROSS JOIN
WHERE
CROSS JOIN
CROSS JOIN
尽管
CROSS JOIN
生成所有可能的组合或排列: 这是
CROSS JOIN
-- 假设我们有两个临时表或CTE: WITH Colors AS ( SELECT 'Red' AS ColorName UNION ALL SELECT 'Blue' UNION ALL SELECT 'Green' ), Sizes AS ( SELECT 'S' AS SizeName UNION ALL SELECT 'M' UNION ALL SELECT 'L' ) SELECT c.ColorName, s.SizeName FROM Colors c CROSS JOIN Sizes s;
这个查询会返回像 (Red, S), (Red, M), (Red, L), (Blue, S) ... 这样的所有组合。这对于规划产品 SKU、生成报表维度等非常有用。
创建“日期/时间”维度表或日历表: 在数据仓库或商业智能领域,我们经常需要一个包含所有日期、月份、年份等信息的日历表。你可以通过
CROSS JOIN
-- 假设我们想生成2023年的所有日期 WITH Years AS (SELECT 2023 AS YearNum), Numbers AS ( SELECT 1 AS n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12 UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL SELECT 15 UNION ALL SELECT 16 UNION ALL SELECT 17 UNION ALL SELECT 18 UNION ALL SELECT 19 UNION ALL SELECT 20 UNION ALL SELECT 21 UNION ALL SELECT 22 UNION ALL SELECT 23 UNION ALL SELECT 24 UNION ALL SELECT 25 UNION ALL SELECT 26 UNION ALL SELECT 27 UNION ALL SELECT 28 UNION ALL SELECT 29 UNION ALL SELECT 30 UNION ALL SELECT 31 ) SELECT DATEFROMPARTS(y.YearNum, m.n, d.n) AS FullDate FROM Years y CROSS JOIN Numbers m -- 作为月份 CROSS JOIN Numbers d -- 作为日期 WHERE ISDATE(CONCAT(y.YearNum, '-', m.n, '-', d.n)) = 1 -- 确保日期有效 ORDER BY FullDate;
这个例子稍微复杂点,但核心思想是利用
CROSS JOIN
生成测试数据: 当你需要快速生成大量具有不同属性组合的测试数据时,
CROSS JOIN
计算所有点对点距离(在某些特定场景下): 如果你有一个地理位置列表,需要计算每两个位置之间的距离,
CROSS JOIN
WHERE
总的来说,
CROSS JOIN
JOIN
以上就是sql如何使用cross join进行交叉连接查询 sqlcross join交叉连接的基础教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 //m.sbmmt.com/ All Rights Reserved | php.cn | 湘ICP备2023035733号