只是好奇SQL语法.所以如果我有

SELECT 
 itemName as ItemName,
 substring(itemName, 1,1) as FirstLetter,
 Count(itemName)
FROM table1
GROUP BY itemName, FirstLetter

这是不正确的,因为

GROUP BY itemName, FirstLetter 

真的应该

GROUP BY itemName, substring(itemName, 1,1)

但是为什么我们不能简单地使用前者来方便呢?

推荐答案

SQL的实现就像按照以下顺序执行查询一样:

  1. 从句
  2. WHERE子句
  3. 按子句分组
  4. 有从句
  5. SELECT子句
  6. 按条款排序

对于大多数关系数据库系统,这个顺序解释了哪些名称(列或别名)是有效的,因为它们必须是在前一步中引入的.

因此,在Oracle和SQL Server中,不能在SELECT子句中定义的GROUP BY子句中使用术语,因为GROUP BY在SELECT子句之前执行.

不过也有例外:MySQL和Postgres似乎有额外的智能性来支持它.

Sql相关问答推荐

Postgres trunc_date删除一个月

为什么两个不同的窗口函数给出不同的排序结果?

PostgreSQL:使用JSONB中的字段使用jsonb_to_Records()填充记录

我可以在SQL的IN子句中使用比子查询包含的值更少的值吗?

用户购买平台及金额统计

使用拆分器将已分组的不同值连接在一起

如何在多列上编写具有不同条件的查询?

使用左外部联接更正列中第+1行的值时重复

Select 最频繁的值以及分组依据

插入具有预期逻辑的查询以Forking 表

同时插入和更新记录

将二维数组的第一个和第二个元素取消嵌套到两个一维数组中

GRAFANA 数据库查询错误:pq:列名称不存在

删除对 JSON 数据的未解析引用的 SQL71502 警告

给定 3 个键列,从一个表中 Select 另一表中不存在的所有数据

SQL Server - 判断 ids 层次 struct 中的整数 (id)

使用 SQL 计算一年中任意 3 个月期间的总成本

一次 Select 语句中按组累计的SQL累计数

比使用NOT EXISTS更高效的SQL删除方法是什么?

如果当前日期是一周中的某一天,则从另一天提取结果