表格是每個關聯式資料庫系統的核心組件之一,SQL Server 也不例外。表格存儲了關聯式資料庫引擎用於查詢、報告和其他操作的數據。在本文中,我將向您展示如何使用 T-SQL INSERT、T-SQL UPDATE、T-SQL DELETE 和 TRUNCATE 修改 SQL Server 表格中的數據。
在我的先前文章中,Essential SQL Server: Creating Databases and Tables,我展示了如何創建基本的 SQL Server 資料庫和表格。在本文中,我們將看看如何通過添加、更新和刪除行來填充這些表格。
I created the following table in my previous article. The syntax from this simple example DDL command shows that the table has three columns and each of them uses a different data type:
CREATE TABLE dbo.myLogins ( id INT NOT NULL PRIMARY KEY, name VARCHAR (20), login_date DATETIME );
在本文中,我們將介紹使用 INSERT 語句向表格添加數據,使用 UPDATE 語句修改表格中的數據,以及使用 DELETE 語句刪除數據。表格中的數據可以通過幾種不同的方式刪除,因此我們還將涵蓋使用 DELETE 語句和 TRUNCATE 語句之間的區別。
使用 T-SQL INSERT 添加行
您可以通過多種方式向 SQL Server 表格添加數據:
- 您可以使用 SQL Server Management Studio(SSMS)的交互式查詢設計工具來添加行到表格
- 您可以使用PowerShell
- 您可以使用SQL Server导入和导出向导或集成服务将数据导入表中
- 您可以使用命令行工具bcp实用程序。
也可以使用SQL INSERT语句将数据添加到SQL Server表中,这是最常见的方法。T-SQL INSERT语句会将一行或多行添加到SQL Server表中。
以下示例显示了如何向您之前看到的示例表中添加一行:
INSERT INTO myLogins (id, name, login_date) VALUES (2, 'John Smith', '3-12-2023')
在這裡,INSERT INTO語句識別將包含插入行的表。接下來,在括號內,您可以看到將要使用的列的列表。此列表使用表中的所有列,但您不一定要這樣做。
最後,VALUES子句提供將插入到表中的實際值。作為一個捷徑,您可以在INSERT語句中省略列列表。例如,以下INSERT語句執行與前一個示例完全相同的功能:
INSERT INTO myLogins VALUES (2, 'John Smith', '3-12-2023')

除非使用NOT NULL關鍵字定義該列,您也可以在INSERT語句的值列表中明確指定NULL。或者,當您不希望為某列指定值時,可以將該列從列和值列表中刪除,這將使其包含NULL值。
從查詢結果中插入表行
除了使用帶有VALUES子句的標準T-SQL INSERT語句外,您還可以通過SQL查詢的結果將行添加到表中。該查詢可以是簡單或復雜的,並且結果可以插入到目標表中。
例如,要從myLogins2表中複製行到myLogins表,您可以使用以下類似下面所示的查詢:
INSERT INTO myLogins (id, name, login_date) SELECT id, name, login_date FROM myLogins2 where id > 50.
此示例使用myLogins2表中子查詢的結果將行插入到myLogins表中。INSERT語句將數據插入到表中的三列中。子查詢使用SELECT語句從名為myLogins2的第二個表中選擇相同的三列。
然而,在此示例中,只有那些id值大于50的行将被返回并添加到myLogins表中。在这个简单的示例中,列名是相同的,但这不是必需的。为了使其工作,您需要在myLogins2表中有一个或多个id值大于50的行,这些行在myLogins表中不存在。
使用T-SQL UPDATE更新行
与向表中添加行类似,您可以以多种方式修改表中的行。SSMS的查询设计器使您能够交互式地更新行,但您也可以使用PowerShell或集成服务。
然而,在数据库表中修改现有行的最常见方法是使用SQL UPDATE语句。 T-SQL UPDATE语句修改SQL Server表中的一个或多个行中的值。
通常,您會希望使用UPDATE語句以及WHERE子句來指定要更新的行。如果您不使用WHERE子句,則表中的所有行都將被更新。以下清單顯示了使用T-SQL UPDATE語句來修改myLogins表中一行值的簡單示例。
UPDATE myLogins SET name = ‘John Smith’ WHERE id = 1
正如我所提到的,如果省略WHERE子句,則每一行的name列都將設置為新值。同樣,如果WHERE子句包含多行,就像使用<或>運算符時一樣,則將更新多個匹配行。
更新查詢結果的表行
就像使用INSERT語句一樣,您也可以使用另一個表中的值來更新一個表中的行。在以下清單中,您可以看到如何從另一個表中使用SQL更新。
UPDATE myLogins SET myLogins.name = myLogins2.name FROM myLogins2 WHERE myLogins.id = myLogins2.id
在這裡,您可以看到UPDATE語句將作用於myLogins表,並且name列將使用myLogins2表中的值進行更新,其中兩個表的id列的值匹配。

