-> 排序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;