2013-04-24 75 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>而不是你想在你的問題中做什麼。這將刪除該表的所有行

相關問題