use Test
查询结果排序 order by
–查询选修了2号课学生的学号和成绩,查询结果按成绩的降序排列
–系统默认排序为升序asc desc为降序
select Sno 学号,Cno 课程号,Grade 成绩
from SC_Grade
where Cno = '2'
order by Grade
–查询学生表的所有信息,系按系统默认排列,年龄按降序排列
select * from Student
order by Sdept, Sage desc
–查询学生表的所有信息,系,年龄按降序排列
select * from Student
order by Sdept desc, Sage desc
–order by 3 desc 表示该表的第三列的属性
select * from Student
order by 4 asc
聚合函数(集函数) count、sum、avg、min、max
–count使用
– count(all|distinct 属性)系统默认属性为all 表示累积 distinct 表示去除重复的
–查询学生总人数
select * from Student
select COUNT(Sno) 总人数 from Student -- 通过学生表中的学号来统计总人数
select COUNT(Sname) 总人数 from Student -- 通过学生表中的姓名来统计总人数
select COUNT(Sage) 总人数 from Student -- 通过学生表中的年龄来统计总人数
select COUNT(*) 总人数 from Student --一般有*就可以统计总人数
select COUNT(distinct Sdept) 总系数 from Student -- 通过学生表中的系来统计总系数 会出现很多重复的选项所以要使用distinct
– 查询选修课程的人数
select COUNT(distinct Cno) 课程人数 from SC_Grade
– 查询选修课为2号课的人数
select Cno,COUNT(Cno) from SC_Grade
group by Cno
having Cno = '2'
– 查询选修了课的学生的人数
select count(distinct Sno) from SC_Grade
–计算2号课的平均成绩
select AVG(Grade) from SC_Grade
where Cno = '2'
– 计算2号课最高分
select Cno 课程号,MAX(Grade)最高分 from SC_Grade
group by Cno
having Cno = '2'
–查询成绩按降序排列,并取第一名
select top 1 Grade from SC_Grade
order by Grade desc
–查询成绩最高的同学有多个人,怎么解决
select rank()over(order by Grade desc) 排名,*
from SC_Grade
–取SC表的前30%
select top 30 percent * from SC_Grade
– 分组 group by
– 统计每个课程号级选课人数
select Cno, COUNT(*) 选课人数 from SC_Grade
group by Cno
–统计男生和女生人数
select Ssex,COUNT(*) 人数 from Student
group by Ssex
–统计每个学生的学号和选课门数
–统计每个学号出现的次数就可以
select Sno,COUNT(*) 选课门数 from SC_Grade
group by Sno
/选择列表中的列 ‘SC_Grade.Cno’ 无效,
因为该列没有包含在聚合函数或 GROUP BY 子句中。/
select Sno,Cno,COUNT(*) from SC_Grade
group by Sno
– 统计每一门课程的考试总分
select Cno,sum(Grade) from SC_Grade
group by Cno
– 筛选选课人数大于2门的人
select Sno, COUNT(*) 选课数量 from SC_Grade
group by Sno
having COUNT(*) >2
having 与where的区别
- where 是对整个表数据做筛选
- having 是对分组的结果做筛选
- 没有group by 就没有 having
- having后面可以接聚合函数 where 不可以
–查找平均分大于70 学生学号
select Sno,avg(Grade)平均分 from SC_Grade
group by Sno
having AVG(Grade) > 70
连接查询 笛卡尔积、连接
–笛卡尔积 行数:行行 列数:列列
–Student.* 这个表的所以列
select Student.*,SC_Grade.*
from Student,SC_Grade
–等值连接:不把重复的属性除去,要求相等的分量
–Student ,SC_Grade 学号相等
select Student.*,SC_Grade.*
from Student,SC_Grade
where Student.Sno = SC_Grade.Sno
–自然连接:一种特殊的等值连接。要求两个关系的公共属性取值相等,连接结果中去掉重复属性
select Student.*,Cno,Grade
from Student,SC_Grade
where Student.Sno = SC_Grade.Sno
– 查询学生的学号姓名课程号成绩
–必须对数据进行等值连接,要不然就是一个笛卡尔积
select Student.Sno,Student.Sname,Cno,Grade
from SC_Grade,Student
where Student.Sno = SC_Grade.Sno
– 查询学生的学号,姓名,课程名和成绩
select Student.Sno,Student.Sname,Course.Cname,Grade
from Student,Course,SC_Grade
where Student.Sno = SC_Grade.Sno and Course.Cno = SC_Grade.Cno
总结:
- 优先级:not and or
- 排序:order by desc/asc
- 分组:group by
- 自然连接等值连接笛卡尔积
- top
- rank()
- having/where区别
- 聚合函数:COUNT,MIN,MAX,SUM,AVG