-2

当我们想从我们使用的表中选择所有列时

select * from <table_name>

然后在删除时我们使用

delete from <table_name>

为什么不

delete * from <table_name> is allowed here?
4

6 回答 6

5

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

于 2013-04-24T06:02:29.473 回答
1

删除查询删除了一行,然后使用 * 是没有必要的。

在选择中,您可以选择一列或两列或所有列,但在删除中您可以删除行的所有列,然后 * 不是必需的,因为您不能删除一列

于 2013-04-24T06:00:53.827 回答
1

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

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

对于行,可以通过 using子句DELETE指定需要删除的行。WHERE

DELETE FROM table_name WHERE <condition>

如果您必须删除所有行,您可以使用TRUNCATE选项,因为它被认为是删除所有行的快速、有效的方法。

TRUNCATE TABLE table_name
于 2013-04-24T06:10:15.543 回答
1

这里有几种看待它的方法。

在关系代数术语中,SELECT 语句是选择操作和项目操作的组合。选择操作选择关系元组的子集,项目操作改变元组的结构。每个关系代数运算都需要关系并产生关系。选择操作实际上是 SELECT 语句的 WHERE 子句;项目操作是列列表,SELECT和FROM之间的部分。因为投影与结果关系的结构有关,所以它不适用于删除,这不会产生结果关系,而是破坏性地从关系中删除元组。元组的结构无关紧要,只有选择它们的标准。因此,当 SELECT 映射到两个关系代数运算时,

您可以想出一种方法来使这种语法有意义,但它会违反 SQL 的 DQL/DML/DDL 区别。数据查询语言只包含 SELECT。DML 包含 INSERT、UPDATE 和 DELETE,它们更改表中的元组,但不更改表的结构。DDL 包含 CREATE 和 ALTER 语句,并且可以更改表的结构。我可以看到口译DELETE * FROM table也就是说,清除这些行的列中的值,但是我们如何知道 DELETE 是删除还是更新?如果我们将 * 视为“实际删除这些行”,而将列列表视为“不删除行,但将这些列设为 NULL”,那么我们正在为不太可能发生的情况创建简写,以及模糊 DELETE 和 UPDATE 之间的区别。从长远来看,添加上下文敏感性将使事情变得更加复杂。如果我们将列列表视为指定要删除的列,那么我们正在制定一个可以根据其使用方式执行 DDL 或 DML 的语句,从而模糊了与另一个方向的区别。如果您选择强制使用 * 但不接受列列表,则您

因此,这只是您接受的有关 SQL 的其中一件事情。当您更精通 SQL 时,它会更有意义。例如,我怀疑您认为 * 是 SELECT 中的固定语法,但实际上并非如此,它是列列表的简写。

于 2013-04-24T06:14:48.990 回答
0

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

在删除的上下文中,当我们要删除时,我们不需要获取存储在列中的信息,因此不需要 *。

于 2013-04-24T06:07:09.050 回答
0

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

于 2013-04-24T07:19:21.850 回答