工作中有许多比较常用的SQL脚本,今天开始分几章分享给大家。
1、行转列的用法PIVOT
CREATEtabletest(idint,namenvarchar(20),quarterint,numberint)insertintotestvalues(1,N'苹果',1,1000)insertintotestvalues(1,N'苹果',2,2000)insertintotestvalues(1,N'苹果',3,4000)insertintotestvalues(1,N'苹果',4,5000)insertintotestvalues(2,N'梨子',1,3000)insertintotestvalues(2,N'梨子',2,3500)insertintotestvalues(2,N'梨子',3,4200)insertintotestvalues(2,N'梨子',4,5500)select*fromtest
结果:
selectID,NAME,[1]as'一季度',[2]as'二季度',[3]as'三季度',[4]as'四季度'fromtestpivot(sum(number)forquarterin([1],[2],[3],[4]))aspvt
结果:
2、列转行的用法UNPIOVT
createtabletest2(idint,namevarchar(20),Q1int,Q2int,Q3int,Q4int)insertintotest2values(1,'苹果',1000,2000,4000,5000)insertintotest2values(2,'梨子',3000,3500,4200,5500)select*fromtest2
结果:
--列转行selectid,name,quarter,numberfromtest2unpivot(numberforquarterin([Q1],[Q2],[Q3],[Q4]))asunpvt
结果:
3、字符串替换SUBSTRING/REPLACE
SELECTREPLACE('abcdefg',SUBSTRING('abcdefg',2,4),'**')结果:
SELECTREPLACE('',SUBSTRING('',4,11),'********')结果:
SELECTREPLACE('12345678@','1234567','******')结果:
4、查询一个表内相同纪录HAVING
如果一个ID可以区分的话,可以这么写
SELECT*
结果:
select*((1)1)
结果:
对比一下发现,ID为1,2的被过滤掉了,因为他们只有一条记录
如果几个ID才能区分的话,可以这么写
select*+titleofcourtesyin(selecttitle+,titleofcourtesyhavingcount(1)1)
结果:
title在和titleofcourtesy进行拼接后符合条件的就只有ID为6,7,8,9的了
5、把多行SQL数据变成一条多列数据,即新增列
SELECTid,name,SUM(CASEWHENquarter=1THENnumberELSE0END)'一季度',SUM(CASEWHENquarter=2THENnumberELSE0END)'二季度',SUM(CASEWHENquarter=3THENnumberELSE0END)'三季度',SUM(CASEWHENquarter=4THENnumberELSE0END)'四季度'FROMtestGROUPBYid,name
结果:
我们将原来的4列增加到了6列。细心的朋友可能发现了这个结果和上面的行转列怎么一模一样?其实上面的行转列是省略写法,这种是比较通用的写法。
6、表复制
语法1:InsertINTOtable(field1,field2,)values(value1,value2,)
语法2:InsertintoTable2(field1,field2,)selectvalue1,value2,fromTable1
(要求目标表Table2必须存在,由于目标表Table2已经存在,所以我们除了插入源表Table1的字段外,还可以插入常量。)
语法3:SELECTvale1,value2intoTable2fromTable1
(要求目标表Table2不存在,因为在插入时会自动创建表Table2,并将Table1中指定字段数据复制到Table2中。)
语法4:使用导入导出功能进行全表复制。如果是使用【编写查询以指定要传输的数据】,那么在大数据表的复制就会有问题?因为复制到一定程度就不再动了,内存爆了?它也没有写入到表中。而使用上面3种语法直接执行是会马上刷新到数据库表中的,你刷新一下mdf文件就知道了。
7、利用带关联子查询Update语句更新数据
--方法1:UpdateTable1setc=(selectcfromTable2wherea=)wherecisnull--方法2:updateAsetnewqiantity=,=方法3:update(,,=)=='001'
8、连接远程服务器
--方法1:select*fromopenrowset('SQLOLEDB','server=192.168.0.1;uid=sa;pwd=password','SELECT*')--方法2:select*fromopenrowset('SQLOLEDB','192.168.0.1';'sa';'password','SELECT*')
当然也可以参考以前的示例,建立DBLINK进行远程连接
9、Date和Time样式CONVERT
CONVERT()函数是把日期转换为新数据类型的通用函数。CONVERT()函数可以用不同的格式显示日期/时间数据。
语法
data_type(length)规定目标数据类型(带有可选的长度)。data_to_be_converted含有需要转换的值。style规定日期/时间的输出格式。
可以使用的style值:





