1. 程式人生 > >SQL刪除語句概述

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語句時要遵循的注意事項列表,如下所示:

  1. 在刪除任何內容之前,始終建議先使用SELECT語句,以確保定位正確的記錄。因此,delete語句用於使用where子句從表中刪除行,以僅選擇要刪除的行。

  2. 始終使用唯一識別符號來查詢需要刪除的行。

  3. 要刪除表中的所有行,請始終使用TRUNCATE TABLE。TRUNCATE TABLE比SQL刪除語句更快,並且它使用更少的系統和事務日誌資源。

  4. 預設情況下,DELETE語句會在表上引發獨佔(X)鎖定,並在事務完成之前保持鎖定。

  5. 獨佔鎖可防止其他事務修改資料; 使用NOLOCK提示或讀取未提交的隔離級別允許讀取操作

  6. 建議在delete語句中指定TABLOCK提示。此過程允許頁面取消分配和相關空間可供資料庫中的其他物件重用。

  7. 在執行delete語句之前,最好在堆表上建立聚簇索引。

  8. 雖然非常簡單且非常強大,但Delete語句的結果具有破壞性。刪除的行無法輕鬆恢復。

注意:要恢復已刪除的行,請參閱SQL Server災難恢復 - 如何快速恢復因Inadvertent刪除操作而丟失的資料

目前為止就這樣了。希望您喜歡在SQL刪除語句中閱讀本文。如果您有任何疑問,請隨時在下面發表評論。