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

时间:2020-12-18 23:46:19

这章主要是讲子查询在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-------子查询

  • 行子查询 :

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

  • 列子查询 :

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

  • 标量子查询:

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

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

  • 使用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 >1010
select sid,sname from student where 1012 > any(select sid from student where sid >1010);
//第一句我们查询出了四个值
//第二次我们那1012与这四个值比较发现,1012>1011,满足了这个条件,则返回true
//因为返回的是布尔值true,所以会查询出所有

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

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

  • 使用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-------子查询

  • 使用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-------子查询

总结

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