关于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_spaceusedEXEC 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表对每个分区中的行进行排序。
与CTEAS(选择 *,ROW_NUMBER()OVER(PARTITION BY database_name,database_size,[未分配的空间],保留,数据,index_size,没用过ORDER BY database_name)AS Row_NumFROM tb_spaceused)选择 *来自 CTEWHERE ROW_NUM <> 1 ;
用Delete替换Select语句将删除表的所有重复项。
与CTEAS(选择 *,ROW_NUMBER()OVER(PARTITION BY database_name,database_size,[未分配的空间],保留,数据,index_size,没用过ORDER BY database_name)AS Row_NumFROM tb_spaceused)- 选择 *--FROM CTE--WHERE Row_Num <> 1;从 CTE中删除WHERE ROW_NUM <> 1 ;
如何使用SQL子查询删除行
在以下示例中,将根据另一个表中的数据删除一个表中的行。在示例中,SalesPersonQuotaHistory表中的行将根据SalesPerson表的SalesYTD列删除。
DELETE FROM Sales .SalesPersonQuotaHistoryWHERE BusinessEntityID IN(SELECT BusinessEntityID来自销售.SalesPerson在哪里 SalesYTD> 4900000.00);走
如何使用SQL连接删除行
在本节中,我们将使用SQL Delete语句从Adeventureworks2014数据库中删除数据。乍看之下删除数据听起来很琐碎,但是一旦我们进入大型数据库设计,事情可能就不再那么容易了。
在许多情况下,表通过主键和外键关系相关。在以下示例中,我们可以看到使用连接从Sales.SalesPersonQuotaHistory中删除数据。
DELETE sqFROM Sales .SalesPersonQuotaHistory sqINNER JOIN Sales .SalesPerson sp ON sq .BusinessEntityID = sp .BusinessEntityIDWHERE 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)锁定,并在事务完成之前保持锁定。
- 独占锁可防止其他事务修改数据; 使用NOLOCK提示或读取未提交的隔离级别允许读取操作。
- 建议在delete语句中指定TABLOCK提示。此过程允许页面取消分配和相关空间可供数据库中的其他对象重用。
- 在执行delete语句之前,最好在堆表上创建聚簇索引。
- 虽然非常简单且非常强大,但Delete语句的结果具有破坏性。删除的行无法轻松恢复。
注意:要恢复已删除的行,请参阅SQL Server灾难恢复 - 如何快速恢复因Inadvertent删除操作而丢失的数据
目前为止就这样了。希望您喜欢在SQL删除语句中阅读本文。如果您有任何疑问,请随时在下面发表评论。
标签:语句,删除,SQL,子句,表中,概述,使用 From: https://blog.51cto.com/u_16145034/6515617