SQL语句使用04-------子查询

来源:互联网 发布:欧阳娜娜的琴 知乎 编辑:程序博客网 时间:2024/05/22 08:27

这章主要是讲子查询在SQL查询中的作用。
吐槽 markdown难道不会自动保存??? 一不小心编辑了另外一个,原本编辑的就—-完全没了

(表的基本结构:
Student(Sid,Sname,Sage,Ssex) 学生表
Course(Cid,Cname,Tid) 课程表
SC(Sid,Cid,score) 成绩表
Teacher(Tid,Tname) 教师表
)

1.按查询结果分

  • 表子查询 :

    一个子查询返回的结果理论上是“多行多列”的时候。此时可以当做一个“表”来使用,通常是放在from后面。形式举例:select  X1, X2, ...  from  (表子查询) as  tab1  where  id > 10;
    select * from (select sname,sid from student) as a;    select * from (select sname,sid from student) as a where sage > 60;    //1.我们要为子查询的结果准备一个相应的名称,一般可用as,也可以直接在后面接上名称    //2.此处子查询得到的就是一个表,这个表是我们查询出来的表而不是数据库中存在的表    //3.我们能操作的只有子查询中得到的字段,子查询中没有的字段是使用不了的

这里写图片描述

  • 行子查询 :

    一个子查询返回的结果理论上是“一行多列”的时候。此时可以当做一个“行”来使用,通常放在“行比较语法”中。形式举例:select  X1, X2, ...  from  表1  where  (1010, 42) = (行子查询); 
    select sid,sage from student where (1010, 42) = (select sid,sage from student where sid =1010);    select sage from student where (42) = (select sid,sage from student where sid =1010);    select sid,sage from student where (1010, 42) in (select sid,sage from student where sid >1006);    //注意!这里比较时,前后的字段数量一定要一致,通俗点讲,前面几个值,后面查询出来的就有几个列

这里写图片描述

  • 列子查询 :

    一个子查询返回的结果理论上是“多行一列”的时候。此时可以当做“多个值”使用,类似这种:(5, 17, 8, 22)。形式举例:select  X1, X2, ...  from  表1  where  edu  in  (列子查询);
     select  sid,sname  from  student  where  1010  in  (select sid from student where sid >1000);     //与行子查询的区别在于是一行多列还是一列多行     //子查询的作用很灵活,可以配合各种查询方式进行比对

这里写图片描述

  • 标量子查询:

        一个子查询返回的结果理论上是“一行一列”的时候。此时可以当做“一个值”使用,类似这种:select 5 as c1; 或select ...where a = 17,或select ... where b > 8;    形式举例:select  X1, X2, ...  from  表1  where  age = (标量子查询);      //标量子查询的特点就是只有一个值    //这里就不多说了
  • 小结:

   select  字段或表达式或(子查询)          from  表名 或 (子查询)  as  别名           where  字段  运算符  数据或(子查询)        group  by  xxx        having 字段  运算符  数据或(子查询)

在比较运算符中使用子查询

  • where

    形式:where  字段   比较运算符   (标量子查询);其中,比较运算符有:>   >=   <   <=   =   <>
    select  sid,sname  from  student  where  sid  >  (select sid from student where sid =1010);    //这个比较的返回值是布尔值    //只不过是进行了多次比对,把是true的统一返回

这里写图片描述

  • 使用any的子查询

    形式:where  字段   比较运算符  any  (列子查询);其中,比较运算符有:>   >=   <   <=   =   <>说明:1,其含义是:如果该列子查询所得的数据中,有任何一个满足该比较运算符的条件,就算符合了条件,结果为真(true);
    select  sid,sname  from  student  where  sid  >  any(select sid from student where sid >1010);    //any查询时有个小特点:有任何一个满足该比较运算符的条件,就算符合了条件,结果为真(true);    //这句话的意思是当有一个满足时,全部返回真    我们来比较这两句    select sid from student where sid >1010select  sid,sname  from  student  where  1012  >  any(select sid from student where sid >1010);    //第一句我们查询出了四个值    //第二次我们那1012与这四个值比较发现,1012>1011,满足了这个条件,则返回true    //因为返回的是布尔值true,所以会查询出所有

这里写图片描述

这里写图片描述

  • 使用all的子查询

    形式:where  字段   比较运算符  all  (列子查询);其中,比较运算符有:>   >=   <   <=   =   <>说明:1,其含义是:如果该列子查询所得的数据中,全都满足该比较运算符的条件,才算符合了条件,结果才是真(true);
    select  sid,sname  from  student  where  1012  >  all(select sid from student where sid >1010);    select  sid,sname  from  student  where  1015  >  all(select sid from student where sid >1010);    //很好理解,全部满足即可

这里写图片描述

  • 使用exists的子查询

    形式:where   exists(子查询)说明:1,exists表示的含义是:该子查询的结果如果“有”数据,此时exists就代表“真”;                     该子查询的结果如果“没有”数据,此时exists就代表“假”;                     //用东西就是true

案例:

select  sid,sname  from  student  where  exists(select sid from student where sid >1010);select  sid,sname  from  student  where  exists(select sid from student where sid >1015);

这里写图片描述

总结

子查询在整个SQL语句中使用时是很重要的,很灵活。