子查询

在一个select语句中嵌入了另外一个select语句,嵌入的这个select语句就是子查询语句。

子查询是辅助主查询的,充当数据源,或者充当条件。子查询是一条独立的语句,即使单独拿出子查询也是可以正常执行的。

students表中再加一列年龄age,将学生的年龄补充完整,方便下面演示

子查询有四种类型:

  • 第一种子查询返回一行一列的数据,称之为标量子查询

    • 查询学生年龄小于平均年龄的学生信息
    • 子查询语句先查出平均年龄,select avg(age) from students;
select * from students where age < (select avg(age) from students);
  • 第二种子查询返回的是一列多行的数据,称之为列级子查询

    • 查询class表中已经安排学生的班级信息
select * from class where id in (select class_id from students);
注意:上面这里使用in做条件判断

in 符合列子查询里面一个

any | some 任意一个  主查询 where 列 = all(列子查询) : 

all格式: 主查询 where 列 = all(列子查询) : 等于里面所有,主查询 where 列 <> all(列子查询) : 不等于子查询
  • 第三种子查询返回的是一行多列,称之为行级子查询

    • 查询一班同学中年龄最大的同学信息,单独使用子查询这条语句查的结果可以看出结果集是一行多列。嵌套到主查询后将查出一班同学中年龄最大的同学信息。
  • 第四种子查询返回多行多列,称之为表级子查询。

    • 查询学生信息对应班级名称,子查询返回的数据充当数据源,再进行过滤。
select t1.name,t1.class_name from (
    select s.*,c.name as class_name from students as s inner join class as c  on s.class_id =c.id) as t1;
数据库基础 all right reserved,powered by Gitbook文件修订时间: 2018-04-18 10:13:35