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的行为就像针对一行的表运行一样。看看我的答案。