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

这章主要是讲子查询在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.我们能操作的只有子查询中得到的字段,子查询中没有的字段是使用不了的

SQL语句使用04-------子查询_第1张图片

  • 行子查询 :

    一个子查询返回的结果理论上是“一行多列”的时候。此时可以当做一个“行”来使用,通常放在“行比较语法”中。
    形式举例: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);

    //注意!这里比较时,前后的字段数量一定要一致,通俗点讲,前面几个值,后面查询出来的就有几个列

SQL语句使用04-------子查询_第2张图片

  • 列子查询 :

    一个子查询返回的结果理论上是“多行一列”的时候。此时可以当做“多个值”使用,类似这种:(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);
     //与行子查询的区别在于是一行多列还是一列多行
     //子查询的作用很灵活,可以配合各种查询方式进行比对

SQL语句使用04-------子查询_第3张图片

  • 标量子查询:

        一个子查询返回的结果理论上是“一行一列”的时候。此时可以当做“一个值”使用,类似这种: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,所以会查询出所有

这里写图片描述

SQL语句使用04-------子查询_第4张图片

  • 使用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);
    //很好理解,全部满足即可

SQL语句使用04-------子查询_第5张图片

  • 使用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语句使用04-------子查询_第6张图片

总结

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

你可能感兴趣的:(SQL)