我不是專業的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'
截圖如下:
如果隻想以時分秒為條件進行查詢,不考慮年月日的話,可以使用下面的方法:
select Information,InformTime,IsRead,CONVERT(nvarchar(12),GETDATE(),114) from Ser_Inform
where CONVERT(nvarchar(12),GETDATE(),114) < CONVERT(nvarchar(12),InformTime,114)
截圖如下:
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)截圖如下:
DATEADD(HOUR,-1,CreateDate)截圖如下:
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表中的初始資料如下:
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中的資料修改成下面這樣: