一、数据分组:group by 只能写在where后面
select age,count(*) from 表名
group by age //根据age相同的数据进行分组,取出每组的个数
二、聚合函数不能出现在where语句中;
Having后面可以跟聚合函数
三、having与where:where是对分组前信息的过滤,其后不可以跟聚合函数;
having是对分组后信息的过滤,其后可以跟聚合函数;能用的列是和select中能用的列是一样的
四、限制结果集行数:top(用于分页)
1)select top 3 * from 表名 order by salary Desc //取出工资最高的前三名(top 3 表示取出前三行的信息)
五、数据的修改
1)alter table 表名 add 字段 类型
//alter table 修改表; add 加
六、消除重复的数据:distinct:它是针对整行字段的;如果删除的是多个字段,那么只删除完全相同的;
如:select distinct age from 表名 //将age中重复的信息删除掉
七、联合结果集:union(将两个数据结果合并,默认将重复的数据删除)
union all 将不会删除重复的数据 //使用union时,一般不要省略all
八、数字函数:
1)ABS();求绝对值
2)(ceiling英文意思为:天花板)ceiling(); 舍入为最大整数(也就是进一法)
3)(floor英文意思为地板)floor();舍入到最小整数;
4)round:(英文意思为:半径;也就是离我最近的数)round();四舍五入;
九、字符串函数:
1)len:计算字符串的长度
2)lower(); //转为小写
3)upper();//转为大写
4)Ltrim();//字符串左侧的空格去掉
5)Rtrim();//字符串右侧的空格去掉
6)substring(string,start_position,length);截取字符串
//string表示被截取的字符串;start_position表示开始的位置;length表示长度
十、日期函数;
1)getdate();获取当前日期时间
2)dateadd(datepart,number,date);计算增加以后的日期
注:datepart为计量单位;number为增量;date为待计算的日期
如:dateadd(month,3,getdate()):表示在当前日期上加三个月;
3)datediff(datepart,startdate,enddate);//计算两个日期之间的差额;
注意:datepart表示计量单位;startdate表示开始日期;enddate表示结束日期;
4)datepart(datepart,date);返回一个日期的特定部分
十一、类型转换函数:cast / convert
1)cast(expression AS date_type); //注:expression表示被转换的表达式; date_type表示被转换的类型
2)convert(date_type,expression);//同上
十二、空值处理函数:isnull
isnull(expression,value);//expression表示被判断的值;value表示:如果expression为空,则它的值就为value;否则为它本身;
十三、case函数(非常重要的函数)
1)第一种用法:单值判断,相当于switch case
case expression
When value1 then returnvalue1
When value2 then returnvalue2
When value3 then returnvalue3
else defaultreturnvalue
end
//注:expression表示需要判断的值;value1表示当它的值等于value1时,则返回returnvalue1;
else否则返回默认的值(defaultvalue)
2)第二种:范围值判断
case
when age<18 then '未成年'
when age>=18 and age<50 then '中年人'
else ‘老年人’
end
十四、全表扫描:对数据进行检索(select)效率最差的是全表扫描;也就是一条条的找;
十五、为了提高检索的速度,可以为经常进行检索的列添加索引,相当于创建目录;、(一般在where后面经常出现的字段,才添加索引)
十六、索引的优缺点:
1)优点:提高查询效率
2)缺点:占据空间,添加、更新、删除数据的时候也需要同步更新索引,所以会降低Insert、Upate、delete的速度;
十七、即使创建了索引,仍然有可能进行全表扫描;比如:like、函数、类型转换
十八、表连接:join on
例子: select name,score from stu_info as a join stu_score as b on a.number=b.number
十九、子查询:将一个查询语句做为一个结果集供其他SQL语句使用;
练习
输出所有数据中通话时间最长的5条记录
select top 5 *
from call_record1
order by datediff(second,StartDateTime,EndDateTime) desc
输出所有数据中拨打长途电话号码(以0开头的)的总时长
select sum(datediff(second,StartDateTime,EndDateTime)) from call_record1
where TelNum like '0%'
输出本月通话总时长最多的前三个呼叫员的编号
select top 3 CallerNumber
from call_record1
where datediff(month,StartDateTime,EndDateTime)=0
group by CallerNumber
order by sum(datediff(second,StartDateTime,EndDateTime)) desc
--输出本月通话次数最多的前三个呼叫员的编号
select top 3 CallerNumber,count(*)
from call_record1
where datediff(month,StartDateTime,EndDateTime)=0
group by CallerNumber
order by count(*) desc
输出所有数据的拨号流水,并且在最后一行添加总时长时长
--市内号码总时长
select '汇总',
convert(varchar(50),sum((case
when TelNum like '0%'
then datediff(second,StartDateTime,EndDateTime)
else 0
end
)))as 长途通话时间,
convert(varchar(50),sum((case
when TelNum not like '0%'
then datediff(second,StartDateTime,EndDateTime)
else 0
end
)))as 市内通话时间
from call_record1
union all
select CallerNumber,TelNum,datediff(second,StartDateTime,EndDateTime) from call_record1
---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------------------