如何使用 SQL UPDATE 和 DELETE 語句更新或刪除表數據

来源:https://www.cnblogs.com/vin-c/archive/2022/05/18/16285014.html
-Advertisement-
Play Games

本文介紹如何使用 UPDATE 和 DELETE 語句處理表中的數據,還介紹了為什麼 WHERE 子句對 UPDATE 和 DELETE 語句很重要。 一、更新數據 更新(修改)表中的數據,可以使用 UPDATE 語句。有兩種使用 UPDATE 的方式: 更新表中的特定行; 更新表中的所有行。 下麵 ...


目錄

本文介紹如何使用 UPDATEDELETE 語句處理表中的數據,還介紹了為什麼 WHERE 子句對 UPDATEDELETE 語句很重要。

一、更新數據

更新(修改)表中的數據,可以使用 UPDATE 語句。有兩種使用 UPDATE 的方式:

  • 更新表中的特定行;
  • 更新表中的所有行。

下麵分別介紹。

註意:不要省略 WHERE 子句

在使用 UPDATE 時一定要細心。因為稍不註意,就會更新表中的所有行。使用這條語句前,請完整地閱讀本節。

提示:UPDATE 與安全

在客戶端/伺服器的 DBMS 中,使用 UPDATE 語句可能需要特殊的安全許可權。在你使用 UPDATE 前,應該保證自己有足夠的安全許可權。

使用 UPDATE 語句非常容易,甚至可以說太容易了。基本的 UPDATE 語句由三部分組成,分別是:

  • 要更新的表;
  • 列名和它們的新值;
  • 確定要更新哪些行的過濾條件。

舉一個簡單例子。客戶 1000000005 現在有了電子郵件地址,因此他的記錄需要更新,語句如下:

UPDATE Customers
SET cust_email = '[email protected]'
WHERE cust_id = 1000000005;

UPDATE 語句總是以要更新的表名開始。在這個例子中,要更新的表名為 CustomersSET 命令用來將新值賦給被更新的列。在這裡,SET 子句設置 cust_email 列為指定的值:

SET cust_email = '[email protected]'

UPDATE 語句以 WHERE 子句結束,它告訴 DBMS 更新哪一行。沒有 WHERE 子句,DBMS 將會用這個電子郵件地址更新 Customers 表中的所有行,這不是我們希望的。

更新多個列的語法稍有不同:

UPDATE Customers
SET cust_contact = 'Sam Roberts',
    cust_email = '[email protected]'
WHERE cust_id = 1000000006;

在更新多個列時,只需要使用一條 SET 命令,每個“列=值”對之間用逗號分隔(最後一列之後不用逗號)。在此例子中,更新顧客 1000000006cust_contactcust_email 列。

提示:在 UPDATE 語句中使用子查詢

UPDATE 語句中可以使用子查詢,使得能用 SELECT 語句檢索出的數據更新列數據。關於子查詢及使用的更多內容,請參閱 SQL 如何使用子查詢

提示:FROM 關鍵字

有的 SQL 實現支持在 UPDATE 語句中使用 FROM 子句,用一個表的數據更新另一個表的行。如想知道你的 DBMS 是否支持這個特性,請參閱它的文檔。

要刪除某個列的值,可設置它為 NULL(假如表定義允許 NULL 值)。如下進行:

UPDATE Customers
SET cust_email = NULL
WHERE cust_id = 1000000005;

其中 NULL 用來去除 cust_email 列中的值。這與保存空字元串很不同(空字元串用 '' 表示,是一個值),而 NULL 表示沒有值。

二、刪除數據

從一個表中刪除(去掉)數據,使用 DELETE 語句。有兩種使用 DELETE 的方式:

  • 從表中刪除特定的行;
  • 從表中刪除所有行。

下麵分別介紹。

註意:不要省略 WHERE 子句

在使用 DELETE 時一定要細心。因為稍不註意,就會錯誤地刪除表中所有行。在使用這條語句前,請完整地閱讀本節。

提示:DELETE 與安全

在客戶端/伺服器的 DBMS 中,使用 DELETE 語句可能需要特殊的安全許可權。在你使用 DELETE 前,應該保證自己有足夠的安全許可權。

前面說過,UPDATE 非常容易使用,而 DELETE 更容易使用。

下麵的語句從 Customers 表中刪除一行:

DELETE FROM Customers
WHERE cust_id = 1000000006;

這條語句很容易理解。DELETE FROM 要求指定從中刪除數據的表名,WHERE 子句過濾要刪除的行。

在這個例子中,只刪除顧客 1000000006。如果省略 WHERE 子句,它將刪除表中每個顧客。

提示:友好的外鍵

如何使用 SQL INNER JOIN 聯結兩個或多個表 介紹了聯結,簡單聯結兩個表只需要這兩個表中的公用欄位。

也可以讓 DBMS 通過使用外鍵來嚴格實施關係(這些定義在 學習 SQL 所用到的樣例表腳本 中)。存在外鍵時,DBMS 使用它們實施引用完整性。

例如要向 Products 表中插入一個新產品,DBMS 不允許通過未知的供應商 id 插入它,因為 vend_id 列是作為外鍵連接到 Vendors 表的。

那麼,這與 DELETE 有什麼關係呢?使用外鍵確保引用完整性的一個好處是,DBMS 通常可以防止刪除某個關係需要用到的行。

例如,要從 Products 表中刪除一個產品,而這個產品用在 OrderItems 的已有訂單中,那麼 DELETE 語句將拋出錯誤並中止。

這是總要定義外鍵的另一個理由。