你可能已经猜到,使用 UPDATE 语句有更多的选项。你的查询可以更新多行,可以使用更复杂的连接,还可以使用 TOP 子句、ORDER BY 子句、通用表达式(CTEs)等等来构建你的更新查询。
使用 T-SQL DELETE 和 TRUNCATE 删除行
正如你所预期的那样,你可以使用交互式 SSMS 查询设计器、PowerShell 或集成服务从表中删除行。然而,最常见的方法是使用 SQL DELETE 语句。
T-SQL DELETE語句從 SQL Server 表中刪除一個或多個行。毋庸置疑,您應該謹慎使用 SQL DELETE 語句,因為它會永久刪除表中的數據。如果出現錯誤,您可能需要從快照、事務日誌或備份中恢復數據。
以下示例展示了如何從 myLogins 表中刪除一行:
DELETE FROM myLogins WHERE id = 1
在這裡,可以看到將刪除 myLogins 表中 id 列的值等於 1 的一行。您也可以通過更改 WHERE 子句來刪除多行,如下面的語句,該語句刪除所有 id 值大於 50 的行。
DELETE FROM myLogins WHERE id > 50

與 UPDATE 狀態一樣,如果省略 WHERE 子句,則將刪除表中的所有行。例如,以下示例刪除 myLogins 表中的所有行:
DELETE FROM myLogins
從查詢結果中刪除行
與 INSERT 和 UPDATE 語句一樣,DELETE 語句也能夠根據查詢的結果進行操作。以下示例展示了如何根據查詢刪除行:
DELETE FROM myLogins WHERE login_date < '12-31-2022'
在這裡,myLogins 表中 login_date 列中日期早於 12/31/22 的所有行將被刪除。
I’ve been using simple examples throughout this article, but like the INSERT and UPDATE statements, your queries can be much more complex. You could use JOINs and multiple tables in the DELETE statement’s subquery, use clauses like TOP and ORDER BY, and more.
DELETE vs TRUNCATE
T-SQL DELETE 命令能夠從表中刪除一個或多個行。但這並不是從表中刪除行的唯一方法。您可以使用 T-SQL TRUNCATE TABLE 陳述來刪除 SQL Server 表中的所有行。
DELETE 陳述是一個完全記錄的操作。另一方面,TRUNCATE TABLE 陳述是一個最小記錄的操作。這意味著 TRUNCATE 命令將執行得稍微更好,並且將添加到事務日誌中的項目較少。您可以在以下清單中看到使用 TRUNCATE 的示例。
TRUNCATE TABLE myLogins
這將刪除 myLogins 表中的所有數據。
摘要
在本教程中,您學會了如何使用 T-SQL INSERT、UPDATE 和 DELETE 陳述在 SQL Server 表中添加、修改和刪除行。在每種情況下,我解釋了如何處理單行值以及如何處理由子查詢結果產生的多行。此外,您還了解到 DELETE 和 TRUNCATE 陳述的區別,儘管它們都可以基本上從表中刪除行。
相關文章:
Source:
https://petri.com/sql-insert-update-delete-truncate/