天天看點

初級進階版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
           
初級進階版SQL語句總結(1)

除了通過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
           
初級進階版SQL語句總結(1)

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
           

運作截圖如下:

初級進階版SQL語句總結(1)
select *,CHARINDEX(',6661,',','+StoreNO+',',2) as CharIndex from StoreInfo
           

運作截圖如下:

初級進階版SQL語句總結(1)

3、PATINDEX函數

初級進階版SQL語句總結(1)

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'
           

截圖如下:

初級進階版SQL語句總結(1)
select Id,UserName,CreateDate,CONVERT(nvarchar(10),CreateDate,111) from Sys_User
where CONVERT(nvarchar(10),CreateDate,111)='2017/11/16'
           

截圖如下:

初級進階版SQL語句總結(1)

如果隻想以時分秒為條件進行查詢,不考慮年月日的話,可以使用下面的方法:

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

截圖如下:

初級進階版SQL語句總結(1)

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)截圖如下:

初級進階版SQL語句總結(1)

DATEADD(HOUR,-1,CreateDate)截圖如下:

初級進階版SQL語句總結(1)

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())截圖如下:

初級進階版SQL語句總結(1)

DATEDIFF(HOUR,CreateDate,GETDATE())截圖如下:

初級進階版SQL語句總結(1)

7、字段值補齊8位

--雖然想補齊到8位,但最多能補3個'0'(right表示從右邊開始截取)
select top 5 Id, right(replicate('0',3)+ltrim(Name),8),Phone from Sys_User
           
初級進階版SQL語句總結(1)
--雖然最多能補10個'0',但隻需補齊到8位(right表示從右邊開始截取)
select top 5 Id, right(replicate('0',10)+ltrim(Name),8),Phone from Sys_User
           
初級進階版SQL語句總結(1)

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表中的初始資料如下:

初級進階版SQL語句總結(1)
初級進階版SQL語句總結(1)
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中的資料修改成下面這樣:

初級進階版SQL語句總結(1)

10、stuff()的用法

初級進階版SQL語句總結(1)
初級進階版SQL語句總結(1)

11、index+nolock

初級進階版SQL語句總結(1)

12、處理特殊字元

初級進階版SQL語句總結(1)
初級進階版SQL語句總結(1)
初級進階版SQL語句總結(1)

13、待發現