i不知道的SQL語句的積累(sql函式的使用)
阿新 • • 發佈:2021-01-25
- case…when…then
簡單的case函式:
case sex
when '1' then '男'
when '2' then '女'
else '未輸入' end
case搜尋函式:
case
when sex = '1' then '男'
when sex = '2''then '女'
else '未輸入' end;
case...when...then 使用場景:
#有people表如下:
id name sex
1 張三 1
2 李四 1
3 王五
4 小花 2
#1.希望將表中的數字表示方式換成漢字
select id,name,sex,#(此處一定要加,相當於select id,name,sex,sex as 性別 from people;)
(case sex
when '1' then '男'
when '2''then '女'
else '未輸入'
end
)性別
from people;
#查詢結果如下:
id name sex 性別
1 張三 1 男
2 李四 1 男
3 王五 未輸入
4 小花 2 女
#如果想省去sex,語句如下:
select id, name,#(此處一定要加,)
(case sex
when '1' then '男'
when '2''then '女'
else '未輸入'
end
)性別
from people case;
#sum()和case結合實現分段統計
select
sum(case when sex='1' then 1 else 0 end )男,
sum(case when sex='2' then 1 else 0 end )女,
sum(case when sex<>'1' and sex<>'2' then 1 else 0 end )未輸入
from people;
#以下語句同樣效果
select
sum(sex='1')男,
sum(sex='2')女,
sum(sex<>'1' and sex<>'2')未輸入
from people;
結果如下:
- 對null值的忽略
除了count(*),其他的函式基本都會忽略有null值的記錄
count(*),不會忽略null值和重複的記錄
count(表示式)忽略null值記錄
avg()函式忽略null值記錄
sum()忽略null值的記錄
值得注意的是:null和''(空)在sql中是不一樣的,如果開始性別沒輸入,這時候是個null值,
sum(case when sex<>'1' and sex<>'2' then 1 else 0 end )未輸入
語句統計的結果將會為0
改為sum(case when sex is null then 1 else 0 end )未輸入,未輸入才會被統計為1.
當sex列裡面添加了值,之後將值刪除,此時為空
sum(case when sex<>'1' and sex<>'2' then 1 else 0 end )未輸入的統計結果才為1
#count()函式和case也可同樣結合使用
select
count(case when sex='1' then 1 end )男,
count(case when sex='2' then 1 end )女,
count(case when sex<>'1' and sex<>'2' then 1 end )未輸入
from people;
#以下語句效果相同:
select
count( case when sex='1' then 1 else null end)男,
count( case when sex='2' then 1 else null end)女,
count( case when sex<>'1' and sex<>'2' then 1 else null end)未輸入
from people;
注:else後面如果不是null的話,也會參與計算,所以寫成else 0是錯誤的。
- concat
1.concat(str1,str2,str3...)將多個字串連線成一個字串
2.concat_ws()函式,可以指定分隔符
concat_ws(separator, str1, str2, ...)
3.group_concat()函式
將group by產生的同一個分組中的值連線起來,返回一個字串結果。
- foreach(迴圈取值,一般同in結合使用)
<select id="selectProvinceByStoreNumber" parameterType="java.util.List" resultType="cn.smb.web.store.model.StoreEntity">
SELECT
province,
storeNumber
FROM
store
where storeNumber in
<foreach collection="list" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>
collection:傳過來的集合
item:每次迴圈將迴圈出的值放入這個變數中
open:以什麼開始
separator:用什麼分割;
close:以什麼結尾