结果计算
Select-From-Where语句中,Select子句后面不仅可是列名,而且可是一些计算表达式或聚集函数,表明在投影的同时直接进行一些运算
xxxxxxxxxx
Select 列名 | expr | agfunc(列名字)
From 表名1, 表名2
Where 检索条件;
求有差额(差额>0)的任意两位教师的薪水差额
xxxxxxxxxx
Select T1.Tname, T2.Tname, T1.salary - T2.Salary
From Teacher T1, Teacher T2
Where T1.salary > T2.salary
根据学生年龄求出学生的入学年份:当前是2015
xxxxxxxxxx
Select Student.Snum, Student.Sname, 2015-S.Sage + 1
聚集函数
count:求个数 sum:求和 avg:求平均 max:求最大 min:求最小
eg.求教师的工资总额
xxxxxxxxxx
Select sum(Salary) From Teacher
eg.求数据库课程的平均成绩
xxxxxxxxxx
Select avg(Score) From Course, SC
Where Course = '数据库' and Course.Cnum = Sc.Cnum;
分组查询与分组过滤
分组:SQL可以将检索到的元组按照某一条件进行分类,具有相同条件值的元组划到一个组或一个集合中,同时处理多个组或集合的聚集运算。
Where 后面多一个Group by
分组条件可以是:列名1,列名2
eg.求每一个学生的平均成绩
xxxxxxxxxx
Select Snum, AVG(Score) From SC
Group by Snum;
求每一门课程的平均成绩
xxxxxxxxxx
Select Cnum, AVG(Score) From SC
Group by Cnum;
聚集函数是不允许用于Where子句中的:Where子句是对每一元组进行条件过滤,而不是对集合进行条件过滤;
分组过滤:若要对集合(即分组)进行条件过滤,即满足条件的集合/分组留下,不满足条件的集合/分组剔除。
Having子句,又称分组过滤子句。需要有Groupby子句支持,换句话说,没有Groupby子句,便不能有Having子句
eg.A求不及格课程超过两门的同学的学号
xxxxxxxxxx
Select Snum From SC
Where Score < 60
Group by Snum Having count(*) > 2;
eg.求有十人以上不及格的课程号
xxxxxxxxxx
Select Cnum From SC
Where Score < 60;
Group by Cnum Having count(*) > 10;
eg.求有两门以上不及格课程同学的学号及其平均成绩
xxxxxxxxxx
Select Snum, AVG(Score) From SC
Where Snum in
(
Select Snum From SC
Where Score < 60;
Group by Snum Having count(*) > 2;
)
Group by Snum;
Comments NOTHING