我有一个数据库
database1,里面有两个表(表1,表2).
表1中有3行,表2中有2行.现在,如果我执行以下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) )
解决方法
通常所有选择的形式为SELECT [列,列上的标量计算,列上的分组计算或标量计算] FROM [表或表的连接等]
因为这允许简单的标量计算,所以我们可以执行类似于SELECT 1 1 FROM SoMetable的操作,并且它将为表SoMetable中的每一行返回值为2的记录集.
现在,如果我们不关心任何表,但只是想做我们的标量计算,我们可能想要做一些像SELECT 1 1.这是标准不允许的,但它是有用的,大多数数据库允许它(除非最近改变了Oracle,否则Oracle不会这样做,至少它曾经没有改变过.
因此,这样的裸SELECT被视为具有一个from子句,该子句指定了一行没有列的行(当然不可能,但它确实有效).因此,SELECT 1 1变为SELECT 1 1 FROM ImaginaryTableWithOneRow,它返回单行,其中单个列的值为2.
大多数情况下,我们没有考虑到这一点,我们只是习惯了这样一个事实:裸的SELECT给出了结果,甚至没有想到必须选择一行来返回一行这一事实.
在执行SELECT COUNT(*)时,你做了相同的SELECT COUNT(*)FROM ImaginaryTableWithOneRow,当然返回1.