2011-12-06 166 views
7

我有一個數據庫,database1,裏面有兩個表(Table 1Table2)。SELECT COUNT(*);

有在Table1 3行和2行中Table2。現在,如果我在database1上執行以下SQL查詢SELECT COUNT(*);,則輸出爲"1"

有沒有人有這個想法,這是什麼"1"表示?

兩張表的定義如下。

CREATE TABLE Table1 
(
ID INT PRIMARY KEY, 
NAME NVARCHAR(20) 
) 

CREATE TABLE Table2 
(
ID INT PRIMARY KEY, 
NAME NVARCHAR(20) 
) 
+0

什麼是確切的查詢? – Reactormonk

+0

我認爲無非是'SELECT COUNT(*)',沒有表名。它總是1 – Matten

+0

您好塔斯,查詢是,當我執行SQL查詢「選擇計數(*)」,那麼輸出是1.這是什麼1表示。請注意,查詢中沒有指定表名。 – IsmailBaig

回答

0

無表名,它總是返回1個無論任何數據庫....

2

這是因爲你沒有指定表執行select count(*)

count函數返回指定數據集中的行數。如果不指定表以供選擇,一個選擇將只返回一行 - 因此count(*)將返回1(在某些版本的SQL,如Oracle,你指定表或類似數據庫對象; Oracle包含其可以當不需要特定表選自一個虛擬表(稱爲DUAL))

1

你通常不會不指定一個表對查詢執行SELECT COUNT(*)。您的數據庫服務器可能會根據您查詢的默認系統表向您提供「1」的計數。

嘗試使用

select count(*) from Table1 

沒有它是沒有意義的表名。

0

由於這是標記爲SQL服務器,MSDN狀態。

COUNT總是返回int數據類型值。

此外,

COUNT(*)返回一個組中的項的數目。這包括NULL 值和重複項。

這樣,因爲你沒有提供的表格做的,默認的(假設)一個COUNT是它返回一個1

+0

它有什麼理由爲什麼它應該返回一個而不是零? –

+1

@LukeGirvin是的,裸選擇就好像對一個表中的一行運行一樣。看看我的答案。 –

6

通常所有的選擇都是形式SELECT [columns, scalar computations on columns, grouped computations on columns, or scalar computations] FROM [table or joins of tables, etc]

的,因爲這允許簡單的標量計算,我們可以這樣做SELECT 1 + 1 FROM SomeTable,它會在表SomeTable返回一個記錄,其值爲2的每一行。現在

,如果我們不關心任何表,但只是想做我們的標量計算,我們可能要像做SELECT 1 + 1。這是標準所不允許的,但它是有用的,並且大多數數據庫都允許它(Oracle除非它最近發生變化,否則至少不會)。

因此,這樣裸露的SELECT被當作是有一個from子句,它指定了一個行,沒有列的表(當然不可能,但它的確有竅門)。因此SELECT 1 + 1變爲SELECT 1 + 1 FROM ImaginaryTableWithOneRow,它返回單行,單列,值爲2

大部分我們都沒有想到這一點,我們只是習慣了裸SELECTs給出結果,甚至不考慮必須有一行選擇返回一行的事實。

在做SELECT COUNT(*)你做的SELECT COUNT(*) FROM ImaginaryTableWithOneRow相當於這當然返回1

6

按照類似的思路下面還返回一個結果。

SELECT 'test' 
WHERE EXISTS (SELECT *) 

該行爲的解釋(來自this Connect item)也適用於您的問題。

在ANSI SQL中,一個SELECT聲明沒有FROM子句是不允許的 - 你需要指定一個表源。所以聲明「SELECT 'test' WHERE EXISTS(SELECT *)」應該給出語法錯誤。這是正確的 行爲。

對於SQL Server實現,FROM 子句是可選的,它一直以這種方式工作。所以你可以做 「SELECT 1」或「SELECT @v」等等,而不需要一張表。在 其他數據庫系統,有一個名爲「DUAL」 與用來做這樣的SELECT語句,如「SELECT 1 FROM dual;」或「SELECT @v FROM dual;一個 一行虛表。現在,來到EXISTS子句 - 項目列表在 的語法或結果方面並不重要,查詢和SELECT *在子查詢中有效。加上 這個事實,我們允許SELECT沒有FROM,你會得到 看到的行爲。我們可以修復它,但這樣做並沒有多大價值,它可能會破壞現有的應用程序代碼。

0

COUNT函數返回作爲結果的行數。如果您未指定任何表格,則默認情況下它將返回1。即,COUNT(*), COUNT(1), COUNT(2), ...將始終返回1

-1
Select * 

沒有from子句是「Select ALL from the Universe」,因爲您已經過濾了任何東西。 就你而言,你問的是「多少宇宙?」 這正是我會教它的。我會在第一天寫在板子上, 選擇*並詢問它的含義。答:給我全世界。 從那裏我會教如何過濾宇宙到有意義的東西。

我必須承認,我從來沒有想過選擇計數(*),這將使它更有趣,但仍然帶回一個真實的答案。我們只有一個世界。
沒有諮詢史蒂芬霍金,SQL將不得不只與1。

查詢結果是正確的。