服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - 数据库技术 - SQL常用脚本整理,你保存了吗?

SQL常用脚本整理,你保存了吗?

2022-10-13 18:01SQL数据库开发丶平凡世界 数据库技术

​工作中有许多比较常用的SQL脚本,今天开始分几章分享给大家。

工作中有许多比较常用的SQL脚本,今天开始分几章分享给大家。


1、行转列的用法PIVOT

( , (), , ) (,N,,) (,N,,) (,N,,) (,N,,) (,N,,) (,N,,) (,N,,) (,N,,) *

结果:

SQL常用脚本整理,你保存了吗?

select ID,NAME, [1] as '一季度', [2] as '二季度', [3] as '三季度', [4] as '四季度' from test
pivot ( sum(number) for quarter in ([1],[2],[3],[4]) ) as pvt

结果:

SQL常用脚本整理,你保存了吗?


2、列转行的用法UNPIOVT

create table test2 (id int,name varchar(20), Q1 int, Q2 int, Q3 int, Q4 int) insert into test2 values(1,'苹果',1000,2000,4000,5000) insert into test2 values(2,'梨子',3000,3500,4200,5500) select * from test2

(提示:可以左右滑动代码)

结果:

SQL常用脚本整理,你保存了吗?

--列转行 select id,name,quarter,number from test2
unpivot ( number
for quarter in ([Q1],[Q2],[Q3],[Q4]) ) as unpvt

结果:

SQL常用脚本整理,你保存了吗?


3、字符串替换SUBSTRING/REPLACE

SELECT REPLACE('abcdefg',SUBSTRING('abcdefg',2,4),'**')

结果:

SQL常用脚本整理,你保存了吗?

SELECT REPLACE('13512345678',SUBSTRING('13512345678',4,11),'********')

结果:

SQL常用脚本整理,你保存了吗?

SELECT REPLACE('12345678@qq.com','1234567','******')

结果:

SQL常用脚本整理,你保存了吗?


4、查询一个表内相同纪录 HAVING

如果一个ID可以区分的话,可以这么写

SELECT * FROM HR.Employees

结果:

SQL常用脚本整理,你保存了吗?

select * from HR.Employees where title in ( select title from HR.Employees group by title having count(1)>1)

结果:

SQL常用脚本整理,你保存了吗?

对比一下发现,ID为1,2的被过滤掉了,因为他们只有一条记录


如果几个ID才能区分的话,可以这么写

select * from HR.Employees where title+titleofcourtesy in (select title+titleofcourtesy from HR.Employees group by title,titleofcourtesy having count(1)>1)

结果:

SQL常用脚本整理,你保存了吗?

title在和titleofcourtesy进行拼接后符合条件的就只有ID为6,7,8,9的了


5、把多行SQL数据变成一条多列数据,即新增列

SELECT id, name, SUM(CASE WHEN quarter=1 THEN number ELSE 0 END) '一季度', SUM(CASE WHEN quarter=2 THEN number ELSE 0 END) '二季度', SUM(CASE WHEN quarter=3 THEN number ELSE 0 END) '三季度', SUM(CASE WHEN quarter=4 THEN number ELSE 0 END) '四季度' FROM test GROUP BY id,name

结果:

SQL常用脚本整理,你保存了吗?

我们将原来的4列增加到了6列。细心的朋友可能发现了这个结果和上面的行转列怎么一模一样?其实上面的行转列是省略写法,这种是比较通用的写法。


6、表复制

语法1:Insert INTO table(field1,field2,...) values(value1,value2,...)

语法2:Insert into Table2(field1,field2,...) select value1,value2,... from Table1

(要求目标表Table2必须存在,由于目标表Table2已经存在,所以我们除了插入源表Table1的字段外,还可以插入常量。)

语法3:SELECT vale1, value2 into Table2 from Table1

(要求目标表Table2不存在,因为在插入时会自动创建表Table2,并将Table1中指定字段数据复制到Table2中。)

语法4:使用导入导出功能进行全表复制。如果是使用【编写查询以指定要传输的数据】,那么在大数据表的复制就会有问题?因为复制到一定程度就不再动了,内存爆了?它也没有写入到表中。而使用上面3种语法直接执行是会马上刷新到数据库表中的,你刷新一下mdf文件就知道了。


7、利用带关联子查询Update语句更新数据

--方法1: Update Table1 set c = (select c from Table2 where a = Table1.a) where c is null --方法2: update A set newqiantity=B.qiantity from A,B where A.bnum=B.bnum --方法3: update (select A.bnum ,A.newqiantity,B.qiantity from A
left join B on A.bnum=B.bnum) AS C set C.newqiantity = C.qiantity where C.bnum ='001' 


8、连接远程服务器

--方法1: select * from openrowset( 'SQLOLEDB', 'server=192.168.0.1;uid=sa;pwd=password', 'SELECT * FROM dbo.test') --方法2: select * from openrowset( 'SQLOLEDB', '192.168.0.1'; 'sa'; 'password', 'SELECT * FROM dbo.test')

当然也可以参考以前的示例,建立DBLINK进行远程连接


9、Date 和 Time 样式 CONVERT

CONVERT() 函数是把日期转换为新数据类型的通用函数。

CONVERT() 函数可以用不同的格式显示日期/时间数据。

语法

