Sql 选择计数(*);

Sql 选择计数(*);,sql,sql-server,select,count,Sql,Sql Server,Select,Count,我有一个数据库,database1,其中有两个表(表1,表2) 表1中有3行,表2中有2行。现在,如果我执行以下SQL查询selectcount(*),则输出为“1” 有人知道这个“1”意味着什么吗 这两个表的定义如下 CREATE TABLE Table1 ( ID INT PRIMARY KEY, NAME NVARCHAR(20) ) CREATE TABLE Table2 ( ID INT PRIMARY KEY, NAME NVARCHAR(20) ) 如果没有表名,它总是返回1,

我有一个数据库,
database1
,其中有两个表(
表1
表2

表1中有3行
,表2中有2行。现在,如果我执行以下SQL查询
selectcount(*)database1
上执行code>,则输出为
“1”

有人知道这个
“1”
意味着什么吗

这两个表的定义如下

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

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

如果没有表名,它总是返回1,无论它是否包含任何数据库……

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


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

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

试用

select count(*) from Table1

没有表名就没有意义。

因为这是标记为SQL server的,所以状态为

COUNT始终返回int数据类型值

而且

COUNT(*)返回组中的项目数。这包括NULL 值和副本


因此,由于您没有提供一个表来进行
计数,默认情况下(假设)是它返回
1
通常所有选择的形式都是
SELECT[columns,columns上的标量计算,columns上的分组计算,或者标量计算]from[table or join of tables,etc]

因为这允许简单的标量计算,所以我们可以执行类似于
从SomeTable
中选择1+1这样的操作,它将为表
SomeTable
中的每一行返回一个值为2的记录集

现在,如果我们不关心任何表,只想进行标量计算,那么我们可能需要执行类似于
select1+1
的操作。标准不允许这样做,但它很有用,而且大多数数据库都允许这样做(Oracle不允许这样做,除非最近对其进行了更改,至少以前不允许这样做)

因此,此类裸选择被视为具有from子句,该子句指定了一个只有一行而没有列的表(当然不可能,但它做到了这一点)。因此,
SELECT 1+1
变为
SELECT 1+1 FROM ImaginaryTableWithOneRow
,它返回一行一列,值为
2

大多数情况下,我们不考虑这一点,我们只是习惯于裸选择会给出结果,甚至不考虑必须选择某一行才能返回一行的事实


在执行
SELECT COUNT(*)
时,您执行了与ImaginaryTableWithOneRow
中的
SELECT COUNT(*)等效的操作,当然返回1。

按照类似的行,下面也会返回一个结果

SELECT 'test'
WHERE  EXISTS (SELECT *)  
对这种行为的解释(来自)也适用于你的问题

在ANSI SQL中,不允许使用不带
FROM
子句的
SELECT
语句- 您需要指定一个表源。因此语句“
SELECT'test”
如果存在(选择*)
“应给出语法错误。这是正确的 行为

对于SQL Server实现,来自
子句是可选的,它一直以这种方式工作。所以你可以 “
选择1
”或“
选择@v
”等等,而不需要表格。在里面 在其他数据库系统中,有一个名为“DUAL”的虚拟表,其中 行,用于执行类似“
SELECT FROM”这样的
SELECT
语句 dual;
”或“
从dual;
中选择@v”。现在,进入
EXISTS
子句- 项目列表与项目的语法或结果无关 查询和
选择*
在子查询中有效。将此与 事实上,我们允许
中选择
,而不允许
,您可以得到您想要的行为
看见我们可以修复它,但这样做并没有多大价值
可能会破坏现有的应用程序代码


COUNT
函数返回结果行数。如果未指定任何表,则默认情况下返回1。例如,
COUNT(*)、COUNT(1)、COUNT(2),…
将始终返回
1

Select * 
没有from子句的是“从宇宙中选择所有”,因为您没有过滤掉任何内容。 在你的例子中,你会问“有多少个宇宙?” 这正是我教它的方式。我会在第一天写在黑板上, 选择*并询问其含义。回答:给我整个世界。 从那以后,我将教授如何过滤宇宙,使之成为有意义的东西

我必须承认,我从来没有想过选择计数(*),这会使它更有趣,但仍然带来一个真实的答案。我们只有一个世界。
如果不咨询Steven Hawking,SQL只需与1


查询的结果是正确的。

我认为只有
选择COUNT(*)
,没有表名。它总是1Hi Tass,当我执行sql查询“Select Count(*)时,查询结果是1。这1意味着什么。请注意,查询中没有指定表名。是否有任何原因使其返回1而不是0?@LukeGirvin是的,bare selects的行为就像针对一行的表运行一样。看看我的答案。