第7讲-SQL语言复杂查询-(NOT) in语句

来源:互联网 发布:红叶知弦与男主本子 编辑:程序博客网 时间:2024/06/07 16:00

有的时候会有以下条件的判断:

      1)某一元素是否是某一集合的成员

      2)集合之间的比较,某一集合是否属于另一集合

      3)测试集合是否为空

      4)判断集合是否有重复的元组

       ......

子查询的定义:出现在where语句的select语句被称为子查询。子查询返回一个集合,可以通过这个集合的比较来确定另一个集合。

(NOT) in 语句:

  语法: 表达式  [NOT] in (子查询)

  语意: 判断某一表达式是否存在子查询中

  例: 查询张三,王三同学的所有信息、

select * From studentwhere  Sname in ('张三',‘王三’);

  上面查询等价于:

select * From studentwhere Sname='张三' or Sname='王三';

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

select S# ,Sname From studentwhere S# in(select S# From SC                       where C#='001');--括号里面的子查询表示学过001号课程的学生的学号集合

例:查询既学过001号课程,又学过002号课程的学生的学号

select  S#  from  SCwhere C#='001' and S# in(select  S#  From  SC                                           where C#='001');--上面语句是求学过001号课所有同学和学过002号课所有同学的交集

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

select Sname From studentwhere  S# not in(select S# From SC,Course C ,Teacher T where T.Tname='李明' and SC.C#=C.C#and T.T#=C.C#);--子查询表示学过李明老师的课的学生学号的集合

非相关子查询概念:内外存查询独立进行,互不影响,没有任何外层查询的相关信心的子查询。

相关子查询的概念:内存查询需要依赖外层查询的某些参数变量或某些限定条件。

例:查询学过001号课程同学的姓名

select Sname From student stuwhere S# in(select S# From SCwhere S#=stu.S# and C#='001');--上面子查询中用到了stu,他是出现在外层查询中

特别注意的是:相关子查询只能由外层像内层传递参数,而不能反之。这也叫做变量的作用于范围。

0 0