数据查询(连接查询)
等值与非等值连接查询
定义
等值连接:连接运算符为“=”
例1
查询每个学生及其选修课程的情况
SELECT student.*, SC.*
FROM Student. SC
WHERE Student.Sno = SC.Sno;
问题
对策
- 自然连接
- 采用在
SELECT
中去掉重复字段的方式实施
SELECT Student.Sno, Sname, Ssex, Sage, Sdept, Cno, Grade
FROM Student, SC
WHERE Student. Sno = SC.Sno;
(1)嵌套循环法
(2)排序合并法
(3)索引连接
例2
查询选修2号课程且成绩在90分以上的所有学生的学号和姓名。
SELECT Student.Sno, Sname
FROM Student, SC
WHERE Student.Sno=SC.Sno AND SC.Cno='2' AND SC.Grade>90;
- 一条SQL语句可以同时完成选择和连接查询,这时WHERE 子句是由连接谓词和选择谓词组合成的复合条件。
自身连接
定义
一个表与其自己进行连接,是一种特殊的连接
特点
- 需要给表起别名以示区别
- 由于所有属性名都是同名属性,因此必须使用别名前缀
例3
SELECT FIRST.Cname, SECOND Cname
FROM Course FIRST, Course Second
WHERE FIRST.Cpno = SECOND. Cno
外连接
外连接与普通连接的区别
- 普通连接操作只输出满足连接条件的元组
- 外连接操作以指定表为连接主体,将主题表中不满足连接条件的元组一并输出
- 左外连接:列出左边关系中所有的元组
- 右外连接:列出右边关系中所有的元组
例4
改写例2
SELECT Student.Sno, Sname, Ssex, Sage, Sdept, Cno, Grade
FROM Student LEFT OUT JOIN SC ON (Student.Sno=SC.Sno)
有些商业系统的表达更简单:
SELECT Student.Sno, Sname, Ssex, Sage, Sdept, Cno, Grade
FROM Student, SC
WHERE Student.Sno(+)=SC.Sno;
有(+)的一方表示连接主体
多表连接
例5
查询每个学生的学号、姓名、选修的课程名及成绩
SELECT Student.Sno, Sname, Cname, Grade
FROM Student, SC, Course /*多表连接*/
WHERE Student.Sno = SC.Sno
AND SC.Cno = Course.Cno;
与两表连接一样