MySql多表查询
创建测试表TEACHER(教师表)、COURSE(课程表)、STUDENT(学生表)
TEACHER:
| TNO | 教工号 |
| TNAME | 教师姓名 |
| CNO | 课程号 |
| SAL | 工资 |
| DNAME | 所在系 |
| TSEX | 性别 |
| AGE | 年龄 |

COURSE:
| CNO | 课程号 |
| CNAME | 课程名 |
| TIME | 课时 |
| SCOUNT | 人数 |
| CTEST | 考试时间 |

STUDENT:
| SNO | 学生号 |
| SNAME | 学生性名 |
| DNAME | 系名 |
| SSEX | 性别 |
| CNO | 课程号 |
| MARK | 成绩 |
| TYPE | 课程类型 |

二表连接
- 查询所有教师姓名、系名、课程名及考试时间

多表连接
- 查询所有学生姓名、所在系、课程名、考试时间、考试成绩及老师姓名

AS别名

自连接
- 查询所有考试成绩大于60的学生姓名、所在系、课程号及考试成绩

自然连接
-
将表中具有相同名称的列自动进行记录匹配,等同于
WHERE的等值连接,但是WHERE更加灵活。 -
这里匹配两个表中的CNO和DNAME列,当两列均相同,才能连接起来。如果只需要匹配CNO则需要WHERE

上述自然连接等同于如下WHERE等值连接

内连接
-
返回两个表中所有相匹配的数据,舍弃掉不匹配的数据
-
返回所有学生姓名、系名、课程号和教师姓名

-
INNER JOIN 一次只能连接两个表,多个表需要多次连接
-
返回所有学生姓名、系名、课程名、考试时间、考试成绩和老师姓名

外连接
- 匹配不仅包含符合条件的行,还包括左表(左外连接)、右表(右外连接)或两个连接表(全外连接)中的所有数据行
| 表R | A | B | C | 表S | C | D |
|---|---|---|---|---|---|---|
| a1 | b1 | c1 | c1 | d1 | ||
| a2 | b2 | c2 | c2 | d2 | ||
| a3 | b3 | c3 | c4 | d3 |
左外连接
- R left outer join S on R.C = S.C
| A | B | C | C | D |
|---|---|---|---|---|
| a1 | b1 | c1 | c1 | d1 |
| a2 | b2 | c2 | c2 | d2 |
| a3 | b3 | c3 | null | null |
- 查询所有同学的学号、姓名、课程号、课程名、考试时间和成绩信息

右外连接
- R right outer join S on R.C = S.C
| A | B | C | C | D |
|---|---|---|---|---|
| a1 | b1 | c1 | c1 | d1 |
| a2 | b2 | c2 | c2 | d2 |
| null | null | null | c4 | d3 |
- 查询所有学生的学号、姓名、课程号、课程名、考试时间和成绩信息

交叉连接
-
返回两个表的所有数据行的笛卡尔积
-
R cross join S
| A | B | R.C | S.C | D |
|---|---|---|---|---|
| a1 | b1 | c1 | c1 | d1 |
| a1 | b1 | c1 | c2 | d2 |
| a1 | b1 | c1 | c4 | d3 |
| a2 | b2 | c2 | c1 | d1 |
| a2 | b2 | c2 | c2 | d2 |
| a2 | b2 | c2 | c4 | d3 |
| a3 | b3 | c3 | c1 | d1 |
| a3 | b3 | c3 | c2 | d2 |
| a3 | b3 | c3 | c4 | d3 |

UNION
-
对集合进行关系并运算
-
分别取出课程号为1和10的学生号、学生姓名和系名然后进行并运算

UNION全外连接
-
全外连接包括匹配行外,还包括左右表不匹配行。MySql没有全外连接我们可以用UNION来实现。
-
全外连接
| A | B | R.C | S.C | D |
|---|---|---|---|---|
| a1 | b1 | c1 | c1 | d1 |
| a2 | b2 | c2 | c2 | d2 |
| a3 | b3 | c3 | null | null |
| null | null | null | c4 | d3 |


浙公网安备 33010602011771号