数据的排序,分组

时间:2021-06-19 02:42:40
-> 排序order by
-> 如果有where筛选,order总放在后面
•select * from … where … order by …
-> 多列排序(从左至右)
•select * from 表名 order by  字段1 [desc], 字段2 [desc], 字段3[desc]
 先按字段1排序,然后字段2....
 
1 --order by是最后一个执行的,所以可以使用别名代替排序"字段"
2 select *, DATEDIFF(SECOND, StartDateTime, EndDateTime) as callTime from CallRecords order by callTime desc;
1 --输出本月通话总时长最多的前三个呼叫员的编号。
2 select top 3  CallerNumber,SUM ( DATEDIFF(SECOND,StartDateTime,EndDateTime )) as total  from CallRecords where DATEDIFF(MONTH,StartDateTime ,GETDATE())=0 group by CallerNumber  order by  total desc;
1 --输出本月拨打电话次数最多的三个呼叫员的编号
2 select top 3 CallerNumber,COUNT(*) as callCounts from CallRecords where DATEDIFF(MONTH ,StartDateTime,EndDateTime )=0 group by CallerNumber  order by callCounts desc;

 

 
数据的分组
l-> select 语句中可以使用group by 子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息
l-> 按性别分组
•select Sex form T_Student group by Sex
l-> 按班级分组,计算总人数
•select Class, count(*) as 班级总人数 from T_Student group by Class
l-> 筛选班级人数大于3的
•where能使用吗?where是分组前对数据进行筛选
•筛选人数,是将班级分完组后再统计的,这里使用having
•having表示分组后对数据的筛选
•select Class, count(*) as 班级人数 from T_Student group by Class having count(*)>3
l-> 在查询语句中使用了group by子句后,select后只能有聚合函数与分组的字段
l-> 查询列中使用聚合函数后,不允许出现除分组列外的其他列
 
having语句
-> having 是group by的条件对分组后的数据进行筛选(与where类似,都是筛选,只不过having是用来筛选分组后的组的。)
-> 在where中不能使用聚合函数,having中可以用,having要位于group by之后,
-> 查询班级人数超过三个人的班级
•select ClassId,count(FName) from T_Student group by ClassId having count(FName)>3
l-> 注意having中不能使用未参与分组的列,having不能替代where。作用不一样,having是对组进行过滤。
 
1 select 
2 stuName,
3 COUNT(stuName)
4 from
5 Student
6 group by
7 stuName
8 having
9 count(stuName) > 5;