【2017-03-12】SQL Sever 子查询、聚合函数

一、子查询

子查询:
把一条查询语句,当做值来使用
子句的查询结果必须是一列
子句可以返回多行数据,但必须是一列

子句返回的值为一个值的时候:

例如:

我只知道c026这个编号,我要查询比这个车价格低的全部车辆信息
select *from car where price<(select price from car where code='c026')   --先执行括号内返回一个值,再执行外边。此时括号内返回的是一个值的时候

若子句返回的是一列值而不是一个值的时候:

例如:

查询油耗与c016相等的或者与c029相等的或者与c014相等的全部汽车信息

select * from car where oil in(select oil from car where code='c016' or code='c029' or code='c014')

in的用法:

select * from car where oil=7.4 or oil=8 or oil=8.3 与 select *from car where oil in (7.4,8,8.3) 执行结果一模一样

如果想得到油耗除7.4,8,8.3以外的汽车信息: select * from car where oil not in (7.4,8,8.3)

油耗的7到8之间的车的信息(包括7和8)

执行结果一样,但第一种更好一些

any用法: 

油耗大于任意一个数,即为油耗大于其中的最小值即可。如果是油耗小于任意一个数,则为油耗小于最大值即可。

all 用法:

select * from car where oil> all(7.4,8,8.3)

油耗大于所有,则为油耗大于最大值。若是油耗小于所有,则为油耗小于最小值。

从多个表中查询返回到一个表中:

查询所有学生的Sname、Cno和Degree列。

select (select Sname from Student where Student.Sno=Score.Sno),Cno,Degree from Score

--其中Sname在Student表中,Cno和Degree在Score表中,其中两个表有Student.Sno=Score.Sno的连接

--用数据多的表做为主表来查询,其中Score为主表

查询所有学生的Sno、Cname和Degree列。

select Sno,(select Cname from Course where Course.Cno=Score.Cno),Degree from Score

--其中Sno和Degree在Score表中,Cname在Course表中,其中两个表有Course.Cno=Score.Cno的连接

--用数据多的表做为主表来查询,其中Score为主表

二、聚合函数

1、max,min:取最大值,最小值

--查询油耗最小的汽车的信息

select * from car where oil=(select max(oil) from car)

2、avg:取平均值

--查询汽车的平均价格

其中 as 用来起别名

3、count:取总个数

--求一下一共有多少车

 

即为求一下一共多少行

4、sum:求和

--求一下所有车的总价

 

按油耗进行分组,并看一下每组有多少辆车

注意:
--查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。
select AVG(degree) from score where Cno =(select Cno from Score where Cno like '3%' group by Cno having count(*)>=5
在 group by 后面跟筛选条件的话得用 having 代替 where 

原文地址:https://www.cnblogs.com/qq609113043/p/6538434.html