提示:FROM 關鍵字

在某些 SQL 實現中,跟在 DELETE 後的關鍵字 FROM 是可選的。但是即使不需要,也最好提供這個關鍵字。這樣做將保證 SQL 代碼在 DBMS 之間可移植。

DELETE 不需要列名或通配符。DELETE 刪除整行而不是刪除列。要刪除指定的列,請使用 UPDATE 語句。

說明:刪除表的內容而不是表

DELETE 語句從表中刪除行,甚至是刪除表中所有行。但是,DELETE 不刪除表本身。

提示:更快的刪除

如果想從表中刪除所有行,不要使用 DELETE。可使用 TRUNCATE TABLE 語句,它完成相同的工作,而速度更快(因為不記錄數據的變動)。

三、更新和刪除的指導原則

前兩節使用的 UPDATEDELETE 語句都有 WHERE 子句,這樣做的理由很充分。

如果省略了 WHERE 子句,則 UPDATEDELETE 將被應用到表中所有的行。

換句話說,如果執行 UPDATE 而不帶 WHERE 子句,則表中每一行都將用新值更新。類似地,如果執行 DELETE 語句而不帶 WHERE 子句,表的所有數據都將被刪除。

下麵是許多 SQL 程式員使用 UPDATEDELETE 時所遵循的重要原則。

  • 除非確實打算更新和刪除每一行,否則絕對不要使用不帶 WHERE 子句的 UPDATEDELETE 語句。
  • 保證每個表都有主鍵(如果忘記這個內容,請參閱 如何使用 SQL INNER JOIN 聯結兩個或多個表),儘可能像 WHERE 子句那樣使用它(可以指定各主鍵、多個值或值的範圍)。
  • UPDATEDELETE 語句使用 WHERE 子句前,應該先用 SELECT 進行測試,保證它過濾的是正確的記錄,以防編寫的 WHERE 子句不正確。
  • 使用強制實施引用完整性的資料庫(關於這個內容,請參閱 如何使用 SQL INNER JOIN 聯結兩個或多個表),這樣 DBMS 將不允許刪除其數據與其他表相關聯的行。
  • 有的 DBMS 允許資料庫管理員施加約束,防止執行不帶 WHERE 子句的 UPDATEDELETE 語句。如果所採用的 DBMS 支持這個特性,應該使用它。

若是 SQL 沒有撤銷(undo)按鈕,應該非常小心地使用 UPDATEDELETE,否則你會發現自己更新或刪除了錯誤的數據。

四、小結

本文介紹瞭如何使用 UPDATEDELETE 語句處理表中的數據。

我們學習了這些語句的語法,知道了它們可能存在的危險,瞭解了為什麼 WHERE 子句對 UPDATEDELETE 語句很重要,還學習了為保證數據安全而應該遵循的一些指導原則。

原文鏈接:https://www.developerastrid.com/sql/sql-update-delete/

(完)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 基礎 查看powershell版本 PS C:\Users\chino> $PSVersionTable Name Value PSVersion 5.1.22000.653 PSEdition Desktop PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...} ...
  • 為什麼要使用ember.js ​ ember.js是一個JavaScript框架,它大大減少了構建任何web應用程式所需的時間、精力和資源。它專註於讓你,開發人員,通過做所有常見的,重覆的,但重要的,涉及大多數web開發項目的任務,儘可能地提高生產力。 ​ 歷史 Ember.js的原始名稱是Spro ...
  • 管道與重定向的使用 標準輸入的文件描述符為0. 標準輸出的文件描述符為1 錯誤輸出的文件描述符為2 管道 管道:可以讓我們將多條命令連接在一起。 作用:將一個命令的標準輸出重定向給下一個命令,並作為該命令的標準輸入。 (base) [root@localhost ~]# ifconfig ens33 ...
  • 本文例子參考《STM32單片機開發實例——基於Proteus虛擬模擬與HAL/LL庫》 源代碼:https://github.com/LanLinnet/STM33F103R6 項目要求 單片機每隔1秒採集一次溫度值(0~40℃),並通過串口輸出(ASCII格式)。 硬體設計 在第一節的基礎上,在P ...
  • ps命令 ps命令來自於英文片語”process status“的縮寫,其功能是用於顯示當前系統的進程狀態。使用ps命令可以查看到進程的所有信息,例如進程的號碼、發起者、系統資源使用占比(處理器與記憶體)、運行狀態等等。幫助我們及時的發現哪些進程出現”僵死“或”不可中斷“等異常情況。 經常會與kill ...
  • 一、概述 在眾多 Hadoop 版本中, CDH(Cloudera Hadoop) 是 Hadoop 眾多分支中比較出色的版本, 它由Cloudera 發行和維護。CDH 基於 Apache 的 Hadoop 進行重新構建,提供了基於 Web 頁面的群集部署和管理操作。Hadoop發行版除了社區的A ...
  • SpringDataRedis的序列化的一些問題 RedisTemplate可以接收任意Object作為值寫入Redis,但是如果不實現設置序列化器的化預設是採用JDK序列化,序列化後的結果可讀性差並且記憶體占用空間大,如下圖。 自定義RedisTemplate的序列化方式 key和 hashKey採 ...
  • 導讀: 今天和大家分享京東零售OLAP平臺的建設和場景的實踐,主要包括四大部分: 管控面建設 優化技巧 典型業務 大促備戰 -- 01 管控面建設 1. 管控面介紹 管控面可以提供高可靠高效可持續運維保障、快速部署小時交付的能力,尤其是針對ClickHouse這種運維較弱但是性能很高的OLAP核心引 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...