初级进阶版SQL语句总结(1)

我不是专业的DBA,这里记录的都是一些常用的SQL技能点,为的是熟练掌握这些来提高我们的工作效率,如果想系统学习SQL的话,那恐怕要让您失望了。

1、case项作为排序条件
case常常被用来对字段内容进行转换,除此之外还能用作排序条件,这种用法我之前用的不多,记录下来希望对大家有帮助。
select * from Sys_Module where ModuleCode=2589 or ParentCode=2589
order by case ModuleCode when 2595 then 1 else 0 end desc,ModuleCode desc

在这里插入图片描述

除了通过case单列进行排序外,还可以按照多列进行混合排序

select * from Sys_Module where ModuleCode=2589 or ParentCode=2589
order by case when ParentCode=30 then 2 when ModuleCode=2595 then 1 else 0 end desc,ModuleCode desc

在这里插入图片描述

2、CharIndex函数

在一个表达式中搜索另一个表达式,如果找到则返回其起始位置,如果找不到则返回0。

注意:返回的起始位置从 1 开始,而不是从 0 开始。
语法:
CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )
expressionToFind
是字符表达式,其中包含要查找的序列。 expressionToFind限制为 8000 个字符。
expressionToSearch
是要搜索的字符表达式。
start_location
是整数或bigint开始搜索的表达式。 如果start_location未指定、 为负数,或为 0,则从expressionToSearch首字母处开始搜索。

select *,CHARINDEX(',6661,',','+StoreNO+',') as CharIndex from StoreInfo
select *,CHARINDEX(',6661,',','+StoreNO+',',0) as CharIndex from StoreInfo
select *,CHARINDEX(',6661,',','+StoreNO+',',1) as CharIndex from StoreInfo

运行截图如下:
这里写图片描述

select *,CHARINDEX(',6661,',','+StoreNO+',',2) as CharIndex from StoreInfo

运行截图如下:
在这里插入图片描述

3、PATINDEX函数

在这里插入图片描述

4、CONVERT函数

在做查询页的时候,有时会需要查询某天的内容,比如查询2017/11/21这一天的信息,我们可以使用date>2017/11/21 00:00:00 and date<=2017/11/22 00:00:00,我觉得这个有点麻烦想找个一句话就能搞定的方法,就有了下边的知识点。
select Id,UserName,CreateDate,CONVERT(nvarchar(10),CreateDate,120) from Sys_User
where CONVERT(nvarchar(10),CreateDate,120)='2017-11-16'

截图如下:
在这里插入图片描述

select Id,UserName,CreateDate,CONVERT(nvarchar(10),CreateDate,111) from Sys_User
where CONVERT(nvarchar(10),CreateDate,111)='2017/11/16'

