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

changuncle發表於2018-02-10

我不是專業的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 ``` ![這裡寫圖片描述](https://img-blog.csdn.net/20171107173441697?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb3VuY2xl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

除了通過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 ``` 執行截圖如下: ![這裡寫圖片描述](https://img-blog.csdn.net/20171114130459185?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb3VuY2xl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
select *,CHARINDEX(',6661,',','+StoreNO+',',2) as CharIndex from StoreInfo

執行截圖如下:
這裡寫圖片描述

3、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'

截圖如下:
這裡寫圖片描述
如果只想以時分秒為條件進行查詢,不考慮年月日的話,可以使用下面的方法:

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

截圖如下:
這裡寫圖片描述

4、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)截圖如下: ![這裡寫圖片描述](https://img-blog.csdn.net/20171128125238497?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb3VuY2xl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) DATEADD(HOUR,-1,CreateDate)截圖如下: ![這裡寫圖片描述](https://img-blog.csdn.net/20171128125257281?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb3VuY2xl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

5、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())截圖如下:
這裡寫圖片描述

6、欄位值補齊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

在這裡插入圖片描述

7、查詢資料庫中有多少個表/檢視

--查詢使用者表數量
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 = 擴充套件儲存過程

8、待發現

相關文章