【问题标题】:Why isn't this simple SQL query working? select *, count(*) from table为什么这个简单的 SQL 查询不起作用?从表中选择 *, count(*)
【发布时间】:2020-08-15 22:29:15
【问题描述】:

我正在尝试学习 SQL,并且正在做一个练习,但我不知道为什么这个简单的 SQL 语句不起作用。

select *, count(*) from bricks

教师试图做的是返回名为砖块的表的所有行。我们还想在表的右侧附加一个新列,它只返回每条记录中所有砖块的总数。所以表中总共有 6 个积木,所以每一行的末尾应该有一个列,即 6。

导师这样做的方式是这样做的:

select b.*, (select count(*) from bricks) total_bricks_in_table from bricks b;

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

select * from bricks

select count(*) from bricks

每个作品都单独工作,但不能组合在一起。我尝试在尝试结束时添加 group by 语句,但无论我按哪一列分组,我仍然会出错。我最初的尝试到底出了什么问题?

【问题讨论】:

  • 您的第一个选择返回 6 行,您的第二个选择返回 1 行,DNMS 应该如何组合呢?如果您的 DBMS 支持 Windowed Aggregatesselect *, count(*) OVER () from bricks
  • 语法select *, count(*) from bricks 格式错误。请注意,它在 MySQL 5.7.5 和更新版本中已被弃用(除非您启用旧语法),这是有充分理由的。
  • @dnoeth 我想这是有道理的,但是其他带有嵌套选择语句的查询是如何工作的呢?在我看来,它似乎在做同样的事情。内部 select 语句首先运行并返回值为 6 的单行,然后在外部 select 语句中使用该结果,对吗?使它起作用的那个有什么不同?
  • inner select 是一个 Scalar Subquery,它在逻辑上为每一行执行,但优化器通常足够聪明,可以看到它总是返回相同的值并且只执行一次。
  • 根据 ISO/ANSI SQL,单个 * 不得与选择列表中的任何其他内容组合。

标签: sql select count


【解决方案1】:

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

【讨论】:

  • 那么我该如何选择如何聚合所有列呢?这不是通过使用 GROUP BY 子句来完成的吗?正如我所说,我已经尝试过并且不断出错。此外,讲师的陈述不使用 group by 并且仍然有效。
  • 事实上(在 SQL 中)对每行结果进行总计数没有多大意义。事实上,数据库不能这样做,因为它必须遍历所有记录才能这样做。因此,如果您对所有内容进行分组,则每行的计数都会得到 1。如果您仍然希望每行的总计数,我会像您一样使用子选择,这效率不高,但会为您解决问题。
  • 也可以尝试@dnoeth 评论,如果您的 DBMS 允许,它会起作用。
【解决方案2】:

这个查询:

select *, count(*)
from bricks

格式错误。由于count(),这是一个聚合 查询。没有group by always 的聚合查询返回一行。但是,您也在尝试选择其他列——任何合理的数据库都将遵循 SQL 标准并返回错误。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多