截图如下:
[外链图片转存失败(img-2bzwjKCW-1568711331258)(https://img-blog.csdn.net/20171121212753494?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb3VuY2xl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]
如果只想以时分秒为条件进行查询,不考虑年月日的话,可以使用下面的方法:

select Information,InformTime,IsRead,CONVERT(nvarchar(12),GETDATE(),114) from Ser_Inform 
where CONVERT(nvarchar(12),GETDATE(),114) < CONVERT(nvarchar(12),InformTime,114)

截图如下:
[外链图片转存失败(img-qgZtJSMK-1568711331259)(https://img-blog.csdn.net/20180208173251160?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb3VuY2xl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)]

5、DATEADD()

DATEADD() 函数可以在日期中添加或减去指定的时间间隔。
select UserName,UserPwd,Sex,CreateDate,DATEADD(YEAR,1,CreateDate) from Sys_User
select UserName,UserPwd,Sex,CreateDate,DATEADD(MONTH,1,CreateDate) from Sys_User
select UserName,UserPwd,Sex,CreateDate,DATEADD(DAY,1,CreateDate) from Sys_User
select UserName,UserPwd,Sex,CreateDate,DATEADD(HOUR,-1,CreateDate) from Sys_User
select UserName,UserPwd,Sex,CreateDate,DATEADD(MINUTE,-1,CreateDate) from Sys_User
select UserName,UserPwd,Sex,CreateDate,DATEADD(SECOND,-1,CreateDate) from Sys_User

DATEADD(YEAR,1,CreateDate)截图如下:
[外链图片转存失败(img-ybWGk9tl-1568711331259)(https://img-blog.csdn.net/20171128125238497?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb3VuY2xl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]
DATEADD(HOUR,-1,CreateDate)截图如下:
[外链图片转存失败(img-xSKrThmF-1568711331259)(https://img-blog.csdn.net/20171128125257281?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb3VuY2xl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]

6、DATEDIFF()

DATEDIFF() 函数返回两个日期之间的时间差。 语法:DATEDIFF(datepart,startdate,enddate) 时间差:enddate-startdate
select UserName,UserPwd,Sex,CreateDate,DATEDIFF(YEAR,CreateDate,GETDATE()) from Sys_User
select UserName,UserPwd,Sex,CreateDate,DATEDIFF(MONTH,CreateDate,GETDATE()) from Sys_User
select UserName,UserPwd,Sex,CreateDate,DATEDIFF(DAY,CreateDate,GETDATE()) from Sys_User
select UserName,UserPwd,Sex,CreateDate,DATEDIFF(HOUR,CreateDate,GETDATE()) from Sys_User
select UserName,UserPwd,Sex,CreateDate,DATEDIFF(MINUTE,CreateDate,GETDATE()) from Sys_User
select UserName,UserPwd,Sex,CreateDate,DATEDIFF(SECOND,CreateDate,GETDATE()) from Sys_User

DATEDIFF(DAY,CreateDate,GETDATE())截图如下:
这里写图片描述
DATEDIFF(HOUR,CreateDate,GETDATE())截图如下:
在这里插入图片描述

7、字段值补齐8位

--虽然想补齐到8位,但最多能补3个'0'(right表示从右边开始截取)
select top 5 Id, right(replicate('0',3)+ltrim(Name),8),Phone from Sys_User

在这里插入图片描述

--虽然最多能补10个'0',但只需补齐到8位(right表示从右边开始截取)
select top 5 Id, right(replicate('0',10)+ltrim(Name),8),Phone from Sys_User

在这里插入图片描述

8、查询数据库中有多少个表/视图

--查询用户表数量
select count(1) from sysobjects where xtype='U'
--查询用户视图数量
select count(1) from sysobjects where xtype='V'
--查询用户存储过程数量
select count(1) from sysobjects where xtype='P'

sysobjects表中xtype列各字段的意思:
C = CHECK 约束
D = 默认值或 DEFAULT 约束
F = FOREIGN KEY 约束
L = 日志
FN = 标量函数
IF = 内嵌表函数
PK = PRIMARY KEY 约束(类型是 K)
UQ = UNIQUE 约束(类型是 K)
RF = 复制筛选存储过程
TF = 表函数
TR = 触发器
S = 系统表
U = 用户表
V = 视图
P = 存储过程
X = 扩展存储过程

9、update...join的用法

我们常用的单表更新语句是update...where,如果需要多表关联进行更新的话就用到update...join了,本例所用的Sys_User表、Sys_Dict表中的初始数据如下:

在这里插入图片描述

bbb

update Sys_User set Password='update' from Sys_User as t1
inner join Sys_Dict as t2 on t1.DictCode=t2.DictCode
where t1.Id>1

Sql语句执行后Sys_User中的数据修改成下面这样:
在这里插入图片描述

10、stuff()的用法

在这里插入图片描述
在这里插入图片描述

11、index+nolock

在这里插入图片描述

12、处理特殊字符

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

13、不加括号时SqlServer中and和or的执行顺序

在这里插入图片描述

14、游标的简单使用

--创建一个游标
declare my_cursor cursor for     --my_cursor为游标的名称,随便起
select id,name from my_user      --这是游标my_cursor的值,这里随便发挥看业务场景
--打开游标
open my_cursor                  --没什么好说的
--变量
declare   @id int               --声明变量  ‘declare’为声明变量 ‘@name’为变量名称 后面为变量类型
declare   @name varchar(50)     --这里是两个变量用来接收游标的值
--循环游标
fetch next from my_cursor into @id,@name  --获取my_cursor的下一条数据,其中为两个字段分别赋值给@id,@name
while @@FETCH_STATUS=0 --假如检索到了数据继续执行
begin
print(@name) --print()打印变量 随便发挥
select * from my_user where id=@id --这里是具体业务了,随便发挥。而我这是又执行了一次查询 
fetch next from my_cursor into @id,@name --获取下一条数据并赋值给变量
end--关闭释放游标
close my_cursor
deallocate my_cursor

15、待发现

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

changuncle

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值