我定义了以下查询:
select count((select * from producers)) from producers;
假设一个producers
表有3列(A,B和C)和2行:
A B C
-----
0 1 2
3 4 5
我希望得到以下结果:
2
2
它不起作用。虽然查询本身基本没用(即使它有效,但它不会产生任何有用的输出),我想试着理解为什么这不会运行。
(select * from producers)
这将产生一个行列表,其中包含producers
表中所有属性的信息。
select count((select * from producers)) from producers;
producers,
上每行的这一行将显示数字2
(producers
中的元素数量)。
为什么不起作用? SQL限制?我在这里遵循的逻辑有什么问题吗?
由于
答案 0 :(得分:3)
应该只是
Select count(1) from producers;
如果您询问内部选择,那么内部选择必须是from子句的一部分,例如
Select count(1) from (select * from producers)
这两种方法都是一样的,但第一种方法效率更高。
答案 1 :(得分:3)
据我所知,这是SQL的限制。 COUNT
表达式中不允许子查询。显然(select * from producers)
是子查询,所以不允许在那里。
我认为你的误解是你认为你会像COUNT(SELECT * FROM producers)
那样调用函数,而在SQL中它就像SELECT COUNT(*) FROM producers
。
MAX
,MIN
,SUM
和COUNT
等函数是聚合函数,这意味着它们采用标量参数但执行一次对于每一行,每次迭代都会累积结果。因此,SELECT MAX(column) FROM table
为MAX
中的每一行执行一次table
函数,而您可能认为MAX
执行一次并在table
的每一行中传递
将此操作与IN
,EXISTS
,ANY
和ALL
等操作符进行对比,后者将子查询作为参数。每次调用它们时,它们都会有效地传递子查询的所有结果。
答案 2 :(得分:1)
COUNT()
函数只需要一个值。
这将返回您想要的内容:
SELECT COUNT(*)
FROM producers p1
CROSS JOIN producers p2
GROUP BY p1.A
答案 3 :(得分:0)
Count关键字用于计算数据行而不是数据列。
您需要查询元数据以获取表中的列数,当然实际执行此操作的查询将是特定于数据库平台的。
答案 4 :(得分:0)
“为什么Count()只期望一个值?Count()不将一组行作为输入吗?”
Count接受一个表达式。如果表达式求值为null,则不计算它。否则就是。
如果一个表中有五行,一列有三个实际值和两个空值,那么该列的计数将返回三个。
ID Colour Size
1 Red 30
2 Blue <null>
3 <null> 20
4 <null> <null>
5 Blue 10
SELECT COUNT(COLOR),COUNT(SIZE)将给出3和3。
COUNT(*)的特殊之处在于它给出了表中的行数,而不考虑任何空值。
COUNT不能/不能使用(select * from producer)或甚至(1,3),因为它们不是可以解释为null或不为null的表达式。