聚集函数
SQL语言提供了五个作用在简单列值几何上的内置聚集函数,分别是COUNT,SUM,AVG,MAX,MIN
5个聚集函数的介绍如下:
聚集函数名 | 参数类型 | 结果类型 | 描述 |
---|---|---|---|
Count | 任意集合 | 一个数值 | 计算几何元素个数 |
sum | 数值集合 | 一个数值 | 计算集合的和 |
avg | 数值集合 | 一个平均值 | 计算集合的平均值 |
max | 字符或数值集合 | 集合中的最大者 | 找出集合中的最大值 |
min | 字符或数值集合 | 集合中的最小者 | 找出集合中的最小值 |
示例
1、 求教师的工资总额
SELECT SUM(Salary) FROM Teacher
2、求数据库课程的平均值
SELECT AVG(Score) FROM Course C, SC
WHERE C.Cname = '数据库' AND C.C# = SC.C#
分组查询
SQL可以将检索到的元组按照某一条件进行分类,具有相同条件值的元组划到一个组或一个集合中,同时处理多个组或集合的聚集运算。
分组 是在WHERE后面加GROUP BY 分组条件
示例
SC表如下:
1、 求每一个学生的平均成绩
SELECT S#, AVG(Score) FROM SC
GROUP BY S#
该语句是按照学号进行分组,学号相同的为一组,再对每一组进行求平均值的操作。
2、 求每一门课程的平均成绩
SELECT C#, AVG(Score) FROM SC
GROUP BY C#
按照课程号进行分组
分组过滤
首先聚集函数不允许在WHERE字句中使用,即不能这么些SELECT * FROM SC WHERE AVG(Grade)>60
这样的写法是错误,因为WHERE子句只能对每一个元组进行条件过滤,操作对象是元组。而聚集函数的操作对象是集合。因此要对集合(即分组)进行过滤需要采用分组过滤的方式。
分组过滤 满足过滤条件的分组留下,不满足的筛去
HAVING子句 又称为分组过滤子句,是作用域GROUP BY之后,没有GROUP BY便没有HAVING子句。
示例
1、求不及格课程超过两门的同学的学号,其中SC(SN 学号, CN 课程号, Teacher 老师)
SELECT SN FROM SC
WHERE Score < 60
GROUP BY SN HAVING COUNT(*)>2
HAVING 子句 与WHERE 子句表达条件的区别
示例
1、 求有两门以上不及格课程同学的学号及其平均成绩,其中SC(SN 学号, CN 课程号, Teacher 老师)
SELECT SN, AVG(Score) FROM SC
WHERE SN IN
(SELECT SN FROM SC
WHERE Score < 60
GROUP BY SN HAVING COUNT(*)>2
)
GROUP BY SN
并-差-交
示例
1、 求学过002好课的同学或学过003好课的同学的学号
SELECT SN FROM SC WHERE CN = '002'
UNION
SELECT SN FROM SC WHERE CN = '003'
2、已知两个表
Customers(CID, Cname, City, Discnt)
Agents(AID, Aname, City, Percent)
求客户所在的城市或者代理商所在的城市
SELECT City FROM Customers
UNION
SELECT City FROM Agents
3、求既学过002号课,又学过003号课的同学学号
SELECT SN FROM SC WHERE CN='002'
INTERSECT
SELECT SN FROM SC WHERE CN='003'
4、假定所有学生都有选课,求没学过002号课程的学生学号
Select DISTINCT SN From SC
EXCEPT
Select SN From SC Where CN = '002'
不用EXCEPT实现
Select DISTINCT SN From SC SC1
Where not exists ( Select * From SC
Where CN = ‘002’ and SN = SC1.SN)
空值的处理
在SQL标准中和许多现流行的DBMS中,空值被用一种特殊的符号Null来
标记,使用特殊的空值检测函数来获得某列的值是否为空值。
空值检测 is [not ] null
测试指定列的值是否为空值
示例
1、 找出年龄值为空的学生姓名
Select Sname From Student
Where Sage is null ;
现行DBMS的空值处理小结
1、除is[not]null之外,空值不满足任何查找条件
2、如果null参与算术运算,则该算术表达式的值为null
3、如果null参与比较运算,则结果可视为false。在SQL-92中可看成unknown
4、如果null参与聚集运算,则除count(*)之外其它聚集函数都忽略null