【问题标题】:SELECT COUNT(*) ;选择计数(*);
【发布时间】:2012-01-13 23:42:25
【问题描述】:

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

Table1 有 3 行,Table2 有 2 行。现在,如果我在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)
)

【问题讨论】:

  • 我想无非就是SELECT COUNT(*),没有表名。它总是 1
  • 嗨,Tass,查询是,当我执行 sql 查询“Select Count(*)”时,输出为 1。这个 1 表示什么。请注意,查询中没有指定表名。

标签: sql sql-server select count


【解决方案1】:

通常所有选择的格式都是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。

【讨论】:

    【解决方案2】:

    按照类似的思路,以下也返回一个结果。

    SELECT 'test'
    WHERE  EXISTS (SELECT *)  
    

    对该行为的解释(来自this Connect item)也适用于您的问题。

    在 ANSI SQL 中,不允许使用没有 FROM 子句的 SELECT 语句 - 您需要指定一个表源。所以语句“SELECT 'test' WHERE EXISTS(SELECT *)”应该给出语法错误。这是正确的 行为。

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

    【讨论】:

      【解决方案3】:

      这是因为你执行了select count(*) 没有指定一个表。

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

      【讨论】:

        【解决方案4】:

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

        尝试使用

        select count(*) from Table1
        

        没有表名就没有意义。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

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

            还有,

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

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

            【讨论】:

            • 它有什么理由应该返回一而不是零?
            • @LukeGirvin 是的,裸选择就像对一行表运行一样。看看我的回答。
            【解决方案7】:

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

            【讨论】:

              【解决方案8】:
              Select * 
              

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

              我必须承认,我从来没有想过 Select Count(*),它会使它更有趣,但仍然会带来一个真实的答案。我们只有一个世界。
              如果不咨询史蒂文霍金,SQL 将只需要应对 1。

              查询的结果是正确的。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2012-03-05
                • 2012-06-07
                • 2015-08-27
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多