SELECT COUNT(*);

时间:2011-12-06 10:58:38

标签: sql sql-server select count

我有一个数据库database1,其中包含两个表(Table 1Table2)。

Table1中有3行,Table2中有2行。现在,如果我在SELECT COUNT(*);上执行以下SQL查询database1,则输出为"1"

有人有这个想法吗,"1"表示什么?

两个表的定义如下。

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

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

8 个答案:

答案 0 :(得分: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

大多数情况下,我们没有考虑到这一点,我们只是习惯了这样一个事实:裸的SELECT给出了结果,甚至没有想到必须选择一行来返回一行这一事实。

在执行SELECT COUNT(*)时,你做的相当于SELECT COUNT(*) FROM ImaginaryTableWithOneRow当然会返回1.

答案 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,你会得到你的行为   看到。我们可以解决这个问题,但这样做并没有多大价值   可能会破坏现有的应用程序代码。

答案 2 :(得分:2)

这是因为您在没有指定表的情况下执行了select count(*)

count函数返回指定数据集中的行数。如果您没有指定要从中进行选择的表,则单个选择将只返回一行 - 因此count(*)将返回1.(在某些版本的SQL中,例如Oracle,您 指定一个表或类似的数据库对象; Oracle包含一个虚拟表(称为DUAL),可以在不需要特定表时选择。)

答案 3 :(得分:1)

如果没有指定要查询的表,通常不会执行选择计数(*)。您的数据库服务器可能会根据它正在查询的默认系统表给您一个“1”的计数。

尝试使用

select count(*) from Table1

没有表名就没有意义。

答案 4 :(得分:0)

没有表名,它总是返回1是否是任何数据库......

答案 5 :(得分:0)

由于这是标记的SQL服务器,MSDN状态。

  

COUNT始终返回int数据类型值。

此外,

  

COUNT(*)返回组中的项目数。这包括NULL   价值观和重复。

因此,由于您没有提供表来执行COUNT,因此默认(假设)是它返回1

答案 6 :(得分:0)

COUNT函数返回结果的行数。如果未指定任何表,则默认返回1。即。COUNT(*), COUNT(1), COUNT(2), ...将始终返回1

答案 7 :(得分:-1)

Select * 
没有from子句的

是“从Universe中选择ALL”,因为你没有过滤掉任何内容。 在你的情况下,你问的是“有多少宇宙?” 这正是我教它的方式。我会在第一天写在黑板上, 选择*并询问它的含义。答:给我这个世界。 从那里我将教导如何将宇宙过滤到有意义的事物。

我必须承认,我从未想过选择计数(*),这会让它变得更有趣但仍能带回真正的答案。我们只有一个世界 在没有咨询Steven Hawking的情况下,SQL将不得不仅与1.竞争。

查询结果是正确的。