创建测试表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 |