首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么SQL强迫我在GROUP BY子句中重复SELECT子句中的所有非聚合字段?

在SQL中,GROUP BY子句用于将结果集中的行按照指定的列进行分组。当使用聚合函数(如COUNT、SUM、AVG、MAX、MIN等)时,GROUP BY子句可以将具有相同列值的行归为一组,并对这些组应用聚合函数。

当在SELECT子句中使用了聚合函数时,GROUP BY子句必须包含所有非聚合字段,以确保每个组都具有唯一的列值。如果没有这样做,SQL引擎将无法确定如何正确地对结果集进行分组,因此会报错。

例如,假设我们有一个名为“orders”的表,其中包含“customer_id”、“order_date”和“total_amount”列。如果我们想要计算每个客户的总订单金额,我们可以使用以下查询:

代码语言:sql
复制
SELECT customer_id, SUM(total_amount)
FROM orders
GROUP BY customer_id;

在这个查询中,我们使用了聚合函数SUM(total_amount),并在GROUP BY子句中包含了所有非聚合字段customer_id。这样,我们可以正确地对每个客户的订单金额进行求和。

如果我们没有在GROUP BY子句中包含customer_id,SQL引擎将无法确定如何对结果集进行分组,因此会报错。例如,以下查询将会报错:

代码语言:sql
复制
SELECT customer_id, SUM(total_amount)
FROM orders
GROUP BY order_date;

在这个查询中,我们试图按照订单日期对结果集进行分组,但是没有在GROUP BY子句中包含customer_id。这将导致SQL引擎无法正确地对结果集进行分组,因此会报错。

总之,SQL强迫我们在GROUP BY子句中重复SELECT子句中的所有非聚合字段,是为了确保每个组都具有唯一的列值,并且可以正确地对结果集进行分组。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

盘点 Sql 中几个比较实用小 Tips!

前言 大家好,是安果!...union all 相比 union,union all 表链接时不会删除重复数据行,直接返回表联合后结果 因此,union all 执行效率要高很多,不需要去重和排序时,更推荐使用 union...,聚合函数... from table_one where 条件语句 group by 分组字段...having 分组条件; # 比如 select red_num1,count(red_num1)...by 分组前执行,将查询结果按照条件过滤数据 需要注意是,where 无法与聚合函数一起使用 having 只能配合 group by 使用,分组之后执行,用于过滤满足条件组 需要注意是,分组是一个耗时操作...* from 表二 where 条件判断语句); in 同样用于 where 子句中,筛选出某个表字段存在于多个值中所有数据 关键字 in 常见 2 种使用方式如下: -- in 使用 -- 方式一

72320

如何写优雅SQL原生语句?

知道了sql查询语句MySql架构中具体执行流程,但是为了能够更好更快写出sql语句,觉得非常有必要知道sql句中各子句执行顺序。...现在开始我们学习 语句中各子句完整执行顺序概括(按照顺序号执行) from (注:这里也包括from中语句) join on where group by(开始使用select别名,后面的语句中都可以使用...等聚合函数 having select distinct order by limit 每个子句执行顺序分析 所有的 查询语句都是从from开始执行执行过程中,每个步骤都会为下一个步骤生成一个虚拟表...如果应用了group by,那么后面的所有步骤都只能操作T4列或者是执行6.聚合函数(count、sum、avg等)。(注意:原因在于分组后最终结果集中只包含每个组中一行。...sql句中别名 别名在哪些情况使用 SQL句中,可以为表名称及字段(列)名称指定别名 表名称指定别名 同时查询两张表数据时候: 未设置别名前: SELECT article.title,

1.8K20

图解sql面试题:如何查找重复数据?

【题目】 编写一个SQL查询,查找学生表中所有重复学生名。 【解题思路】 1.看到“找重复关键字眼,首先要用分组函数(group by),再用聚合函数中计数函数count()给姓名列计数。...计数 from 学生表 group by 姓名 ) as 辅助表 where 计数 > 1; 结果: 方法二 这时候有的同学可能会想,为什么要这么麻烦创建一个查询,不能用这个语句(将count放到...(如果不清楚,可以系统看下之前课程《从零学会SQL:汇总分析》) 如果要对分组查询结果进行筛选,可以使用having子句。...2)考察对having语句掌握,很多人会把聚合函数写到where子句中。 3)熟记SQL子句书写顺序和运行顺序。 【举一反三】 本题也可以拓展为:找出重复出现n次数据。...只需要改变having语句中条件即可: select 列名 from 表名 group by 列名 having count(列名) > n; 是猴子,中科院硕士/前IBM高级软件工程师/豆瓣8分

