💝💝💝歡迎來到我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內容和知識,也可以暢所欲言、分享您的想法和見解。
- 推薦:kwan 的首頁,持續學習,不斷總結,共同進步,活到老學到老
- 導航
- 檀越劍指大廠系列:全面總結 java 核心技術,jvm,并發編程 redis,kafka,Spring,微服務等
- 常用開發工具系列:常用的開發工具,IDEA,Mac,Alfred,Git,typora 等
- 數據庫系列:詳細總結了常用數據庫 mysql 技術點,以及工作中遇到的 mysql 問題等
- 新空間代碼工作室:提供各種軟件服務,承接各種畢業設計,畢業論文等
- 懶人運維系列:總結好用的命令,解放雙手不香嗎?能用一個命令完成絕不用兩個操作
- 數據結構與算法系列:總結數據結構和算法,不同類型針對性訓練,提升編程思維,劍指大廠
非常期待和您一起在這個小小的網絡世界里共同探索、學習和成長。💝💝💝 ?? 歡迎訂閱本專欄 ??
博客目錄
- 深入解析 SQL 更新操作:從基礎語法到最佳實踐
- 一、UPDATE 語句基礎解析
- 二、表別名與列引用
- 三、SET 子句詳解
- 四、FROM 子句與多表更新
- 五、WHERE 條件深度分析
深入解析 SQL 更新操作:從基礎語法到最佳實踐
SQL(結構化查詢語言)是數據庫管理的核心工具,而 UPDATE 語句作為其中最常用的操作之一,在數據維護和業務邏輯實現中扮演著關鍵角色。
一、UPDATE 語句基礎解析
我們首先來看這個示例 SQL 語句:
UPDATE table_01 dst
SET tenant_id = src."tenantId", "updatedAt" = CURRENT_TIMESTAMP(3)
FROM table_02 src
WHERE dst.user_id IS NOT NULLAND dst.user_id = src.uidAND dst.tenant_id IS DISTINCT FROM src."tenantId";
這是一個典型的基于多表關聯的更新操作,主要功能是將 table_01 中的 tenant_id 字段更新為 table_02 中對應記錄的"tenantId"值,同時更新修改時間戳。
UPDATE 語句的基本結構包含以下幾個關鍵部分:
- 目標表指定(table_01 dst)
- SET 子句定義要更新的列和新值
- FROM 子句指定數據來源表
- WHERE 子句定義更新條件
這種形式的 UPDATE 語句在 PostgreSQL、SQL Server 等數據庫中常見,但在 MySQL 中語法略有不同,通常使用 JOIN 替代 FROM。
二、表別名與列引用
示例中使用了表別名(dst 和 src),這是 SQL 中提高可讀性的重要技巧。通過為表指定簡短的別名,可以簡化列引用并減少語句長度。例如:
dst.user_id
比完整的table_01.user_id
更加簡潔明了。
值得注意的是,示例中出現了兩種不同風格的列名引用:
- 不加引號的常規標識符(tenant_id, user_id)
- 加引號的特殊標識符(“tenantId”, “updatedAt”)
這種差異通常反映了底層數據庫設計中的命名規范不一致問題。在 SQL 標準中,不加引號的標識符通常不區分大小寫,而加引號的標識符則保留原始大小寫。在實際項目中,建議統一命名風格以避免混淆。
三、SET 子句詳解
SET 子句定義了要更新的列及其新值。本例中有兩個更新操作:
tenant_id = src."tenantId"
:將目標表的 tenant_id 設置為源表的 tenantId 值"updatedAt" = CURRENT_TIMESTAMP(3)
:將 updatedAt 字段設置為當前時間,精確到毫秒(3 位小數)
CURRENT_TIMESTAMP 函數在不同數據庫中的實現略有差異:
- PostgreSQL 和 Oracle 支持精度參數(如(3)表示毫秒)
- MySQL 也支持類似語法,但參數位置略有不同
- SQL Server 使用 GETDATE()或 SYSDATETIME()
在實際應用中,記錄數據的最后修改時間是一種常見的最佳實踐,有助于數據審計和問題追蹤。
四、FROM 子句與多表更新
與傳統單表 UPDATE 不同,本例使用了 FROM 子句引入第二個表(table_02)作為數據來源。這種多表更新語法在以下場景特別有用:
- 根據關聯表的值更新目標表
- 需要從多個表獲取信息來決定更新值
- 批量更新基于復雜條件的記錄
在 MySQL 中,等效操作通常使用 JOIN 語法:
UPDATE table_01 dst
JOIN table_02 src ON dst.user_id = src.uid
SET dst.tenant_id = src."tenantId", dst."updatedAt" = CURRENT_TIMESTAMP(3)
WHERE dst.user_id IS NOT NULLAND dst.tenant_id IS DISTINCT FROM src."tenantId";
五、WHERE 條件深度分析
WHERE 子句是 UPDATE 語句中最關鍵的部分之一,它決定了哪些記錄會被修改。本例中的條件包含三個部分:
dst.user_id IS NOT NULL
:確保只處理 user_id 不為空的記錄dst.user_id = src.uid
:關聯條件,確保只更新匹配的記錄dst.tenant_id IS DISTINCT FROM src."tenantId"
:確保只更新實際需要修改的記錄
第三個條件特別值得關注,它使用了IS DISTINCT FROM
操作符,這是一個比普通不等號(!=或<>)更安全的比較方式,因為它能正確處理 NULL 值:
- 普通比較:NULL = NULL 結果是 NULL(不是 TRUE)
- IS DISTINCT FROM:NULL IS DISTINCT FROM NULL 結果是 FALSE
這種寫法避免了不必要的更新,提高了語句效率,是 SQL 優化的重要技巧。
覺得有用的話點個贊
👍🏻
唄。
??????本人水平有限,如有紕漏,歡迎各位大佬評論批評指正!😄😄😄💘💘💘如果覺得這篇文對你有幫助的話,也請給個點贊、收藏下吧,非常感謝!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且長,行則將至,讓我們一起加油吧!🌙🌙🌙