sql04复杂查询

IN子查询

用处:

  • 某一元素是否是另一个集合的成员
  • 某一个集合是否包含另一个集合等
  • 测试集合是否为空
  • 测试集合中是否会出现重复元组

子查询:出现在Where子句中的Select语句被称为子查询(subquery)?,?子查询返回了一个集合,可以通过与这个集合的比较来确定另一个查询集合。

not in子查询

语法中:表达式的最简形式就是列名或者常数

语义:判断某一表达式的值是否在子查询的结果中

列出张三、王三同学的所有信息

列出选修了001号课程的学生的学号和姓名

求既学过001号课程,又学过002号课程的学生的学号

列出没学过李明老师讲授课程的所有同学的姓名?

  • 非相关子查询:内层查询独立进行,没有涉及任何外层查询相关 信息的子查询
  • 相关子查询:内层查询需要依靠外层查询的某些参量作为限定条件才能进行的子查询

eg.求学过001号课程的同学的姓名

theta some / theta all子查询

语法中:theta是比较运算符:小于大于等。。 语义:将表达式的值与子查询的结果进行比较

  • 如果表达式的值至少与子查询结果的某一个值相比较满足关系,则 “表达式 theta some(子查询)”的结果便为真;
  • 如果表达式的值与子查询结果的所有值相比较都满足关系,则“表达式 theta all(子查询)”的结果便为真;

eg.找出工资最低的教师姓名

eg.找出001号课成绩不是最高的所有学生的学号

eg.找出所有课程都不及格的学生姓名(相关子查询)

需要注意的

上述语句是等价的

上述语句不等价

与not in 等价的是:表达式 <> all (子查询)

EXISTS and NOT EXISTS

基本语法:[not] Exists (子查询) 语义:子查询结果中有无元组存在

示例:检索选修了赵三老师主讲课程的所有同学的姓名

然而 not Exists却可以实现很多功能

eg.检索学过001号教师主讲的所有课程的所有同学的姓名

语义转换:不存在有一门001号老师主讲的课程该同学没学过

 


立志做一名攻城狮