我有一个数据库database1
,其中包含两个表(Table 1
,Table2
)。
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)
)
答案 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.竞争。
查询结果是正确的。