为什么不从生产者那里选择计数((从生产者中选择*);工作?

时间:2010-11-24 06:36:01

标签: sql database oracle

我定义了以下查询:

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,上每行的这一行将显示数字2producers中的元素数量)。

为什么不起作用? SQL限制?我在这里遵循的逻辑有什么问题吗?

由于

5 个答案:

答案 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

MAXMINSUMCOUNT等函数是聚合函数,这意味着它们采用标量参数但执行一次对于每一行,每次迭代都会累积结果。因此,SELECT MAX(column) FROM tableMAX中的每一行执行一次table函数,而您可能认为MAX执行一次并在table的每一行中传递

将此操作与INEXISTSANYALL等操作符进行对比,后者将子查询作为参数。每次调用它们时,它们都会有效地传递子查询的所有结果。

答案 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的表达式。