2013-04-24 63 views
-2

当我们想从表中选择所有列,我们使用删除*所有不允许在SQL?

select * from <table_name> 

然后同时删除我们使用

delete from <table_name> 

为什么不

delete * from <table_name> is allowed here? 
+3

“*”表示“所有列”。删除不关心列,只关心删除行。因此暗示'*'。 – pickypg 2013-04-24 06:03:53

+0

如果你真的想要找到被删除的列值,可以使用'Output Clause'类似'Delete from table Output Deleted.ColumnName'.'Select'语句用于'投影或选择要返回的列',其中Delete是用于删除行不是'列' – praveen 2013-04-24 06:08:09

回答

5

删除在使用时我们要删除行,而不是一列

1

删除查询删除,则一排用的* 没有必要。

在选择,你可以选择一个或两列或所有列,但在删除您可以删除行的所有列则*是没有必要的,因为你不能删除一列

+0

选择查询选择一行然后使用的*不是neccecary – 2013-04-24 06:01:28

+1

在选择您可以选择一个或两个culumn或所有列,但在删除您可以删除所有列然后*不neccecary – atabrizi 2013-04-24 06:03:10

0

在选择上下文中,例如“从 选择* [表]”字*代表所有列。因此,如果表格由X列数组成,则将检索X列中的所有值。该值稍后将被应用程序使用/显示在SQL客户端中。

在删除的情况下,当我们想要删除时,我们不需要获取存储在列中的信息,因此*不是必需的。

1

DELETE与列没有任何关系,而是它与表的行有关。如果要删除某些列数据,则必须使用UPDATE选项。

UPDATE table_name SET <set value here> WHERE <condition> 

至于DELETE涉及到行,你可以指定行需要用WHERE条款被删除。

DELETE FROM table_name WHERE <condition> 

如果您需要删除所有的行,你可以使用TRUNCATE选择,因为它被认为是删除所有行的快速,高效的方式。

TRUNCATE TABLE table_name 
1

以下是查看它的几种方法。

在关系代数术语中,SELECT语句是选择操作和项目操作的组合。选择操作选择关系的元组的子集,并且项目操作改变元组的结构。每一个关系代数运算都需要关系并产生关系。 select操作实际上是SELECT语句的WHERE子句;项目操作是列列表,即SELECT和FROM之间的部分。因为投影与结果关系的结构有关,所以它不适用于删除,它不会产生结果关系,而是从关系中破坏性地删除元组。元组的结构不相关,只是选择它们的标准。因此,在SELECT映射到两个关系代数运算的地方,DELETE只能建立在一个关系代数运算上,所以即使对称也没有对其他语句的语法支持。

您可以想出一种方法来使此语法有意义,但这会违反SQL的DQL/DML/DDL区别。数据查询语言只包含SELECT。 DML包含INSERT,UPDATE和DELETE,它们改变表中的元组,但不改变表的结构。DDL包含CREATE和ALTER语句,并可以更改表的结构。我可以看到解释DELETE * FROM table的意思,清除这些行的列中的值,但是我们如何知道DELETE是否正在删除或更新?如果我们将*视为“实际删除这些行”,并将列表视为“不要删除行,但是在这些列中设置为空”,那么我们将创建一个不太可能出现的情况的简写形式,同时模糊DELETE和UPDATE之间的区别。从长远来看,添加上下文敏感性会让事情变得更加复杂。如果我们将列列表视为指定要删除的列,我们将根据它的使用方式做出可以执行DDL或DML的语句,从而将区别从另一个方向模糊化。如果您选择强制*但不接受列列表,则会使用SELECT和所有其他可能涉及明确列列表的查询创建虚假对称。

因此,这只是您接受的SQL的其中一个方面。当你更熟练使用SQL时,它更有意义。例如,我怀疑你认为*在SELECT中是固定的语法,但它实际上不是,它是列表的简写。

0

根据你的问题,你想删除行。使用truncate table <table_name>而不是你想在你的问题中做什么。这将删除该表的所有行

相关问题