如上结果我们得到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 (编辑:威海站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|