大家好,我是全棧小5,歡迎來到《小5講堂》。
這是《Sql Server》系列文章,每篇文章將以博主理解的角度展開講解。
溫馨提示:博主能力有限,理解水平有限,若有不對之處望指正!
目錄
- 前言
- ISNULL用法
- case when用法
- iif
- 查詢小技巧
- 技巧一
- 技巧二
- 文章推薦
前言
有時候數據庫你接觸多了,就會知道一些技巧,說實在有時候博主沒有接觸到,我可能還是會用普通方式去判斷,這樣就會存在漏數據的情況。
所以,平時去積累一些技巧還是非常有必要的。
ISNULL用法
在 SQL Server 中,ISNULL
函數只接受兩個參數,不支持三個參數的情況。
博主剛開始是這么用的 ISNULL(t11.ItemCode,'Y','N')
,這種寫法是錯誤的。
ISNULL
函數的正確語法是:
ISNULL(check_expression, replacement_value)
case when用法
如果需要實現類似三個參數的功能(當字段為 NULL 時返回 ‘Y’,否則返回 ‘N’),可以使用 CASE WHEN
表達式:
CASE WHEN t11.ItemCode IS NULL THEN 'Y' ELSE 'N' END
iif
或者使用更簡潔的 IIF
函數(SQL Server 2012 及以上版本支持):
IIF(t11.ItemCode IS NULL, 'Y', 'N')
查詢小技巧
技巧一
使用 CONCAT
安全地拼接字符串
問題: 傳統的用加號 +
拼接字符串時,如果任何一個字段為 NULL
,整個結果都會變成 NULL
。
舊方法(有風險):
SELECT FirstName + ' ' + LastName AS FullName
FROM Employees;
-- 如果 FirstName 或 LastName 為 NULL,FullName 就會顯示為 NULL
小技巧(使用 CONCAT
):
SELECT CONCAT(FirstName, ' ', LastName) AS FullName
FROM Employees;
好處:
CONCAT
函數會自動將NULL
值視為空字符串''
來處理。- 即使
FirstName
或LastName
為 NULL,其他部分依然會正常拼接,最終結果不會是 NULL。 - 代碼更簡潔易讀。
技巧二
使用 EXISTS
代替 IN
來檢查存在性
問題: 當使用 IN
子查詢時,數據庫需要先執行整個子查詢,返回所有結果集,然后再進行主查詢和子查詢結果的匹配,如果子查詢結果集很大,性能會較差。
舊方法(可能低效):
SELECT *
FROM Customers
WHERE CustomerID IN (SELECT DISTINCT CustomerID FROM Orders WHERE OrderDate > '2023-01-01'
);
小技巧(使用 EXISTS
):
SELECT *
FROM Customers c
WHERE EXISTS (SELECT 1 FROM Orders o WHERE o.CustomerID = c.CustomerID AND o.OrderDate > '2023-01-01'
);
好處:
- 性能更高:
EXISTS
是一種關聯子查詢,一旦找到一條滿足條件的記錄就會立即返回True
并停止搜索,避免了處理整個子查詢結果集。 - 語義更清晰:
EXISTS
直接表達了“是否存在”的邏輯意圖。 - 在子查詢結果集很大時,性能提升尤為明顯。
這兩個技巧一個側重于數據的可靠性和整潔性,另一個側重于查詢的性能優化,都是日常開發中非常實用的“利器”。
文章推薦
【數據庫】Sql Server數據庫中isnull、iif、case when三種方式的使用和空值判斷
【數據庫】如何使用一款輕量級數據庫SqlSugar進行批量更新,以及查看最終的Sql操作語句
【數據庫】使用Sql Server將分組后指定字段的行數據轉為一個字段顯示,并且以逗號隔開每個值,收藏不迷路
【數據庫】SQL Server 查詢條件小技巧:ISNULL 函數的使用,有請DeepSeek來輔助講解下
【Sql Server】在SQL Server中生成雪花ID(Snowflake ID)
【Sql Server】使用row_number over方式進行表分頁,數據量達到五千多條記錄后,查詢變慢需要20多秒的解決方案
【Sql Server】隨機查詢一條表記錄,并重重溫回顧下自定義函數的封裝和使用
【Sql Server】鎖表如何解鎖,模擬會話事務方式鎖定一個表然后進行解鎖
【Sql Server】通過Sql語句批量處理數據,使用變量且遍歷數據進行邏輯處理
【新星計劃回顧】第六篇學習計劃-通過自定義函數和存儲過程模擬MD5數據
【新星計劃回顧】第四篇學習計劃-自定義函數、存儲過程、隨機值知識點
【Sql Server】Update中的From語句,以及常見更新操作方式
【Sql server】假設有三個字段a,b,c 以a和b分組,如何查詢a和b唯一,但是c不同的記錄
【Sql Server】新手一分鐘看懂在已有表基礎上修改字段默認值和數據類型
總結:溫故而知新,不同階段重溫知識點,會有不一樣的認識和理解,博主將鞏固一遍知識點,并以實踐方式和大家分享,若能有所幫助和收獲,這將是博主最大的創作動力和榮幸。也期待認識更多優秀新老博主。