关于内连接、左连接、右连接、全连接
多表查询包括:
- 等值与非等值连接查询(就是“=”“>”等)
- 自然连接查询
- 非自然连接查询
- 自身连接查询
- 复合条件连接查询
三个示例表
学生表student
课程表course
成绩表sc
等值与非等值连接查询
连接操作执行过程
student.sno=scc.sno
- 先在表 student 中找到第一个元组(行),
- 然后从头开始扫描表 sc ,逐一查找与 student 第一个元组的相等的 sc 元组,
- 找到后就将student中的第一个元组与该元组拼接起来,形成结果表中的一个元组
course.cno=scc.cno
找到sc中满足条件的元组后,开始从头扫描course表,像student.sno=scc.sno 描述的那样查找。
最终得到一个拼接后的结果,然后显示select student.sname,course.cname,scc.grade中的student.sname,course.cname,scc.grade部分
select student.sname,course.cname,scc.grade
from student,course,sc scc
where student.sno=scc.sno and course.cno=scc.cno and scc.grade>80
select | student.sname | course.cname | sc.grade |
---|---|---|---|
—— | 想要查询到的是哪个表的哪个属性 | “course.”是为了防止重名的情况 |
from | student | course | sc scc |
---|---|---|---|
—— | 需要在哪几个表查询 | “表名 表别名”为了使用方便,(别名都是这么定义的) |
where | student.sno=scc.sno | and | course.cno=scc.cno | and | scc.grade>80 |
---|---|---|---|---|---|
—— | 第一个条件 | —— | 第二个条件 | —— | 第三个条件 |
自身连接
这个情况就比较特殊了
表 course 中 cpno属性是指“你要是想学这个课程,你需要先学哪个课程”
select c1.cname 课程, c2.cname 先修课
from course c1, course c2
where c1.cpno=c2.cno
from | course c1 | course c2 |
---|---|---|
—— | 因为是自身连接,所以要用别名 |
外连接
三个表的外连接
select student.sno 学号, sname 姓名, sage 年龄, sgender 性别, sdept 院系, cname 课程名, grade 成绩, ccredit 学分
from student left outer join sc on student.sno=sc.sno left outer join course on sc.cno=course.cno
from | student | left outer join | sc | on student.sno=sc.sno | left outer join | course | on sc.cno=course.cno |
---|---|---|---|---|---|---|---|
—— | 表名 | 左连接 | 表名 | 连接的条件 | 左连接 | 表名 | 连接的条件 |