SQL Server各种函数用法
- 格式:docx
- 大小:270.42 KB
- 文档页数:20
目录1、alter table....add/drop.... 向表中添加、删除列 . (2)2、Truncate 删除表中的所有数据,但不删除表 (2)3、exec sp_rename 修改表名、字段名 (2)4、复制表,只复制表结构,不复制表中数据 (2)5、identity 表中新增列,并自动编号 (3)6、Insert 与update的用法 (3)7、行列转换 Pivot、Unpivot (3)8、自动排序 row_number、rank、dense_rank、partition by (5)9、字符串截取Substring ,left ,right (6)10、Charindex 用法 (7)11、replace替换,len显示长度,lower大写转小写,reverse逆向显示 (7)12、ceiling进1取整,floor减1取整,round保留小数位数 (8)13、convert时间转换(详细显示格式) (8)14、时间函数datediff、dateadd比较 (9)15、时间函数datename、datepart 比较 (10)16、查询重复记录的代码 (10)17、waitfor延迟语句 (10)18、case when 的用法 (11)19、将excel导入到 sql 的方法 (12)以下摘自网络 (17)1、SQL函数大全 (17)2、With...as 用法 (17)3、配置连接服务器 (19)由于时间问题只整理了一部分,希望对需要的人有所帮助!1、alter table….add/drop…. 向表中添加、删除列alter table castingreport--增加列add[packclass]varchar(20),[packer1]varchar(20),[floor]varchar(50) alter table aa drop column[address] --删除一列2、Truncate 删除表中的所有数据,但不删除表TRUNCATE TABLE aa3、exec sp_rename 修改表名、字段名语法: 1、exec sp_rename 原表名,'新表名'2、exec sp_rename '表名.[字段原名]','字段新名','column'--column表示要修改的是列字段名,引号可以不加exec sp_rename pvt,pvexec sp_rename生产,'product' --修改表名exec sp_rename'product.[日期]','time','column' --修改字段名exec sp_rename'aa.vid',id,'column'4、复制表,只复制表结构,不复制表中数据select*into bb from aa where 1<>1select top(0)*into cc from aa5、identity 表中新增列,并自动编号Select identity(int,1,1)as AutoID,*into#tm from teacher order by salarydrop table teacherselect*into teacher from#tmdrop table#tm6、Insert 与update的用法例:insert into aa(age)select emp5from pvtinsert into openquery([10.32.142.235],'select lot,time,para fromtest.dbo.aa')select lot,GETDATE(),null from aupdate aaset name=b.Emp5,age=b.Emp2from pvt as b where aa.VendorID=b.VendorIDupdate courseset teachername=(select name from teachers where id=course.teacherno)update openquery([10.32.142.235],'select lot as lotid,whtime from test.dbo.aa where whtime is null')set whtime=b.time from w_lothistory as b where lotid=b.lot7、行列转换 Pivot、UnpivotPivot (行转列)执行以下语句完成行转列:select*from (select name,course,score from tb)as pvtpivot(max(score)for course in([语文],[数学],[物理]))as aselect a.*from (select lot,time,eqp,substring(para,1,charindex(':',para)-1)aspara,substring(para,charindex(':',para)+1,len(para))as valuefrom aawhere eqp='检测'and time between'2012-2-9'and'2012-2-10')as pvt pivot(max(value)for para in([有效长度(mm)],[崩边(mm)],[晶棒异常]))as a Unpivot (列转行)执行以下语句完成列转行select name,course,score from(select name,chinese,math,physical from bb)as unpvtunpivot(score for course in([chinese],[math],[physical]))as a------select*from (select grade,SUM(score)as score,SUM(age)as age from student group by grade)as unpvtunpivot(value for[type]in([score],[age]))as a8、自动排序 row_number、rank、dense_rank、partition by语法:row_number()over (partition by column1order by column2)dense_rank()over (partition by column1order by column2)rank()over (partition by column1order by column2)区别:row_number()没有重复值的排序(即使两条记录相等也不重复)dense_rank()连续排序,两个第1名接着是第2名rank()跳跃排序,两个第1名接着是第3名-----------partition by column1 --实现组内排序--下面是 [ partition by column1] 示例:select*,ROW_NUMBER()over (partition by name order by score desc)as [row_number]from tb执行后结果--下面是row_number,dense_rank,rank三者区别的示例:执行下面语句后结果如下:(新增列进行排序)select userid,name,salary,row_number()over (order by salary)as[row_number],RANK()over (order by salary)as[rank],DENSE_RANK()over (order by salary)as[dense_rank] from employee9、字符串截取Substring ,left ,right语法:substring(expression,start,length)Left(expression,length)Right(expression,length)示例:1、select SUBSTRING('abcdefg',3,2)as value --返回值:cd select LEFT('abcdefg',2)as value--返回值:abselect RIGHT('abcdefg',2)as value--返回值:fg2、substring | . 新建表如下:use testcreate table func1(id varchar(10),information varchar(50))insert into func1values('1001','My name is you.li')--截取‘you’语句:select id,SUBSTRING(information,CHARINDEX('.',information)-3,3)as surname from func1--返回值: you10、Charindex 用法上面用到CHARINDEX('.',information) 就是判断information字段中是否含有 . ,如果有就返回 . 出现的位置,如果没有则返回0例:select CHARINDEX('g','very good')--返回值为6 (空格占一位)11、replace替换,len显示长度,lower大写转小写,reverse逆向显示select REPLACE('abcdefg','de','123')-- abc123fg,用第三个表达式代替第一个表达式中出现的第二个表达式select LEN('adfasdfaoisdfup')-- 15,显示字符串的长度select LOWER('DFaflkDK')-- dfaflkdk 将字符串中的大写改成小写select reverse('abcd')--dcba,返回字符表达式的逆向表达式12、ceiling进1取整,floor减1取整,round保留小数位数select CEILING(12.358)--进1取整结果:13select FLOOR(12.758)--减1取整结果:12select ROUND(12.226322,2) --保留2位小数结果:12.2313、convert时间转换(详细显示格式)语句:执行结果:SELECT CONVERT(varchar(100),getdate(), 0)--:24 06 2009 21:57PM SELECT CONVERT(varchar(100),getdate(), 1)--: 06/24/09SELECT CONVERT(varchar(100),getdate(), 2)--: 09.06.24SELECT CONVERT(varchar(100),getdate(), 3)--: 24/06/09SELECT CONVERT(varchar(100),getdate(), 4)--: 24.06.09SELECT CONVERT(varchar(100),getdate(), 5)--: 24-06-09SELECT CONVERT(varchar(100),getdate(), 6)--: 24 06 09SELECT CONVERT(varchar(100),getdate(), 7)--: 06 24, 09SELECT CONVERT(varchar(100),getdate(),8)--: 10:57:46SELECT CONVERT(varchar(100),getdate(), 9)--: 06 24 200921:57:46:827AMSELECT CONVERT(varchar(100),getdate(), 10)--: 06-24-09SELECT CONVERT(varchar(100),getdate(), 11)--: 09/06/24SELECT CONVERT(varchar(100),getdate(), 12)--: 090624SELECT CONVERT(varchar(100),getdate(),13)--: 24 06 2009 21:57:46:937 SELECT CONVERT(varchar(100),getdate(), 14)--: 10:57:46:967SELECT CONVERT(varchar(100),getdate(), 20)--: 2009-06-24 21:57:47 SELECT CONVERT(varchar(100),getdate(),21)--: 2009-06-24 21:57:47.157 SELECT CONVERT(varchar(100),getdate(), 22)--: 06/24/09 21:57:47 PM SELECT CONVERT(varchar(100),getdate(), 23)--: 2009-06-24SELECT CONVERT(varchar(100),getdate(), 24)--: 10:57:47SELECT CONVERT(varchar(100),getdate(),25)--: 2009-06-24 21:57:47.250 SELECT CONVERT(varchar(100),cdate, 100)--: 06 24 2009 21:57PM SELECT CONVERT(varchar(100),cdate, 101)--: 06/24/2009SELECT CONVERT(varchar(100),cdate, 102)--: 2009.06.24SELECT CONVERT(varchar(100),cdate, 103)--: 24/06/2009SELECT CONVERT(varchar(100),cdate, 104)--: 24.06.2009SELECT CONVERT(varchar(100),cdate, 105)--: 24-06-2009SELECT CONVERT(varchar(100),cdate, 106)--: 24 06 2009SELECT CONVERT(varchar(100),cdate, 107)--: 06 24, 2009SELECT CONVERT(varchar(100),cdate, 108)--: 10:57:49SELECT CONVERT(varchar(100),cdate,109)--: 06 24 2009 21:57:49:437PM SELECT CONVERT(varchar(100),cdate, 110)--: 06-24-2009SELECT CONVERT(varchar(100),cdate, 111)--: 2009/06/24SELECT CONVERT(varchar(100),cdate, 112)--: 20090624SELECT CONVERT(varchar(100),cdate, 113)--: 24 06 2009 21:57:49:513 SELECT CONVERT(varchar(100),cdate, 114)--: 10:57:49:547SELECT CONVERT(varchar(100),cdate, 120)--: 2009-06-24 21:57:49 14、时间函数datediff、dateadd比较--datediff返回两个日期之间的天数--到年底还有多少周select DATEDIFF(week,GETDATE(),'2012-12-29')select convert(varchar,(DATEDIFF(week,GETDATE(),'2011-12-29')))+'周'--到年底还有多少天select DATEDIFF(DAY,GETDATE(),'2011-12-29')--到年底还有多少小时select DateDiff(hh,getDate(),'2011-12-29')--dateadd日期中添加或减去指定的时间间隔select dateadd(year,2,'2011')--返回:-01-01 00:00:00.000select dateadd(month,2,'2011')--返回:-03-01 00:00:00.000select dateadd(week,2,'2011')--2011-01-15 00:00:00.000select dateadd(weekday,2,'2011')--2011-01-03 00:00:00.000select dateadd(day,2,'2011')--2011-01-03 00:00:00.000--本周第一天select dateadd(day,2-datepart(dw,getdate()),getdate())selectdateadd(day,2-datepart(dw,convert(date,getdate())),convert(date,getdate()))--本周最后一天select dateadd(day,8-datepart(dw,getdate()),getdate())select dateadd(day,8-datepart(dw,cast(getdate()asDATE)),cast(getdate()as DATE))15、时间函数datename、datepart 比较--用于返回日期/时间的单独部分,比如年、月、日、小时、分钟等等-- datename 返回varchar ,datepart 返回int 2012-2-27select datename(week,GETDATE())-- 9select datename(weekday,getdate())-- 星期一select DATENAME(year,getdate())--2012select DATENAME(month,getdate())--02select DATENAME(day,getdate())--27--比较select datepart(week,GETDATE())-- 9select datepart(weekday,getdate())-- 2select DATEPART(year,getdate())--2012select DATEPART(month,getdate())--2select DATEPART(day,getdate())--2716、查询重复记录的代码--查询重复记录:select*from abcd where lot in(select lot from abcd where time between'2010-2-20'and'2012-2-28' group by lot having COUNT(lot)>1 )--删除重复记录,只保留一条:use ddselect distinct*into#t from aadrop table aaselect*into aa from#tdrop table#t17、waitfor延迟语句--等待5秒执行:waitfor delay'00:00:05'use ddselect*from aa--到给定时间执行:waitfor time'10:51:30'use ddselect*from aa18、case when 的用法例:use testselect case when (salary>=1500 and salary<1700)then 1 when salary>=1800 then 2 end as[level],avg(salary)as avgsalary,count(*)as qtyfrom employeegroup by case when (salary>=1500 and salary<1700)then 1 when salary>=1800 then 2 end计算工资等级,执行结果如下:19、将excel导入到 sql 的方法1、先执行:exec sp_configure'show advanced options',1reconfigureexec sp_configure'Ad Hoc Distributed Queries',1reconfigure执行结果:2、然后:--excel 2007 导入SELECT*INTO aa FROM OPENDATASOURCE('Microsoft.Ace.OLEDB.12.0','Data Source=C:\Documents and Settings\you.li\桌面\12345.xls;Extended Properties=Excel 12.0')...[sheet1$]--excel 2003 导入SELECT*INTO aa FROM OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0','Data Source=C:\Documents and Settings\you.li\桌面\12345.xls;Extended Properties=Excel 8.0')...[sheet1$](使用 SQL向导导入更方便灵活)1 .2 选择数据源.3 目标路径.4、编辑映射,导入到目标表之前可以根据需要修改,也可以默认,如下:5、完成以下摘自网络1、SQL函数大全/moss_tan_jun/archive/2010/08/23/1806861.html2、With…as 用法一.WITH AS的含义WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到。