14110

图解面试题:如何查找重复数据?

image.png 【题目】 编写一个SQL查询,查找学生表中所有重复学生名。...image.png 【解题思路】 1.看到“找重复关键字眼,首先要用分组函数(group by),再用聚合函数中计数函数count()给姓名列计数。 2. 分组汇总后,生成了一个如下表。...1; 结果: image.png 方法二 这时候有的同学可能会想,为什么要这么麻烦创建一个查询,不能用这个语句(将count放到where字句中)直接得出答案吗?...(如果不清楚,可以系统看下之前课程《从零学会SQL:汇总分析》) image.png 如果要对分组查询结果进行筛选,可以使用having子句。...2)考察对having语句掌握,很多人会把聚合函数写到where子句中。 3)熟记SQL子句书写顺序和运行顺序。 【举一反三】 本题也可以拓展为:找出重复出现n次数据。

59000

MySQL最常用分组聚合函数

大家好,又见面了,是全栈君。 一、聚合函数(aggregation function)—也就是组函数   一个行集合(一组行)上进行操作,对每个组给一个结果。...剔除字段重复条数 注意:   1)当使用组函数select句中没有group by子句时,中间结果集中所有行自动形成一组,然后计算组函数;   2)组函数不允许嵌套,例如:count(max(...:   通过select返回集字段中,这些字段要么就要包含在group by语句后面,作为分组依据,要么就要被包含在聚合函数中。...,然后将其放在对应数据格中,那么完成这个步骤就是前面讲到聚合函数,这也就是为什么这些函数叫聚合函数了。...;   ③最终结果集列名来自于第一个查询SELECT列表 UNION ALL不去掉结果集中重复行 注:联合查询结果使用第一个select句中字段名 mysql> select * from

5.1K20

sql where 、group by 和 having 用法解析

这就是为什么这些函数叫聚合函数(aggregate functions)了 --group by all语法解析: --如果使用 ALL 关键字,那么查询结果将包括由 GROUP BY 子句产生所有组...子句中可进行比较和查询 SQL> select sno,avg(grade) from sc group by sno having avg(grade...这就是为什么这些函数叫聚合函数(aggregate functions)了 –group by all语法解析: –如果使用 ALL 关键字,那么查询结果将包括由 GROUP BY 子句产生所有组,即使某些组没有符合搜索条件行...这就是为什么这些函数叫聚合函数(aggregate functions)了 --group by all语法解析: --如果使用 ALL 关键字,那么查询结果将包括由 GROUP BY 子句产生所有组...这就是为什么这些函数叫聚合函数(aggregate functions)了 –group by all语法解析: –如果使用 ALL 关键字,那么查询结果将包括由 GROUP BY 子句产生所有组,即使某些组没有符合搜索条件

12.4K30

SQL命令 SELECT(二)

SQL命令 SELECT(二) select-item 这是所有SELECT语句必选元素。 通常,选择项指的是FROM子句中指定表中一个字段。...查询可以使用隐式连接(箭头语法)。 查询不能使用星号语法,即使查询中引用表只有一个数据字段查询一个常见用法是指定不受GROUP BY子句约束聚合函数。...注意,你也可以指定重复列名(本例中是Name)和select-item元素(本例中是{fn NOW}): SELECT TOP 5 {fn NOW} AS QueryDate,...聚合函数参数可以是下列任何一种: 单个列名计算查询所选行所有空值聚合: SELECT AVG(Age) FROM Sample.Person 也允许使用标量表达式来计算聚合: SELECT...语句中组合列名和聚合函数,但SQL扩展了这一标准,允许这样做: SELECT Name, COUNT(DISTINCT Home_State) FROM Sample.Person ```sql -

1.8K10

Vc数据库编程基础MySql数据库表查询功能

那么这次我们需要掌握则是.   1.使用select 语句查询所有字段跟指定字段.   2.按照条件查询.使用运算符以及不同关键字进行查询.   3.为表跟字段起别名   4.聚合函数使用....剔除字段重复条数 注意:   1)当使用组函数select句中没有group by子句时,中间结果集中所有行自动形成一组,然后计算组函数;   2)组函数不允许嵌套,例如:count(max(...④如果GROUP BY后面是一个复合表达式,那么SELECT句中,它必须整体作为一个表达式一部分才能使用。...:   通过select返回集字段中,这些字段要么就要包含在group by语句后面,作为分组依据,要么就要被包含在聚合函数中。...,然后将其放在对应数据格中,那么完成这个步骤就是前面讲到聚合函数,这也就是为什么这些函数叫聚合函数了。

9.7K30

常用SQL语句和语法汇总

创建 SQL常用规则1 数据库名称、表名和列名由字母、数字和下划线组成 名称必须以字母开头 名称不能重复删除 表定义更新(添加列) 表定义更新(删除列) 列查询 查询出表中所有列 根据...WHERE语句来选择记录 SQL常用规则2 SQL语句可以使用AS关键字为列设定别名,设定汉字别名时需要使用双引号(’’)括起来 SELECT句中可以使用DISTINCT来删除重复行 WHERE子句要紧跟在...MAX/MIN函数几乎适用于所有数据类型列,SUM/AVG只适用于数值类型列 想要计算值得种类时,可以COUNT函数前使用关键字DISTINCT 聚合键中包含NULL时,结果中会以不确定(空行)...形式表现出来 使用GROUP BY 子句时,SELECT句中不能出现聚合键之外列名 GROUP BY子句中不能使用SELECT句中定义别名 只有SELECT子句、ORDER BY子句和HAVING...EXIST参数查询中经常会使用SELECT * CASE表达式中END不能省略 SQL常用规则7 集合运算会除去重复记录,但可以使用ALL选项,保留重复行 进行联结时需要在FROM子句中使用多张表

2.5K50

MySQL最常用分组聚合函数

剔除字段重复条数 注意:   1)当使用组函数select句中没有group by子句时,中间结果集中所有行自动形成一组,然后计算组函数;   2)组函数不允许嵌套,例如:count(max(...④如果GROUP BY后面是一个复合表达式,那么SELECT句中,它必须整体作为一个表达式一部分才能使用。...:   通过select返回集字段中,这些字段要么就要包含在group by语句后面,作为分组依据,要么就要被包含在聚合函数中。...,然后将其放在对应数据格中,那么完成这个步骤就是前面讲到聚合函数,这也就是为什么这些函数叫聚合函数了。...;   ③最终结果集列名来自于第一个查询SELECT列表 UNION ALL不去掉结果集中重复行 注:联合查询结果使用第一个select句中字段名 mysql> select * from

5.1K10

SQL命令 DISTINCT

如果两者都指定,则SELECT只返回具有唯一值行,唯一值是TOP子句中指定唯一值行数。...它们之间一个重要区别是DISTINCT分组之前计算聚合函数。GROUP BY计算分组后聚合函数。...可以使用查询实现DISTINCT、聚合函数和GROUP BY预期组合。 字母大小写与DISTINCT优化 根据为字段定义排序规则类型,将字符串值不同地分组在一起。...DISTINCT其他用法 流字段:DISTINCT对流字段OID进行操作,而不是对其实际数据进行操作。因为所有字段OID都是唯一值,所以DISTINCT对实际流字段重复数据值没有影响。...动态SQL SELECT查询和游标嵌入式SQL SELECT查询从未设置%ROWID。 DISTINCT和事务处理 指定DISTINCT关键字会导致查询检索所有当前数据,包括当前事务尚未提交数据。

4.3K10

Oracle数据库学习笔记 (四 —— select 从入门到放弃 【下】)

【下】 一、聚合函数查询 1.1 聚合函数 1.2 分组查询 一、单组函数 二、where 后面不能跟 分组函数 分组原则 小测验 1.3 查询 一、查询语法 二、查询类型 2.1 单行查询...= d.deptno group by e.deptno 分组原则 只要一列上存在重复内容才能考虑分组 select 后面出现查询列,要么是分组条件,要么是分组函数 分组函数只能出现在 select...语句列里,或者 having、order by子句中,如果在 select句中同时包含有 group by、having、order by 子句,那么必须是 group by、再having 再...order by avg(sal); 多字段分组原则 使用 group by 可以根据多个字段进行分组 分组层次从左到右,即先按第一个字段分组,然后再第一个字段值相同记录中,再根据第二个字段值进行分组...编写复杂查询解决思路是:逐层分解查询。即从最内层查询开始分解,将嵌套SQL语句拆分为一个个独立SQL语句。

1.1K30

常用SQL语句和语法汇总

MAX/MIN函数几乎适用于所有数据类型列,SUM/AVG只适用于数值类型列 想要计算值得种类时,可以COUNT函数前使用关键字DISTINCT 聚合键中包含NULL时,结果中会以不确定(空行)...形式表现出来 使用GROUP BY 子句时,SELECT句中不能出现聚合键之外列名 GROUP BY子句中不能使用SELECT句中定义别名 只有SELECT子句、ORDER BY子句和HAVING...子句中能够使用聚合函数,WHERE子句中不能使用聚合函数 HAVING子句要写在GROUP BY 子句后面 通常情况下,为了得到相同结果,将条件写在WHERE子句中要比写在HAVING子句中处理速度更快...ORDER BY子句通常写在SELECT语句末尾 排序键包含NULL时,会在开头或者末尾进行汇总 ORDER BY子句中可以使用SELECT句中定义别名 ORDER BY子句中可以使用SELECT...SQL常用规则7 集合运算会除去重复记录,但可以使用ALL选项,保留重复行 进行联结时需要在FROM子句中使用多张表 进行内联结时必须使用ON子句,并且要书写在FROM 和WHERE之间 使用联结时

3K80

SQL聚合函数 MIN

SQL聚合函数 MIN 返回指定列中最小数据值聚合函数。...通常,表达式是查询返回多行中字段名称(或包含一个或多个字段名称表达式)。 MIN可以引用表或视图SELECT查询或查询中使用。...MIN可以出现在选择列表或HAVING子句中,与普通字段值一起出现。 MIN不能在WHERE子句中使用。除非SELECT查询,否则不能在联接ON子句中使用MIN。...与大多数其他聚合函数不同,ALL和DISTINCT关键字(包括MIN(DISTINCT BY(Col2)col1))MIN中不执行任何操作。它们是为了与SQL-92兼容而提供。...派生最小聚合函数值时,数据字段空值将被忽略。如果查询没有返回任何行,或者返回所有数据字段值为NULL,则MIN返回NULL。

1.2K20

数据查询语言QL

聚合函数: SQL提供了下列聚合函数: COUNT(*) 计算元组个数 COUNT() 对一列中值计算个数 SUM() 求某一列值总和(此列值必须是数值型) AVG()...; 按GROUP句中指定列值分组,同时提取满足HAVING子句中组条件表达式那些列; 按SELECT句中给出列名或列表达式求值输出; ORDER子句对输出目标表进行排序,ASC表示升序排列,...* 表示选择所有列; 列表达式意思是对一个单列求聚合表达式,即运用上面的聚合函数; 允许表达式中出现+,-,*,/以及列名、常数算数表达式。...LIKE 'ab\%cd%' ESCAPE'\' //匹配所有以ab%cd开头字符串 SQL还允许字符上使用多种函数,例如连接(”||“),提取串,计算字符串长度,大小写转换等操作。...聚合函数中遇到空值时,除了COUNT(*)外,都跳过空值去处理空值。 集合成员资格比较: 判断元组是否查询结果(即集合)中操作,叫做”集合成员资格比较“。

2.3K00

《10步完全理解SQL》收获

SELECT之后执行,这也是为什么一些数据库不支持FROM中使用SELECT中定义别名。...FROM语句输出一张“联合“表,来自所有引用某一维度集合。然后通过WHERE语句筛选和GROUP BY处理生成新输出表。...6  SELECT实质是对关系映射 这个不用过多解释,但SELECT语句有很多特殊规则,一些重要的如下: 你仅能够使用那些能通过表引用而得来字段; 如果你有 GROUP BY 语句,你只能够使用 GROUP...BY 语句后面的字段或者聚合函数; 当你句中没有 GROUP BY 时候,可以使用开窗函数代替聚合函数; 当你句中没有 GROUP BY 时候,你不能同时使用聚合函数和其它函数; 有一些方法可以将普通函数封装在聚合函数中...; 7  灵活使用SQL句中几个关键字 DISTINCT:映射之后对数据进行去重 UNION:将两个子查询拼接起来并去重 UNION ALL:将两个子查询拼接起来但不去重 EXCEPT:将第二个查询中结果从第一个查询中去除

62510

MySQL从删库到跑路(五)——SQL查询

作者:天山老妖S 链接:http://blog.51cto.com/9291927 1、查询所有字段 SELECT句中使用星号“”通配符查询所有字段 SELECT句中指定所有字段 select...select * from TStudent where sname like '%志%' or class='net'; 10、查询结果不重复 SELECT句中可以使用DISTINCE关键字指示MySQL...使用group by关键字时,select列表中可以指定项目是有限制select句中仅允许是被分组列,或是为每个分组返回一个值表达式,例如用一个列名作为参数聚合函数。...b.StudentID group by ss having m>80 order by m; 6、GROUP BY子句中使用WITH ROLLUP 使用GROUP BYWITH ROLLUP子句可以检索出更多分组聚合信息...MySQL用WHERE子句对正则表达式提供了初步支持,允许指定用正则表达式过滤SELECT检索出数据。 SQL查询语句中,查询条件REGEXP后所跟东西作为正则表达式处理。

2.5K30

Python 高级笔记第二部分:数据库概述和MySQL数据表操作

像是MySql 关系型数据库和关系型数据库 关系型: 采用关系模型(二维表)来组织数据结构数据库 ,如Oracle 、SQL_Server、 MySQL 关系型: 不采用关系模型组织数据结构数据库...子句 where子句sql句中扮演了重要角色,主要通过一定运算条件进行数据筛选,查询,删除,修改中都有使用。...where hobby like "%draw%"; as 用法 sql句中as用于给字段或者表重命名 select name as 姓名,score as 分数 from class;...如果使用ALL则返回所有结果集,包含重复数据。...where score>80 order by score; 查询 定义 : 当一个语句中包含另一个select 查询语句,则称之为有查询语句 查询使用位置 from 之后 ,此时查询内容作为一个新表内容

1.7K20

SQL Cookbook》 - 第三章 多表查询

如果习惯FROM子句中,而不是WHERE子句中,写连接逻辑,则可以使用JOIN子句。 如果从可阅读性角度来说,表关联时候,关联条件写在ON子句中,过滤条件写在WHERE子句中,会更让人理解。...NOT IN这种形式,会得到emp所有deptno,外层查询会返回dept表中"不存在于"或者"未被包含在"查询结果集中deptno值。需要自行考虑重复过滤操作。...EXISTS/NOT EXISTS和关联查询一起使用时,SELECT列,不重要,之所以使用了NULL,是为了让注意力集中查询连接操作上,而不是SELECT列上。 5. ...(2) 进行连接查询之前先执行聚合运算(以内嵌视图),避免错误结果,因为聚合运算产生在连接查询之前。...组合使用外连接查询和聚合函数 如果部门编号为10员工只有部分有奖金,如果只是全连接,可能会漏掉无奖金员工,此事要使用外连接将所有员工包括进来,同时去掉编号为10员工重复项,如下所示, select

2.3K50
领券