1须板、case when ?(判斷條件) ?then ? ... ?else ?... end
select ?ID,UserName,namer=(case when score <= '50') then ?'實(shí)習(xí)'
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? when score > '50' and score <= '500' ?then '村衛(wèi)生員'
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? when score > '500' and score <= '1000' ?then '村衛(wèi)生員'
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? when score > '1000' and score <= '1500'? then '鄉(xiāng)衛(wèi)生員'
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??else ?'健康大使' ?end
from table
where ...
2夏醉、ISNULL(check_expression , replacement_value)
參數(shù)一:check_expression
? ? ? ? ? ? ? ?將被檢查是否為 NULL的表達(dá)式匙隔。check_expression 可以是任何類型的疑苫。
參數(shù)二:replacement_value
? ? ? ? ? ? ? ? 在 check_expression 為 NULL時(shí)將返回的表達(dá)式。replacement_value 必須與 check_expresssion 具有相同的類型纷责。
返回類型:
? ? ? ? ? ? ? ? ?返回與 check_expression 相同的類型捍掺。
注釋:
? ? ? ? ? ?如果 check_expression 不為 NULL,那么返回該表達(dá)式的值再膳;否則返回 replacement_value挺勿。
? ? ? ? ? ?例:ISNULL(T.sum, 0)
3、sql語(yǔ)句中用到除運(yùn)算時(shí)喂柒,防止除數(shù)為0和保留兩位小數(shù)點(diǎn)
例如:a / b 但是b有可能是0不瓶,可以將表達(dá)式改為:
? ? ? ? ? ? case when b = 0 then 0 else? a/b ?end
例如:a/b 但是a和b都是整型禾嫉,那么就需要用到decimal進(jìn)行轉(zhuǎn)換
? ? ? ? ? ? case when b<>0 then convert(decimal(6,2))
4、sql語(yǔ)句除運(yùn)算取小數(shù)點(diǎn)后幾位 decimal
例如:
? ? ? ? ? SELECT 10*1.0/4 ? ?結(jié)果為2.500000
? ? ? ? ? 所以蚊丐,如果我們要保留2位小數(shù)的話熙参,語(yǔ)句如下:
? ? ? ? ? SELECT CAST(10*1.0/4 AS DECIMAL(18,2))
5、SELECT 與 SET 區(qū)別:
① SELECT 可以在一條語(yǔ)句里對(duì)多個(gè)變量同時(shí)賦值麦备,而SET只能一次對(duì)一個(gè)變量賦值
? ? ?例如:SELECT @A = 'Y',@B = 'M'
? ? ? ? ? ? ? ? 而SET要達(dá)到同樣的效果尊惰,需要:
? ? ? ? ? ? ? ? SET @A = 'Y'
? ? ? ? ? ? ? ? SET @B = 'M'
②表達(dá)式返回多個(gè)值時(shí),用SET將會(huì)出錯(cuò)泥兰,而SELECT將取最后一個(gè)值
? ? ?例如:假設(shè)Table這個(gè)表中有多個(gè)IsRight記錄
? ? ? ? ? ? ? ? SELECT @A = IsRight ?FROM Table ---- 將取最后一個(gè)值
? ? ? ? ? ? ? ? SET @A = IsRight? FROM Table ---- 將報(bào)錯(cuò)
③表達(dá)式無(wú)返回值弄屡,用SET將置變量值為NULL,用SELECT交保持變量值
? ? 以下假定Table記錄為空
? ? SET @A = '初始值'
? ? SELECT @A = IsRight FROM Table ?---此時(shí)@A為'初始值'
? ? SET @A =(SELECT IsRight FROM Table)--此時(shí)@A為NULL
④使用標(biāo)量子查詢時(shí)鞋诗,如果無(wú)返回值膀捷,SET和SELECT一樣,都將置為NULL
? ? 以下假定Table記錄為空
? ? SET @A = '初始化'
? ? SELECT @A = (SELECT IsRight FROM Table) ---此時(shí)@A為NULL
? ? SET @A ?= (SELECT IsRight FROM Table) ?---此時(shí)@A為NULL
6削彬、不顯示受影響的行數(shù):SET NOCOUNT ON
7全庸、注意一下where語(yǔ)句中,如果涉及到多個(gè)or或者and條件盡量用括號(hào)融痛,不然很容易出現(xiàn)問(wèn)題
8壶笼、當(dāng)某張表使用as 作為代替表名時(shí),可以使用替代表名.*輸出全部表中數(shù)據(jù)
例如:select * from systemInfo as a
? ? ? ? ? ?select a.* .......
9雁刷、RANK()函數(shù):排序覆劈,比如用到學(xué)生成績(jī)排名
如圖1所示的RANK結(jié)果列,有三位同學(xué)是100分的沛励,位于第一名狀態(tài)责语,93分的同學(xué)則是第4名的狀態(tài)
10、DENSE_RANK():
如圖1.而DENSE_RANK()函數(shù)則不同目派,三名100分的同學(xué)還是位于第一名狀態(tài)坤候,93分的同學(xué)位于第2的狀態(tài)
11、ROW_NUMBER():
如圖1.對(duì)所有記錄進(jìn)行依次排序(1企蹭、2白筹、3、4谅摄、5徒河、、螟凭、)
如實(shí)際應(yīng)用中需要進(jìn)行分頁(yè)處理虚青,就會(huì)用到這個(gè)函數(shù)它呀。
例子如下:一頁(yè)顯示20行數(shù)據(jù)
set @sql = @sql + ' select? ROW_NUMBER() OVER ( ORDER BY '
if(@sorts <> '')
begin
set @sql = @sql + ' ave desc, '
end
set @sql = @sql + ' FatDate desc,CreateDate desc ) as no, '
set @sql = @sql + ' ID, TourCode, LinesName, FatDate into 【#tempA】’
//通過(guò)行號(hào)控制螺男,這里只顯示20行
set @sql = @sql + ‘select * top(20)from 【#tempA】where 1=1 ’
if(@rows > 0)
begin
set @sql? = @sql + ‘AND (no >’ + LTRIM(@rows) + ‘)’
end
12棒厘、NTILE():
如圖1 ,對(duì)學(xué)生的成績(jī)進(jìn)行分組下隧,NTILE(常量)奢人,也就是說(shuō)括號(hào)里面的常量是多少, 就分為幾組淆院。
13何乎、關(guān)于try。土辩。支救。catch異常處理
14、一些SQL關(guān)鍵字
SQL CHECK 約束:CHECK 約束用于限制列中的值的范圍拷淘。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 如果對(duì)單個(gè)列定義 CHECK 約束各墨,那么該列只允許特定的值。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 如果對(duì)一個(gè)表定義 CHECK 約束启涯,那么此約束會(huì)在特定的列中對(duì)值進(jìn)行限制贬堵。
SQL DEFAULT 約束:DEFAULT 約束用于向列中插入默認(rèn)值。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 如果沒(méi)有規(guī)定其他的值结洼,那么會(huì)將默認(rèn)值添加到所有的新記錄黎做。
15、COALESE(expression1,expression2,expression3...)
函數(shù)coalesce功能是返回參數(shù)中第一個(gè)非NULL值松忍。
例如:coalese(boss,0) :如果boss為空蒸殿,則返回0;如果boss不為空鸣峭,則返回boss
? ? ? ? ? ?coalese(boss,null,1):如果boss為空伟桅,看下一個(gè)參數(shù)為null,則返回最后一個(gè)參數(shù)1叽掘;如果boss
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?不為空楣铁,則返回boss這個(gè)參數(shù)。
16更扁、decode(name盖腕,'apple',0)
意思是name=apple,那么返回0浓镜;否則的話返回null
17溃列、nvl(bonus,0)
意思是 如果 bonus is null , 那么返回 0膛薛, 否則返回 bonus
18听隐、當(dāng)一個(gè)參數(shù)設(shè)置為可以輸入多個(gè)數(shù)值時(shí),用in語(yǔ)法
例:select ID from table where ID in (‘+ LTRIM(@ID)+’)
有時(shí)也需注意類型轉(zhuǎn)換問(wèn)題哄啄。
19雅任、datediff 日期函數(shù) 最近常用到存儲(chǔ)過(guò)程的開(kāi)始日期和結(jié)束日期參數(shù)
if(@dateS <> ‘’)
begin
set @sql = @sql + ‘AND (DATEDIFF(day风范,‘’‘+@dateS+’’’,FatDay) >=0)’
end
if(@dateE <> ‘’)
begin
set @sql = @sql + ‘AND (DATEDIFF(day,‘’‘+@dateE+’’’,FatDay) <=0)’
end
20沪么、sql語(yǔ)句通過(guò)身份證號(hào)判斷年齡硼婿、性別、所屬省份
1禽车、①年齡:
select YEAR(GETDATE()) - substring('IDCard',7,4) as Age
? ? ?②年齡:(精確到天)
select? datediff( year, '1988-1-18' , getdate())? -? case when datediff ( day, getdate(),? dateadd( year, datediff( year, '1988-1-18', getdate()), '1988-1-18')) >= 0? then? 1? else? 0? end
2寇漫、性別:
case when len(身份證號(hào)) = 15 and cast(substring(身份證號(hào),15,1) as int) % 2 = 0 then '女'
? ? ? ? ?when len(身份證號(hào)) = 15 and cast(substring(身份證號(hào),15,1) as int) % 2 = 1 then '男'
? ? ? ? ?when len(身份證號(hào)) = 18 and cast(substring(身份證號(hào),17,1) as int) % 2 = 0 then '女'
? ? ? ? ?when len(身份證號(hào)) = 18 and cast(substring(身份證號(hào),17,1) as int) % 2 = 1 then '男'
else null end? as Sex
3、所屬省份:
CASE LEFT(`card_id`,2) WHEN 11 THEN '北京' WHEN 12 THEN '天津' WHEN 13 THEN '河北' WHEN 14 THEN '山西' WHEN 15 THEN '內(nèi)蒙古' WHEN 21 THEN '遼寧'
?? ?WHEN 22 THEN '吉林' WHEN 23 THEN '黑龍江' WHEN 31 THEN '上海' WHEN 32 THEN '江蘇' WHEN 33 THEN '浙江' WHEN 34 THEN '安徽' WHEN 35 THEN '福建' WHEN????? 36 THEN '江西'
?? ?WHEN 37 THEN '山東' WHEN 41 THEN '河南' WHEN 42 THEN '湖北' WHEN 43 THEN '湖南' WHEN 44 THEN '廣東' WHEN 45 THEN '廣西' WHEN 46 THEN '海南' WHEN 50 THEN '重慶' WHEN 51 THEN '四川'
?? ?WHEN 52 THEN '貴州' WHEN 53 THEN '云南' WHEN 54 THEN '西藏' WHEN 61 THEN '陜西' WHEN 62 THEN '甘肅' WHEN 63 THEN '青海' WHEN 64 THEN '寧夏' WHEN 65 THEN '新疆' END AS 所屬省份
21殉摔、行號(hào)與頁(yè)數(shù)的寫法
一般寫程序時(shí)會(huì)出現(xiàn)一個(gè)頁(yè)面當(dāng)中只顯示固定多少行州胳,這個(gè)時(shí)候sql語(yǔ)句中就會(huì)出現(xiàn)通過(guò)判斷行號(hào)來(lái)實(shí)現(xiàn)
例如:
圖3即是對(duì)行號(hào)的sql語(yǔ)句實(shí)現(xiàn)。
接下來(lái)說(shuō)說(shuō)頁(yè)數(shù)的實(shí)現(xiàn)方法:
頁(yè)數(shù)則是類似于網(wǎng)頁(yè)上面分頁(yè)功能的實(shí)現(xiàn)逸月。
22陋葡、查詢某條件下的數(shù)據(jù)置頂
select a, b, case b when '申請(qǐng)人' then 0 else 1 end as row?
from table
where 。彻采。腐缤。
order by row,date asc
23肛响、相同ID下岭粤,兩條記錄相減求時(shí)間和
select sum(a.time-b.time)
from(select ElogID,time from 表名 where EventSubType = 1) a,(select data,time from 表名 where EventSubType = 2) b
where a.ElogID=b.ElogID
24、
未完待續(xù)特笋。剃浇。。猎物。