SQL刪除語句概述
關於SQL Delete的這篇文章是關於SQL Server中關鍵語句,函式和操作的SQL必備系列的一部分。
要從表中刪除行,請使用delete關鍵字通過資料操作語言(即DML語句)完成。到目前為止,SQL刪除操作是所有DML命令中最簡單的操作。在執行delete命令時,我們不必擔心從表中獲取任何形式的資料,我們不必擔心使用從表中獲取的任何資料。我們只是簡單地告訴資料庫刪除一個特定的記錄,它要麼是,要麼不是。就這麼簡單。
首先,讓我們快速回顧一下SQL刪除語句的樣子。我們需要告訴資料庫和表它應該刪除資料的位置。新增條件子句以設定資料刪除範圍是個好主意。否則,它將刪除表中的所有內容。
讓我們看看我們的表並刪除一些記錄。
如何刪除沒有where子句的行
以下示例從AdventureWorks2014資料庫中的表中刪除Person.Person中的所有行。使用WHERE子句對SQL刪除語句沒有強制實施限制。
使用Adventureworks2014;
走
DELETE FROM [人] [人]。
如何刪除Where子句的行
以下示例從AdventureWorks2014資料庫中的[Person]。[Person]表中刪除行,其中businessEntityID列中的值大於30,000
使用Adventureworks2014;
走
從 [人]中刪除。[人]
WHERE businessEntityID> 30000 ;
注意:可能發生的一個不幸的錯誤是意外地執行沒有Where子句的SQL刪除並且無意中刪除了所有資料。為防止這種情況發生,請考慮使用ApexSQL Complete中的執行保護功能,在執行之前警告這些可能具有破壞性的操作。瞭解更多:執行警報
如何使用Top Where子句刪除行
以下示例從AdventureWorks2014資料庫中的Person.Person表中刪除50個隨機行。BusinessEntityID中的值必須介於30,000和40,000之間。
使用Adventureworks2014;
走
從 [人]中刪除頂部(50)。[人]
WHERE BusinessEntityID 介於 30000 和 40000 之間
注意:TOP(n)子句與SQL Delete語句和任何DML語句(即Select,Insert,Delete和Update)一起使用時,操作是在Top子句中指定的行數的隨機選擇上執行的。
如何刪除重複行
在現實世界中,我們傾向於從不同來源收集資料; 擁有重複記錄並不罕見。解決重複問題的一種方法是首先確定重複發生的位置。並對這些列執行選擇查詢。
EATE TABLE tb_spaceused
(database_name NVARCHAR(128),
database_size VARCHAR(18),
[未分配的空間] VARCHAR(18),
保留 VARCHAR(18),
data VARCHAR(18),
index_size VARCHAR(18),
未使用的 VARCHAR(18)
);
INSERT INTO tb_spaceused
EXEC sp_msforeachdb
@ command1 = “use?exec sp_spaceused @oneresultset = 1” ;
選擇 *
FROM tb_spaceused
按 database_name 排序
以下示例使用PARTITION BY引數對tb_spaceused表的所有列分割槽查詢結果集。Row_Number(),一個視窗函式,這意味著它在有序集上執行。OVER子句中指定的ORDER BY子句按整個列tb_spaceused表對每個分割槽中的行進行排序。
與CTE
AS(選擇 *,
ROW_NUMBER()OVER(PARTITION BY database_name,
database_size,
[未分配的空間],
保留,
資料,
index_size,
沒用過
ORDER BY database_name
)AS Row_Num
FROM tb_spaceused)
選擇 *
來自 CTE
WHERE ROW_NUM <> 1 ;
用Delete替換Select語句將刪除表的所有重複項。
與CTE
AS(選擇 *,
ROW_NUMBER()OVER(PARTITION BY database_name,
database_size,
[未分配的空間],
保留,
資料,
index_size,
沒用過
ORDER BY database_name
)AS Row_Num
FROM tb_spaceused)
- 選擇 *
--FROM CTE
--WHERE Row_Num <> 1;
從 CTE中刪除
WHERE ROW_NUM <> 1 ;
如何使用SQL子查詢刪除行
在以下示例中,將根據另一個表中的資料刪除一個表中的行。在示例中,SalesPersonQuotaHistory表中的行將根據SalesPerson表的SalesYTD列刪除。
DELETE FROM Sales .SalesPersonQuotaHistory
WHERE BusinessEntityID IN
(
SELECT BusinessEntityID
來自銷售.SalesPerson
在哪裡 SalesYTD> 4900000.00
);
走
如何使用SQL連線刪除行
在本節中,我們將使用SQL Delete語句從Adeventureworks2014資料庫中刪除資料。乍看之下刪除資料聽起來很瑣碎,但是一旦我們進入大型資料庫設計,事情可能就不再那麼容易了。
在許多情況下,表通過主鍵和外來鍵關係相關。在以下示例中,我們可以看到使用連線從Sales.SalesPersonQuotaHistory中刪除資料。
DELETE sq
FROM Sales .SalesPersonQuotaHistory sq
INNER JOIN Sales .SalesPerson sp ON sq .BusinessEntityID = sp .BusinessEntityID
WHERE sp .SalesYTD > 4500000.00 ;
走
如何使用連結伺服器和OpenQuery從遠端表中刪除行
以下示例使用SQL delete語句使用名為hqdbt01的連結伺服器從遠端表中刪除行。然後使用四部分物件命名約定查詢遠端表以從遠端表中刪除行。
刪除
FROM [hqdbt01] .AdventureWorks 2014。[人力資源]。[SHIFT]
在哪裡 ShiftID = 2 ;
以下示例通過指定OPENQUERY行集函式和delete命令來查詢遠端表。
刪除 OPENQUERY(hqdbt01,'SELECT *
來自AdventureWorks2014.HumanResources.Department
在哪裡DepartmentID = 18');
如何使用SSMS刪除行
使用SQL Server Management Studio(SSMS),刪除行的圖形使用者介面(GUI)涉及手動搜尋。實際上,使用SQL查詢刪除記錄會更容易,更快捷。
讓我們繼續並找到表以使用SQL刪除語句,在這種情況下,選擇表dbo.cities。現在,右鍵單擊並選擇“ 編輯前200行”。此選項將開啟查詢設計器視窗。接下來,右鍵單擊該視窗並選擇Execute SQL並編寫一個新查詢,該查詢將刪除dbo.cities表中的行。
在結果窗格中,確保SELECT語句在開始刪除行之前提取正確的目標記錄。選擇行並右鍵單擊行,然後選擇“ 刪除”以從表中刪除行。
摘要
到目前為止,我們已經看到許多不同的方法使用SQL delete語句來刪除資料。但是,有一個使用delete語句時要遵循的注意事項列表,如下所示:
在刪除任何內容之前,始終建議先使用SELECT語句,以確保定位正確的記錄。因此,delete語句用於使用where子句從表中刪除行,以僅選擇要刪除的行。
始終使用唯一識別符號來查詢需要刪除的行。
要刪除表中的所有行,請始終使用TRUNCATE TABLE。TRUNCATE TABLE比SQL刪除語句更快,並且它使用更少的系統和事務日誌資源。
預設情況下,DELETE語句會在表上引發獨佔(X)鎖定,並在事務完成之前保持鎖定。
建議在delete語句中指定TABLOCK提示。此過程允許頁面取消分配和相關空間可供資料庫中的其他物件重用。
在執行delete語句之前,最好在堆表上建立聚簇索引。
雖然非常簡單且非常強大,但Delete語句的結果具有破壞性。刪除的行無法輕鬆恢復。
注意:要恢復已刪除的行,請參閱SQL Server災難恢復 - 如何快速恢復因Inadvertent刪除操作而丟失的資料
目前為止就這樣了。希望您喜歡在SQL刪除語句中閱讀本文。如果您有任何疑問,請隨時在下面發表評論。