实操环境:SQL Server Management Studio 15.0.18369.0

查询所用数据库可在《数据库笔记(七)SQL的查询操作》中查看

一、结果计算

前面的select都是选出列名,但其实还有其他用法:

直接上例子:

例:求有差额(差额>0)的任意两位教师的薪水差额

这里被select的内容是表达式

Select T1.Tname as TR1, T2.Tname as TR2, T1.Salary-T2.Salary
From Teacher T1, Teacher T2
Where T1.Salary > T2.Salary;

注意:不同条目用逗号隔开
输出结果:
输出结果

例: 依据学生年龄求学生的出生年份,当前是2021年

select Sname,2021-Sage as birthday from Student

二、聚集计算

SUM求和:

例:求教师的工资总额

Select Sum(Salary) From Teacher;

例:求计算机系教师的工资总额

Select SUM(Salary)
from Dept, Teacher
where Dept.Dname='计算机' and Teacher.D#=Dept.D#

AVG求平均数

例:求数据库课程的平均成绩

Select AVG(Score)
from Course, SC
where Course.Cname='数据库' and SC.C# = Course.C#

三、分组查询与分组过滤

分组的基本语法:

Select Select 列名 | expr | agfunc(列名) [[, 列名 | expr | agfunc(列名) ] … ]
From 表名1 [, 表名2 … ]
[ Where Where 检索条件 ]
[ Group by Group by 分组条件 ] ;

示例: 求每一个学生的平均成绩

Select S#, AVG(Score) From SC
Group by S#;

示例:求每一门课程的平均成绩

Select C#, AVG(Score) From SC
Group by C#;

示例:求不及格课程超过1门的同学的学号
错误示范:

Select S# From SC
Where Score < 60 and Count(*)>2
Group by S#;

注:Count是用于计数的聚集函数。
错误原因:where语句仅能对元组进行条件过滤。
而这个例子中需要过滤的是一个集合。
这里需要引入Having子句
Having子句,又称分组过滤子句。若要对集合(即分组)进行条件过滤,即满足条件的集合/分组留下,不满足条件的集合/分组剔除。
需要有Groupby子句支持,换句话说,没有Groupby子句,便不能有Having子句。

上面问题的正解:

Select S# From SC
Where Score < 60
Group by S# Having Count(*)>1;

例:求有1人以上不及格的课程号

select C# from SC
WHERE Score < 60
Group by C# Having Count(*)>1;

例:求有一门以上不及格课程同学的学号及其平均成绩

SELECT S#,AVG(Score) from SC
WHERE S# in(SELECT SC1.S# from SC SC1 //筛选出有一门以上不及格课程同学的学号
        WHERE Score < 60
        GROUP BY SC1.S# Having COUNT(*)>1)
GROUP BY S#

(看了课件答案,其实子查询里不起别名也可以)