CONVERT(data_type(length),data_to_be_converted,style)

data_type(length) 规定目标数据类型(带有可选的长度)。data_to_be_converted 含有需要转换的值。style 规定日期/时间的输出格式。


可以使用的 style 值:

Style ID

Style 格式

100 或者 0

mon dd yyyy hh:miAM (或者 PM)

101

mm/dd/yy

102

yy.mm.dd

103

dd/mm/yy

104

dd.mm.yy

105

dd-mm-yy

106

dd mon yy

107

Mon dd, yy

108

hh:mm:ss

109 或者 9

mon dd yyyy hh:mi:ss:mmmAM(或者 PM)

110

mm-dd-yy

111

yy/mm/dd

112

yymmdd

113 或者 13

dd mon yyyy hh:mm:ss:mmm(24h)

114

hh:mi:ss:mmm(24h)

120 或者 20

yyyy-mm-dd hh:mi:ss(24h)

121 或者 21

yyyy-mm-dd hh:mi:ss.mmm(24h)

126

yyyy-mm-ddThh:mm:ss.mmm(没有空格)

130

dd mon yyyy hh:mi:ss:mmmAM

131

dd/mm/yy hh:mi:ss:mmmAM

SELECT CONVERT(varchar(100), GETDATE(), 0) --结果: 12 7 2020 9:33PM SELECT CONVERT(varchar(100), GETDATE(), 1) --结果: 12/07/20 SELECT CONVERT(varchar(100), GETDATE(), 2) --结果: 20.12.07 SELECT CONVERT(varchar(100), GETDATE(), 3) --结果: 07/12/20 SELECT CONVERT(varchar(100), GETDATE(), 4) --结果: 07.12.20 SELECT CONVERT(varchar(100), GETDATE(), 5) --结果: 07-12-20 SELECT CONVERT(varchar(100), GETDATE(), 6) --结果: 07 12 20 SELECT CONVERT(varchar(100), GETDATE(), 7) --结果: 12 07, 20 SELECT CONVERT(varchar(100), GETDATE(), 8) --结果: 21:33:18 SELECT CONVERT(varchar(100), GETDATE(), 9) --结果: 12 7 2020 9:33:18:780PM SELECT CONVERT(varchar(100), GETDATE(), 10) --结果: 12-07-20 SELECT CONVERT(varchar(100), GETDATE(), 11) --结果: 20/12/07 SELECT CONVERT(varchar(100), GETDATE(), 12) --结果: 201207 SELECT CONVERT(varchar(100), GETDATE(), 13) --结果: 07 12 2020 21:33:18:780 SELECT CONVERT(varchar(100), GETDATE(), 14) --结果: 21:33:18:780 SELECT CONVERT(varchar(100), GETDATE(), 20) --结果: 2020-12-07 21:33:18 SELECT CONVERT(varchar(100), GETDATE(), 21) --结果: 2020-12-07 21:33:18.780 SELECT CONVERT(varchar(100), GETDATE(), 22) --结果: 12/07/20 9:33:18 PM SELECT CONVERT(varchar(100), GETDATE(), 23) --结果: 2020-12-07 SELECT CONVERT(varchar(100), GETDATE(), 24) --结果: 21:33:18 SELECT CONVERT(varchar(100), GETDATE(), 25) --结果: 2020-12-07 21:33:18.780 SELECT CONVERT(varchar(100), GETDATE(), 100) --结果: 12 7 2020 9:33PM SELECT CONVERT(varchar(100), GETDATE(), 101) --结果: 12/07/2020 SELECT CONVERT(varchar(100), GETDATE(), 102) --结果: 2020.12.07 SELECT CONVERT(varchar(100), GETDATE(), 103) --结果: 07/12/2020 SELECT CONVERT(varchar(100), GETDATE(), 104) --结果: 07.12.2020 SELECT CONVERT(varchar(100), GETDATE(), 105) --结果: 07-12-2020 SELECT CONVERT(varchar(100), GETDATE(), 106) --结果: 07 12 2020 SELECT CONVERT(varchar(100), GETDATE(), 107) --结果: 12 07, 2020 SELECT CONVERT(varchar(100), GETDATE(), 108) --结果: 21:33:18 SELECT CONVERT(varchar(100), GETDATE(), 109) --结果: 12 7 2020 9:33:18:780PM SELECT CONVERT(varchar(100), GETDATE(), 110) --结果: 12-07-2020 SELECT CONVERT(varchar(100), GETDATE(), 111) --结果: 2020/12/07 SELECT CONVERT(varchar(100), GETDATE(), 112) --结果: 20201207 SELECT CONVERT(varchar(100), GETDATE(), 113) --结果: 07 12 2020 21:33:18:780 SELECT CONVERT(varchar(100), GETDATE(), 114) --结果: 21:33:18:780 SELECT CONVERT(varchar(100), GETDATE(), 120) --结果: 2020-12-07 21:33:18 SELECT CONVERT(varchar(100), GETDATE(), 121) --结果: 2020-12-07 21:33:18.780 

以上内容,在工作中比较常用,能记住最好。不能记住就收藏起来,在需要的时候查询即可。

原文地址:https://mp.weixin.qq.com/s/vS78Ewm0NWj4c9sDV7bUfQ

延伸 · 阅读

精彩推荐