为什么这个简单的SQL查询不起作用?从表中选择*,计数(*)

为什么这个简单的SQL查询不起作用?从表中选择*,计数(*),sql,select,count,Sql,Select,Count,我正在尝试学习SQL,并进行了一个练习,但我仍然不明白为什么这个简单的SQL语句不起作用 从砖块中选择*,计数* 讲师试图做的是返回名为bricks的表的所有行。我们还希望在表的右侧附加一个新列,该列只返回每条记录中所有砖块的总数。因此,表中总共有6块砖,因此每行的末尾应该有一列,该列的读数为6 讲师这样做的方式是: 选择b.*,从砖块b的\u表中的砖块总数\u中选择计数* 第一个查询是我对它的尝试,我不明白为什么它在运行时不起作用 从砖块中选择* 及 从砖块中选择计数* 它们各自独立工作,但结

我正在尝试学习SQL,并进行了一个练习,但我仍然不明白为什么这个简单的SQL语句不起作用

从砖块中选择*,计数*

讲师试图做的是返回名为bricks的表的所有行。我们还希望在表的右侧附加一个新列,该列只返回每条记录中所有砖块的总数。因此,表中总共有6块砖,因此每行的末尾应该有一列,该列的读数为6

讲师这样做的方式是:

选择b.*,从砖块b的\u表中的砖块总数\u中选择计数*

第一个查询是我对它的尝试,我不明白为什么它在运行时不起作用

从砖块中选择*

从砖块中选择计数*

它们各自独立工作,但结合起来就不行了。我曾尝试在尝试结束时添加一个GROUPBY语句,但无论按哪个列分组,我仍然会出错。我最初的尝试到底出了什么问题?

这是因为COUNT是一个聚合函数,一旦使用了一个聚合,就必须选择如何聚合SELECT语句中的每一列。

这是因为COUNT是一个聚合函数,一旦使用了一个聚合,您必须选择如何聚合SELECT语句的每一列。

此查询:

select *, count(*)
from bricks
是畸形的。由于计数的原因,这是一个聚合查询。没有group by的聚合查询始终返回一行。但是,您也在尝试选择其他列—任何合理的数据库都将遵循SQL标准并返回错误

你能做什么?SQL有一种叫做窗口函数的东西。这使得做你想做的事情变得非常简单:

select *, count(*) over () as num_bricks
from bricks
此查询:

select *, count(*)
from bricks
是畸形的。由于计数的原因,这是一个聚合查询。没有group by的聚合查询始终返回一行。但是,您也在尝试选择其他列—任何合理的数据库都将遵循SQL标准并返回错误

你能做什么?SQL有一种叫做窗口函数的东西。这使得做你想做的事情变得非常简单:

select *, count(*) over () as num_bricks
from bricks

那么,我该如何选择如何聚合所有列呢?这不是通过使用GROUPBY子句来实现的吗?正如我所说的,我已经试过了,并且不断地出错。另外,讲师的语句没有使用GROUPBY,并且仍然有效。事实上,在SQL中,在结果的每一行上都有总计数没有多大意义。事实上,数据库不能这样做,因为它必须遍历所有记录才能这样做。因此,如果将所有内容分组,则每行的计数结果将为1。如果您仍然希望每行的总计数,我将使用与您一样的子选择,虽然效率不高,但可以为您提供帮助。另外,如果您的DBMS允许,还可以尝试@dnoeth comment,它将起作用。那么我如何选择如何聚合所有列呢?这不是通过使用GROUPBY子句来实现的吗?正如我所说的,我已经试过了,并且不断地出错。另外,讲师的语句没有使用GROUPBY,并且仍然有效。事实上,在SQL中,在结果的每一行上都有总计数没有多大意义。事实上,数据库不能这样做,因为它必须遍历所有记录才能这样做。因此,如果将所有内容分组,则每行的计数结果将为1。如果您仍然希望每行的总计数,我将使用与您一样的子选择,这不是很有效,但会为您带来好处。还可以尝试@dnoeth comment,如果您的DBMS允许,它会起作用。您的第一个选择返回6行,第二个选择返回1行,DNMS应该如何组合这些行?如果您的DBMS支持窗口聚合:select*,count*overfrom bricks语法select*,count*from bricks格式不正确。请注意,MySQL 5.7.5及更新版本中不推荐使用它,除非您有充分的理由启用旧语法。@dnoeth我想这是有道理的,但另一个带有嵌套select语句的查询是如何工作的呢?在我看来,它似乎在做同样的事情。内部select语句首先运行并返回一个值为6的单行,该结果将在外部select语句中使用,对吗?内部select是一个标量子查询,逻辑上为每一行执行,但优化器通常足够聪明,可以看到它总是返回相同的值,并且只执行一次。单个*不能与select列表中的任何其他项组合,根据ISO/ANSI SQL。您的第一个选择返回6行,第二个选择返回1行,DNMS应该如何组合这两行?如果您的DBMS支持窗口聚合:select*,count*overfrom bricks语法select*,count*from bricks格式不正确。注意,MySQL 5.7.5及更新版本中不推荐使用它,除非您有充分的理由启用旧语法。@dnoeth我想这会使 ense,但是另一个带有嵌套select语句的查询是如何工作的呢?在我看来,它似乎在做同样的事情。内部select语句首先运行并返回一个值为6的单行,该结果将在外部select语句中使用,对吗?内部select是一个标量子查询,逻辑上为每一行执行,但优化器通常足够聪明,可以看到它总是返回相同的值,并且只执行一次。根据ISO/ANSI SQL,单个*可能不会与select列表中的任何其他内容组合。