如上INNER JOIN的结果我们发现少了Tom同学的成绩,原因是Tom同学没有参加考试,在score表中没有Tom的成绩,但是我们可能希望虽然Tom没有参加考试但仍然希望Tom的成绩能够在查询结果中显示(成绩 0 分),面对这样的需求,我们怎么处理呢?交叉联接可以帮助我们:
- 第一步 student和course 进行交叉联接:
- mysql> SELECT
- -> stu.no, c.no, stu.name, c.name
- -> FROM student stu JOIN course c 笛卡尔积
- -> ORDER BY stu.no; -- 排序只是方便大家查看:)
- +------+-----+-------+-------+
- | no | no | name | name |
- +------+-----+-------+-------+
- | S001 | C03 | Sunny | Spark |
- | S001 | C01 | Sunny | Java |
- | S001 | C02 | Sunny | Blink |
- | S002 | C03 | Tom | Spark |
- | S002 | C01 | Tom | Java |
- | S002 | C02 | Tom | Blink |
- | S003 | C02 | Kevin | Blink |
- | S003 | C03 | Kevin | Spark |
- | S003 | C01 | Kevin | Java |
- +------+-----+-------+-------+
- 9 rows in set (0.00 sec)
第二步 将交叉联接的结果与score表进行左外联接,如下:
- mysql> SELECT
- -> stu.no, c.no, stu.name, c.name,
- -> CASE
- -> WHEN s.score IS NULL THEN 0
- -> ELSE s.score
- -> END AS score
- -> FROM student stu JOIN course c -- 迪卡尔积
- -> LEFT JOIN score s ON sstu.no = s.s_no and c.no = s.c_no -- LEFT OUTER JOIN
- -> ORDER BY stu.no; -- 排序只是为了大家好看一点:)
- +------+-----+-------+-------+-------+
- | no | no | name | name | score |
- +------+-----+-------+-------+-------+
- | S001 | C03 | Sunny | Spark | 76 |
- | S001 | C01 | Sunny | Java | 80 |
- | S001 | C02 | Sunny | Blink | 98 |
- | S002 | C02 | Tom | Blink | 0 | -- TOM 虽然没有参加考试,但是仍然看到他的信息
- | S002 | C03 | Tom | Spark | 0 |
- | S002 | C01 | Tom | Java | 0 |
- | S003 | C02 | Kevin | Blink | 88 |
- | S003 | C03 | Kevin | Spark | 68 |
- | S003 | C01 | Kevin | Java | 78 |
- +------+-----+-------+-------+-------+
- 9 rows in set (0.00 sec)
经过CROSS JOIN帮我们将Tom的信息也查询出来了!(TOM 虽然没有参加考试,但是仍然看到他的信息)
2. INNER JOIN (编辑:西安站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|