如上功效我们获得9行=student(3) x course(3)。交错联接一样平常会耗损较大的资源,也被许多用户质疑交错联接存在的意义?(任何时辰我们都有质疑的权力,同时也提议我们养本钱身质疑本身“质疑”的风俗,就像小时辰不领略怙恃的“空话”一样)。
我们以开篇的示例声名交错联接的奇妙之一,开篇中我们的查询需求是:在门生表(学号,姓名,性别),课程表(课程号,课程名,学分)和后果表(学号,课程号,分数)中查询全部门生的姓名,课程名和测验分数。开篇中的SQL语句获得的功效如下:
- mysql> SELECT
- -> student.name, course.name, score
- -> FROM student JOIN score ON student.no = score.s_no
- -> JOIN course ON score.c_no = course.no;
- +-------+-------+-------+
- | name | name | score |
- +-------+-------+-------+
- | Sunny | Java | 80 |
- | Sunny | Blink | 98 |
- | Sunny | Spark | 76 |
- | Kevin | Java | 78 |
- | Kevin | Blink | 88 |
- | Kevin | Spark | 68 |
- +-------+-------+-------+
- 6 rows in set (0.00 sec)
如上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 (编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|