今天在看Redash里同事的query时,看到一段SQL,看到的时候突然发了一下愣:
在日常我们需要进行多表查询时,日常最常用到的有内链接,外链接(inner join,left(right) outer join,full outer join(mysql不支持,可以使用union关键字来合并left join与right join来模拟。
在截图中,join后并没有on关键字来确定链接条件,我的第一反应是检查是不是inner join的(“,” + “where”)写法,仔细看了之后发现并不是,而是一种平常并不常用的交叉连接(cross join),
Cross join
cross join:交叉连接,得到的结果是两个表的乘积,即笛卡尔积
笛卡尔(Descartes)乘积又叫直积。假设集合A={a,b},集合B={0,1,2},则 两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1),
(b,2)}。可以扩展到多个集合的情况。类似的例子有,如果A表示某学校学生的集合,B表示该学校所有课程的集合,则A与B的笛卡尔积表示所有可能的选课情况。
mysql> select * from A cross join B;
+----+-----------+----+-------------+
| id | name | id | name |
+----+-----------+----+-------------+
| 1 | Pirate | 1 | Rutabaga |
| 2 | Monkey | 1 | Rutabaga |
| 3 | Ninja | 1 | Rutabaga |
| 4 | Spaghetti