--=======================================
-- SQL常用内置函数
--=======================================
--判断为null函数
declare @abc varchar(5)
set @abc='mnw'
select isnull(@abc,0); --如果变量abc值为null,则取0,否则取被赋的值
--查找索引函数
select charindex('abc','bac abc fmd abc'); --获取字符串abc在长字符串bac abc fmd abc中的索引位置,索引默认从1开始找
select charindex('abc','bac abc fmd abc',9); --索引从9开始找
--重复获取函数
select replicate('m',3); --按指定次数重复字符表达式,将m字符重复三次
select replicate('abc',2);--将字符串abc重复2次
--大小写转换函数
select len('datazsrt'); --获取字符串长度
select lower('ADRTddd'); --转小写
select upper('data');--转大写
--替换截取函数
select substring('abcdef111',2,3); --截取字符串
select replace('dadt123','t1','AA'); --替换字符串
--类型转换函数
select cast('2015-08-02' as datetime) as 日期类型; --数据类型转换,CAST是ANSI兼容的,而CONVERT则不是
select 'ab'+cast(1 as varchar);-- 将1转化为字符串与ab相加
select convert(datetime,'2015-08-02'); --数据类型转换,与cast相同
select convert(varchar(19),getdate(),113); --不同的是convert还提供一些特别的日期格式转换,而cast没有这个功能
select format(getdate(),'yyyy/mm/dd'); --将日期转化为规定的格式
--数学函数
select round(2.15,1); --四舍五入,第二个参数索引从0开始,即:0表示小数后第一位进行判断
select ceiling(2.158); --向上取整
select floor(2.713); --向下取整
--日期函数
select getdate();
select datepart(mm,'2015-08-04 15:28:26'); --返回日期的某一部分 yy,mm,dd,hh,mi,ss,
select dateadd(dd,-25,'2015-08-04 15:28:26'); --在日期中加上或减去制定的时间间隔,给天数减25天
select datediff(day,'2008-06-05','2008-08-05') as 天数; --返回两个日期之间的天数
--聚合函数
count(),min(),max(),avg(),sum()
--4个排名函数,都可以与over()结合使用
row_number(),rank(),dense_rank(),ntile()
select row_number() over(order by column_name),* from table_name; --按某个字段排名然后查询出所有值,它会为查询出来的每一行记录生成一个序号,依次排序且不会重复
select row_number() over(order by column_name),* from table_name order by column_name desc; --先按某个字段排名给出序号,然后再根据另一个字段进行倒叙排列,排出序号可能会被打乱
select rank() over(order by column_name),* from table_name; --rank函数会考虑到column_name中的值会重复或相同,那个给出的序号也会相同。但生成的序号不是连续的,rank是跳跃排序
select dense_rank() over(order by column_name),* from table_name; --dense_rank函数不同与rank函数,它生成的序号是连续的,dense_rank不会跳跃
--ntile()函数还是比较麻烦的排序分组函数
select ntile(4) over(order by column_name des),* from table_name; --先对column_name进行倒序排列, 参数4表示分为4组,每组中有多少个相同的序号要根据(总记录数/总组数)+1 条
--如果一个表中有6条数据,那么(6/4)+1=2;每组中有两个相同的记录数,末尾的根据情况分配,必须要分4组。但如果是8条数据,能整除,8/4=2;就不需要再加1,每组中平均分两条相同记录数的数据