连接查询
当运算符为=时,成为等值连接,使用其他运算符称为非等值链接
- 查询每个学生及其选修课程的情况
select Student.*,SC.* from Student,SC where Student.Sno=SC.Sno;
- 查询选修2号课程且成绩在90分以上的所有学生的学号和姓名
select Student.Sno Sname from Student,SC where Student.Sno='2' and SC.Grade>90;
自身链接
连接也可以自己与自己连接,叫做表的自身连接.
- 查询每一门课的间接先修课
select First.Cno, Second.Cpno from Course First,Course Second where First.Cpno=Second.Cno;
外连接
多表连接
- 查询每个学生的学号,姓名,选修的课程名以及成绩
select Student.Sno,Sname,Cname,Grade from Student,SC,Course where Student.Sno=Sc.Sno and SC.Cno=Course.Cno;
嵌套查询
带有IN谓词的子查询
- 查询与'刘晨'在同一个系学习的学生
select Sno,Sname,Sdept from Student where sdept in (select Sdept from Student where Sname='刘晨');//本例中子查询条件不依赖于父查询,称为不相关子查询,当in 的集合确定只返回一个值时,可以用=替换
- 查询选修了课程名为"信息系统"的学生学号和姓名
select Sno,Sname from Student where Sno in (select Sno from SC where Cno in (Select Cno from Course where Cname='信息系统'));//也是不相关子查询
带有比较运算符的子查询
- 找出每个学生超过他自己选修课平均成绩的课程号
select Sno,Cno from SC a where Grade>=(Select AVG(Grade) from SC b where b.Sno=a.Sno);//a是SC表的别名(元组变量),可以用来表示SC的一个元组,内层查询是求一个学生所有选修课程平均成绩的,至于是哪个学生的平均成绩要看a.Sno的值,而该值是与父查询相关的,所以叫做相关子查询.
带有ANY(SOME)或ALL谓词的子查询
关键字 | 含义 |
---|---|
>ANY | 大于子查询结果中的某个值 |
>ALL | 大于子查询结果中的所有值 |
<ANY | 小于子查询结果中的某个值 |
<All | 小于子查询结果中的所有值 |
>=ANY | 大于等于子查询结果中的某个值 |
>=ALL | 大于等于子查询结果中的所有值 |
<=ANY | 小于等于子查询结果中的某个值 |
<=All | 小于等于子查询结果中的所有值 |
=ANY | 等于子查询结果中的某个值 |
=All | 等于子查询结果中的所有值 |
!=ANY | 不等于子查询结果中的某个值 |
!=All | 不等于子查询结果中的任何值 |
- 查询非计算机科学系中比计算机科学系任意一个学生年龄小的学生姓名和年龄
select Sname,Sage from Student where Sage<Any (Select Sage From Student where Sdept='CS') and Sdept !='CS';
- 查询非计算机科学系中比计算机科学系所有学生年龄都小的学生姓名和年龄
select Sname,Sage from Student where Sage<All (select Sage from Student where Sdept='CS') and Sdept !='CS';
带有EXITS(存在)谓词的子查询(带有exits 谓词的子查询不返回任何数据,只产生逻辑值true,false)
- 查询所有选修了1号课程的学生姓名
select Sname from Student where exists (Select * from SC Where Sno=Student.Sno and Cno='1');
- 查询没有选修1号课程的学生姓名
select Sname from Student where not exists (Select * from SC where Sno=Student.Sno and Cno='1');
- 查询选修了全部课程的学生姓名
select Sname from Student where not Exists (select * from Course where
not exists(select * from SC where Sno=Student.Sno and Cno=Course.Cno));
- 查询至少选修了学生201215122选修的全部课程的学生号码
select distinct Sno from SC SCX where not exists (select * from SC SCY where SCY.Sno='201215122' and not exists (select * from SC SCZ where SCZ.Sno=SCX.Sno and SCZ.Cno=SCY.Cno));
集合查询(并操作union,交操作intersect和差操作except)
- 查询计算机科学系的学生及年龄不大于19岁的学生
select * from Student where Sdept ='CS' union select * from Student where Sage<=19;
- 查询选修了课程1或者选修了课程2的学生
select Sno from SC where Cno='1' Union select Sno from SC where Sno='2';
- 查询计算机科学系的学生与年龄不大于19岁的学生的交集
select * from Student where Sdept ='CS' interSect Select * from Student where Sage<=19;
- 查询即选修了课程1又选修了课程2的学生,就是查询选修课程1的学生集合与选修课程2的学生集合的交集
select Sno from SC where Cno='1' intersect select Sno from SC where Cno='2';
- 查询计算机科学系的学生年龄不大于19岁的学生的差集
select * from Student where Sdept ='CS' Except select * from Student where Sage <=19;
网友评论