SELECT COUNT(*);

Ism*_*aig 7 sql sql-server select count

我有一个数据库,里面database1有两个表(Table 1,Table2).

有3行Table1和2行Table2.现在,如果我执行下面的SQL查询SELECT COUNT(*);database1,然后输出"1".

有没有人有这个想法,这"1"意味着什么?

两个表的定义如下.

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

CREATE TABLE Table2
(
ID INT PRIMARY KEY,
NAME NVARCHAR(20)
)
Run Code Online (Sandbox Code Playgroud)

Jon*_*nna 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并且它将为表中的每一行返回值为2的记录集SomeTable.

现在,如果我们不关心任何表,但只是想做我们的标量计算,我们可能想要做类似的事情SELECT 1 + 1.标准不允许这样做,但它很有用,并且大多数数据库允许它(除非最近更改,否则Oracle不会更改,至少它不常用).

因此,这样的裸SELECT被视为具有一个from子句,该子句指定了一个具有一行而没有列的表(当然不可能,但它可以解决问题).因此SELECT 1 + 1成为SELECT 1 + 1 FROM ImaginaryTableWithOneRow其返回单行与该值的单个列2.

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

在做SELECT COUNT(*)你做了相当于SELECT COUNT(*) FROM ImaginaryTableWithOneRow当然返回1.


Mar*_*ith 6

沿着类似的行,以下也返回结果.

SELECT 'test'
WHERE  EXISTS (SELECT *)  
Run Code Online (Sandbox Code Playgroud)

该行为的解释(来自此Connect项目)也适用于您的问题.

在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,你得到你看到的行为.我们可以修复它,但这样做并没有多大价值,它可能会破坏现有的应用程序代码.


Gau*_*wal 0

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