子查询返回的值不止一个如何处理_从零学会SQL:复杂查询

时间:2024-10-09 07:49:19

一、视图

视图作用:链接数据库与客户;查询时候表中存放的是临时数据,视图可以存放SQL查询语句,避免重复反复输入,降低工作量;

*SQL语句范例:

create view 按性别汇总(性别,人数)

as

select 性别,count(*)

from student

group by 性别

*如何使用

select 性别,人数

from 按性别汇总

练习:

二、子查询:

在一个select 查询语句嵌套了另一个select查询语句(from/in/any/all),可以看成一个临时表

子查询先运行,再运行查询语句。

为什么用子查询而不用分组

*分组结果得到的结果里只会有分组条件,其他会随机匹配。

select 学号,成绩

from score

where 成绩 in (

select min(成绩)

from score

group by 课程号

)

select 列名1

from 表名1

where 列名1 > any(子查询)

*举例:

select 学号,成绩

from score

where 成绩> any

(select 成绩

from score

where 课程号= '0002'

)

注意:

1、all得到的是集合,不能a>3*all(b) 而是a/3>all(b)

2、避免无限嵌套;子查询的as可以省略,但是最好不要省略。

练习:

三、标量子查询

由于where子句不能使用汇总函数,需要采用标量子查询(返回值是单一只)

select 学号,成绩

from score

where 成绩> (

select avg(成绩)

from score

)

练习:

注:这里如果直接用avg(成绩),则只会返回一行;用标量子查询才会返回多行

四、关联子查询

当每个组里进行比较的时候,使用关联子查询

select 学号,课程号,成绩

from score as s1

where 成绩 > (select avg(成绩)

from score as s2

where s1.课程号=s2.课程号 */ 关联条件

group by 课程号

)

练习:

五、如何利用SQL解决业务问题:

SQLZOO答案:

>>反思:这里最关键在于name <= all;字母也可用all语句,小于所有name就等于name里面最"小"的一个