源码先锋

源码先锋

一套简单实用的SQL脚本,总有你需要的

admin 61 119

工作中有许多比较常用的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值: