IN子查询
用处:
- 某一元素是否是另一个集合的成员
- 某一个集合是否包含另一个集合等
- 测试集合是否为空
- 测试集合中是否会出现重复元组
子查询:出现在Where子句中的Select语句被称为子查询(subquery)?,?子查询返回了一个集合,可以通过与这个集合的比较来确定另一个查询集合。
not in子查询
xxxxxxxxxx
表达式 [not] in (子查询)
语法中:表达式的最简形式就是列名或者常数
语义:判断某一表达式的值是否在子查询的结果中
列出张三、王三同学的所有信息
xxxxxxxxxx
Select * From Student
Where Sname in ("张三", "王三");
列出选修了001号课程的学生的学号和姓名
xxxxxxxxxx
Select Snum, Sname From Student
Where Snum in (Select Snum From SC where Cnum = '001');
求既学过001号课程,又学过002号课程的学生的学号
xxxxxxxxxx
Select Snum From SC
Where Cnum = '001' and Snum in (Select Snum From Sc Where Cnum = '002');
列出没学过李明老师讲授课程的所有同学的姓名?
xxxxxxxxxx
Select Snum From Student
Where Snum not in (Select Snum From SC, Course, Teacher Where Teacher.name = '李明' and SC.C=num = Course.Cnum and Teacher.Tnum = Course.Tnum);
- 非相关子查询:内层查询独立进行,没有涉及任何外层查询相关 信息的子查询
- 相关子查询:内层查询需要依靠外层查询的某些参量作为限定条件才能进行的子查询
eg.求学过001号课程的同学的姓名
xxxxxxxxxx
Select Sname From Student
Where Snum in (Select Snum From SC Where Student.Snum = SC.Snum and C# = '001');
theta some / theta all子查询
xxxxxxxxxx
表达式 theta some(子查询)
表达式 theta all(子查询)
语法中:theta是比较运算符:小于大于等。。 语义:将表达式的值与子查询的结果进行比较
- 如果表达式的值至少与子查询结果的某一个值相比较满足关系,则 “表达式 theta some(子查询)”的结果便为真;
- 如果表达式的值与子查询结果的所有值相比较都满足关系,则“表达式 theta all(子查询)”的结果便为真;
eg.找出工资最低的教师姓名
xxxxxxxxxx
Select Tname From Teacher
Where salary <= all(Select salary From Teacher);
eg.找出001号课成绩不是最高的所有学生的学号
xxxxxxxxxx
Select Snum From SC
Where Score < some(Select Score From SC Where C# = '001');
eg.找出所有课程都不及格的学生姓名(相关子查询)
xxxxxxxxxx
Select Sname From Student
Where 60 > all(Select Score From SC Where SC.Snum = Student.Snum);
需要注意的
xxxxxxxxxx
表达式 = some(子查询)
表达式 in (子查询)
上述语句是等价的
xxxxxxxxxx
表达式 not in (子查询)
表达式 <> some (子查询)
上述语句不等价
与not in 等价的是:表达式 <> all (子查询)
EXISTS and NOT EXISTS
基本语法:[not] Exists (子查询) 语义:子查询结果中有无元组存在
示例:检索选修了赵三老师主讲课程的所有同学的姓名
xxxxxxxxxx
Select DISTINCT Sname From Student
Where exists (Select * From SC, Course, Teacher Where SC.Cnum = Course.Cnum and SC.Snum = Student.Snum and Course.Tnum = Teacher.Tnum and Tname = '赵三');
然而 not Exists却可以实现很多功能
eg.检索学过001号教师主讲的所有课程的所有同学的姓名
语义转换:不存在有一门001号老师主讲的课程该同学没学过
xxxxxxxxxx
Select Sname From Student
Where not exists
(Select * From Course
Where Course.Tnum = '001' and not exists
(Select * From SC
Where Snum = Student.Snum and Cnum = Course.Cnum));
Comments NOTHING