joinMySQL深入探索:CROSS JOIN实践篇(mysqlcross)
NoSQL快速入门中探讨了最常用的MySQL常用连接(即JOINs),下面我们来深入了解CROSS JOIN这种老朋友。
CROSS JOIN作为JOIN中的一种,它带来的作用就是连接每组可能的行,即将两个表中的每一行组合全部连接起来,这时行数将为两个表中行数的乘积,列数将联合所有表的列数。也许大家在SQL中的查询代码可能实际情况下更少见,但并没有因此而被废弃,只是有些不重要或者不推荐使用。
基本形式:
`SELECT … FROM table1 CROSS JOIN table2WHERE table1.column1 = x and table2.column2 = y;`
以下是CROSS JOIN有用特性之一:生成一对多(一对多)关系时,用CROSS JOIN可以比使用 LEFT JOIN 更简单:
`SELECT t1.column1, t2.column2
FROM table1 t1
CROSS JOIN table2 t2;`
下面是一个简单又实用的例子:
`SELECT p.id, p.name, a.name AS author_name
FROM Post p
CROSS JOIN Author a;`
这样,可以产生一个表,其中包括每个文章的id,名称以及每个文章的作者信息:
| id | name | author_name |
|—-|——|————-|
| 1 | A | Lee |
| 1 | A | King |
| 2 | B | Lee |
| 2 | B | King |
最后,使用CROSS JOIN也可以帮助我们统计每个组合的数量:
`SELECT p.name AS post_name, a.name AS author_name, COUNT(*) AS num
FROM Post p
CROSS JOIN Author a
GROUP BY p.name, a.name`
这个查询将会统计出每个文章以及作者的数量:
| post_name | author_name | num |
|———–|————-|—–|
| A | Lee | 1 |
| A | King | 1 |
| B | Lee | 1 |
| B | King | 1 |
总而言之,CROSS JOIN仍然是MySQL数据库中有用而又误解的连接。它可以方便的帮助我们创建一对多关系,同时也是有效的统计工具。虽然实际的使用情况少一些,但是CROSS JOIN也让我们更完整的理解MySQL的JOIN 语句,尤其是当业务需要去了解两个表中数据之间的关系时,这种连接就简单明了。