工作中有很多常用的SQL脚本,今天分几章分享给大家。1.行转列PIVOT(,(),,)(,N,,)(,N,,)(,N,,)(,N,,)(,N,,)(,N,,))(,N,,)(,N,,)*结果:选择ID,名称,[1]作为“第一季度”,[2]作为“第二季度”,[3]作为“第三季度”,[4]as'FourQuarters'fromtestpivot(sum(number)forquarterin([1],[2],[3],[4]))aspvtresult:2.列旋转的用法UNPIOVTcreatetabletest2(idint,名称varchar(20),Q1int,Q2int,Q3int,Q4int)insertintotest2values(1,'apple',1000,2000,4000,5000)insertintotest2values(2,'pear',3000,3500,4200,5500)select*fromtest2(提示:可以左右滑动代码)结果:--columnshiftselectid,name,quarter,numberfromtest2unpivot(numberforquarterin([Q1],[Q2],[Q3],[Q4]))asunpvtresult:3,stringreplacementSUBSTRING/REPLACESELECTREPLACE('abcdefg',SUBSTRING('abcdefg',2,4),'**')结果:SELECTREPLACE('13512345678',SUBSTRING('13512345678',4,11),'********')结果:SELECTREPLACE('12345678@qq.com','1234567','******')结果:4.查询表中是否有相同的记录一个ID可以区分,可以这样写SELECT*FROMHR.Employees的结果:select*fromHR.Employeeswheretitlein(selecttitlefromHR.Employeesgroupbytitlehavingcount(1)>1)Result:Compareand寻找,ID为1和2的被过滤掉了,因为他们只有一条记录。如果可以区分几个ID,可以这样写select*fromHR.Employeeswheretitle+titleofcourtesyin(selecttitle+titleofcourtesyfromHR.Employeesgroupbytitle,titleofcourtesyhavingcount(1)>1)结果:title拼接后与titleofcourtesy,只有ID为6、7、8、9的才符合条件。SELECTid,name,SUM(CASEWHENquarter=1THENnumberELSE0END)'第一季度',SUM(CASEWHENquarter=2THENnumberELSE0END)'第二季度',SUM(CASEWHENquarter=3THENnumberELSE0END)'Thirdquarter',SUM(CASEWHENquarter=4THENnumberELSE0END)'Fourthquarter'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(需要targetTableTable2不存在,因为插入时会自动创建Table2,将Table1中的指定字段数据复制到Table2中。)语法4:使用导入导出功能复制整个表。如果使用【写一个查询来指定要传输的数据】,那么大数据表的复制会有问题吗?因为复制到一定程度后就不动了,内存爆了?它也没有写入表中。而如果直接使用以上三种语法执行,会立即刷新到数据库表中,刷新mdf文件就知道了。7、利用关联子查询的Update语句更新数据——方法一:UpdateTable1setc=(selectcfromTable2wherea=Table1.a)wherecisnull——方法二:updateAsetnewqiantity=B.qiantityfromA,BwhereA.bnum=B.bnum--方法三:update(selectA.bnum,A.newqiantity,B.qiantityfromAleftjoinBonA.bnum=B.bnum)ASCsetC.newqiantity=C.qiantitywhereC.bnum='001'8.连接远程服务器--方法一:select*fromopenrowset('SQLOLEDB','server=192.168.0.1;uid=sa;pwd=password','SELECT*FROMdbo.test')--方法二:select*fromopenrowset('SQLOLEDB','192.168.0.1';'sa';'password','SELECT*FROMdbo.test')当然也可以参考前面的例子为远程连接建立DBLINK9.日期和时间样式CONVERTCONVERT()函数是将日期转换为新数据类型的通用函数。CONVERT()函数可以显示不同格式的日期/时间数据。语法CONVERT(data_type(length),data_to_be_converted,style)data_type(length)指定目标数据类型(长度可选)。data_to_be_converted包含要转换的值。style指定日期/时间输出格式。可用样式值:样式IDStyle格式100或0monddyyyyhh:miAM(或PM)101mm/dd/yy102yy.mm.dd103dd/mm/yy104dd.mm.yy105dd-mm-yy106ddmonyy107Mondd,yy108hh:mm:ss109或9monddyyyyhh:mi:ss:mmmAM(或PM)110mm-dd-yy111yy/mm/dd112yymmdd113或13ddmonyyyyhh:mm:ss:mmm(24h)114hh:mi:ss:mmm(24h)120或20yyyy-mm-ddhh:mi:ss(24h)121或21yyyy-mm-ddhh:mi:ss.mmm(24h)126yyyy-mm-ddThh:mm:ss.mmm(无空格)130ddmonyyyyhh:mi:ss:mmmAM131dd/mm/yyhh:mi:ss:mmmAMSELECTCONVERT(varchar(100),GETDATE(),0)--结果:12720209:33PMSELECTCONVERT(varchar(100),GETDATE(),1)--结果:12/07/20SELECTCONVERT(varchar(100),GETDATE(),2)--结果:20.12.07SELECTCONVERT(varchar(100),GETDATE(),3)--结果:07/12/20SELECTCONVERT(varchar(100),GETDATE(),4)--结果:07.12.20SELECTCONVERT(varchar(100),GETDATE(),5)--结果:07-12-20SELECTCONVERT(varchar(100),GETDATE(),6)--结果:071220SELECTCONVERT(varchar(100),GETDATE(),7)--结果:1207,20SELECTCONVERT(varchar(100),GETDATE(),8)--结果:21:33:18SELECTCONVERT(varchar(100),GETDATE(),9)--结果:12720209:33:18:780PMSELECTCONVERT(varchar(100),GETDATE(),10)--结果:12-07-20SELECTCONVERT(varchar(100),GETDATE(),11)--结果:20/12/07SELECTCONVERT(varchar(100),GETDATE(),12)--结果:201207SELECTCONVERT(varchar(100),GETDATE(),13)--结果:0712202021:33:18:780SELECTCONVERT(varchar(100),GETDATE(),14)--结果:21:33:18:780SELECTCONVERT(varchar(100),GETDATE(),20)--结果:2020-12-0721:33:18SELECTCONVERT(varchar(100),GETDATE(),21)--结果:2020-12-0721:33:18.780SELECTCONVERT(varchar(100),GETDATE(),22)--结果:12/07/209:33:18PMSELECTCONVERT(varchar(100),GETDATE(),23)--结果:2020-12-07SELECTCONVERT(varchar(100),GETDATE(),24)--结果:21:33:18SELECTCONVERT(varchar(100),GETDATE(),25)--结果:2020-12-0721:33:18.780SELECTCONVERT(varchar(100),GETDATE(),100)--结果:12720209:33PMSELECTCONVERT(varchar(100),GETDATE(),101)--结果:12/07/2020SELECTCONVERT(varchar(100),GETDATE(),102)--资源ult:2020.12.07选择转换(varchar(100),GETDATE(),103)--结果:07/12/2020SELECTCONVERT(varchar(100),GETDATE(),104)--结果:07.12.2020SELECTCONVERT(varchar(100),GETDATE(),105)--结果:07-12-2020SELECTCONVERT(varchar(100),GETDATE(),106)--结果:07122020SELECTCONVERT(varchar(100),GETDATE(),107)--结果:1207,2020SELECTCONVERT(varchar(100),GETDATE(),108)--结果:21:33:18SELECTCONVERT(varchar(100),GETDATE(),109)--结果:12720209:33:18:780PMSELECTCONVERT(varchar(100),GETDATE(),110)--结果:12-07-2020SELECTCONVERT(varchar(100),GETDATE(),111)--结果:2020/12/07SELECTCONVERT(varchar(100),GETDATE(),112)--结果:20201207SELECTCONVERT(varchar(100),GETDATE(),113)-??-结果:0712202021:33:18:780SELECTCONVERT(varchar(100),GETDATE(),114)--结果:21:33:18:780SELECTCONVERT(varchar(100),GETDATE(),120)--结果:2020-12-0721:33:18SELECTCONVERT(varchar(100),GETDATE(),121)--结果:2020-12-0721:33:18.780以上内容是工作中比较常用的。能记住的,记不住的最好先存起来,需要的时候再查询。
