mysql 子查询

来源:互联网 发布:叮当在线客服软件 编辑:程序博客网 时间:2024/06/17 01:34
   为什么需要子查询?
               现实中,很多情况需要进行下述条件的判断
              集合成员资格
                        某一元素是否是某一个集合的成员
              集合之间的比较
                       某一个集合是否包含另一个集合等
              集合基数的测试
                        测试集合是否为空
                       测试集合是否存在重复元组

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

    三种类型的子查询:(NOT) IN-子查询;&-Some/ -All子查询;(NOT)EXISTS子查询

                  

     &-Some/ -All子查询

      &是比较运算符: < , > , >= , <= , = , <>

      如果表达式的值至少与子查询结果的某一个值相比较满足&关系,则表达式 & some ( ( 子查询) )” ” 的结果便为真

     如果表达式的值至少与子查询结果的所有结果值相比较满足&关系,则表达式 & all ( ( 子查询) )” ” 的结果便为真

      找出工资最低的教师姓名Select Tname From Teacher Where Salary <= all ( Select Salary From Teacher );

        示例:找出001号课成绩不是最高的所有学生的学号Select S# From SC Where C# = “001” and Score < some ( Select Score From SC Where C# = “001” );

       


       表达式相同  

       1    表达式  = some ( 子查询)  表达式  in ( ( 子查询) )

       2     式 表达式  <> all ( 子查询)          表达式  not in ( ( 子查询) )


        (NOT) EXISTS 子查询

         子查询结果中有无元组存在

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

               Select DISTINCT Sname From Student Where exists ( Select * From SC, Course, Teacher Where SC.C# = Course.C# and SC. S# = Student.S# and Course.T# = Teacher.T# and Tname = ‘ 赵三’ ) ;

        不加not形式的Exists谓词可以不用,比如上面例子就可以直接写成

        Select DISTINCT Sname From Student, SC, Course, Teacher Where SC.C# = Course.C# and SC.S# = Student.S# and Course.T# = Teacher.T# and Tname = ‘ 赵三’ ) ;

          然而notExists却可以实现很多新功能

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

        上述语句的意思:不存在 有一门001 号教师主讲的课程

       


原创粉丝点击