首页 >> 商业

9)子查询-当前讯息

2023-05-28 21:21:59 来源:博客园

1、子查询:

如果一个select语句嵌入到一个SQL语句,(select、insert、update、delete等)中,那么该select语句称为 “子查询”,包含子查询的语句称为“主查询”;通常将其写小括号内;

子查询可以用在主查询的where子句、having子句、select子句、from子句;


(相关资料图)

2、where子句中的子查询:

1)子查询返回单值:

例如,我们在choose表中返回低于平均值的信息;

select avg(score) from choose;select student_no,course_no,score from choose    where score < (select avg(score) from choose);

可以看到这儿我们的子查询只是返回了单值;

2)子查询返回多值:

例如,我们查询没有开设课程老师的所有信息;

首先我们新建一个老师信息,让其没有开设课程;若是使用左外连接的话:

insert into teacher values("005","林老师","1110000005");select t.*    from teacher t left join course c     on t.teacher_no = c.teacher_no    where c.teacher_no is null;

我们可以使用子查询得到相同的结果:

select * from teacher    where teacher_no not in (select teacher_no from course);

同样,对于查询没有学生的班级:

select * from classes    where class_no not in (select distinct class_no from student where class_no is not null);

这儿注意我们要将子查询的结果使用 distinct 关键字去重,因为,班级里面有许多学生,导致班级号的结果会重复出现;

其中,子查询的结果如下:

3、from子句中的子查询:

from子句中,select语句可以看成一个是虚拟的内存表,在此基础上进一步筛选;

1)之前写过一个group by子句的例子:得到系统数据库中的表数量;

select table_schema, count(*) cnt     from information_schema.tables    group by table_schema    having cnt > 50;

我们可以写成子查询形式:

select * from    (select table_schema, count(*) cnt from information_schema.tables    group by table_schema) db    where cnt > 50;

可以看到整个 from 子句中,使用select子句作为from的数据表,此处要注意,必须用别名;上述中 的db 就是子查询的结果集 的别名;

这儿不同于之前的where子句,不能用别名,此处 cnt 就是数据表中的字段列表;

2)得到低于自己平均分的课程、成绩:

select c.student_no,c.course_no,c.score,a.avg_score     from (select student_no,avg(score) avg_score from choose     group by student_no) a, choose c    where c.student_no = a.student_no    and c.score < a.avg_score;

在上述中,将子查询得到的结果集作为一个数据表,与另一张表choose 连接;使用where子句内连接的方法,得到低于自己平均分的课程;

标签: