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