mysql 从聚合函数group by到sql_mode

说到group by, 想必大家都不陌生, 就是对查询的数据进行分组,我们可以通过该操作实现一些特殊需求,比如去重。

最近在项目中使用HQL:“ from TSjrz where CBh = ? group by CName ”,当hibernate在底层使用查询的时候会将该表的所有字段查出来,并且通过C_NAME来分组。写这样一个HQL的目的是想要通过group by 去除重复的C_NAME值。然后对所取到的数据进行操作。

我的mysql 版本是5.6.17, 当使用上面这种写法时是OK的, 能正常取得数据并进行操作。但是到了正式环境(mysql版本 5.7.18),该hql就报了一个错误:

[Err] 1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘db_test.tsjrzo_.C_BH‘ which is not              functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by.   

这就是说,该sql的写法违背了mysql的数据库设置sql_mode=only_full_group_by。

        什么是ONLY_FULL_GROUP_BY ?

对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中.

那这里我们在满足only_full_group_by设置的情况下,改造我们的sql查询如下:

    select a.*       from t_sjrz a,            (select C_NAME, max(D_CJSJ)  --取最新的一条记录
              from t_sjrz               where C_BH = ‘123‘               group by C_NAME) b
      where a.C_NAME = b.C_NAME

这里我们要注意的是,mysql 5.6 版本的默认设置是没有的sql_mode=only_full_group_by的,而在mysql5.7版本以后将sql_mode默认设置了only_full_group_by,这就导致了差异。当然同时我们不能依赖与数据库的一些特定特性来任意的写SQL。

MYSQL的sql_mode一些其它常用值

1、NO_AUTO_VALUE_ON_ZERO:该值影响自增长列的插入。默认设置下,插入0或NULL代表生成下一个自增长值。如果用户希望插入的值为0,而该列又是自增长的,那么这个选项就有用了;

2、STRICT_TRANS_TABLES:在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做限制;

3、NO_ZERO_IN_DATE:在严格模式下,不允许日期和月份为零;

4、NO_ZERO_DATE:设置该值,mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告;

5、ERROR_FOR_DIVISION_BY_ZERO:在INSERT或UPDATE过程中,如果数据被零除,则产生错误而非警告。如 果未给出该模式,那么数据被零除时MySQL返回NULL;

6、NO_AUTO_CREATE_USER:禁止GRANT创建密码为空的用户;

7、NO_ENGINE_SUBSTITUTION:如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常;

8、PIPES_AS_CONCAT:将"||"视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似;

9、ANSI_QUOTES:启用ANSI_QUOTES后,不能用双引号来引用字符串,因为它被解释为识别符;

时间: 2024-10-29 19:11:12

mysql 从聚合函数group by到sql_mode的相关文章

mysql之聚合函数、group by、having

sql中提供聚合函数可以用来统计,求和,求最值等 那么聚合函数有哪些呢? COUNT    统计行数量 SUM         求某一列的和 AVG          求某一列的平均值 MAX  求某一列的最大值 MIN    求某一列的最小值 下面给出一些具体的用法 COUNT  标准格式 SELECT COUNT(<计数规范>)  FROM 表名; 其中,计数规范包括 -* : 计算所有选择的的行,包括NULL的值 - ALL列名 : 技术所有指定列的非空值,如果不写,就默认为ALL -

mysql的聚合函数

聚合操作的语法如下:-- SELECT [field1,field2,--fieldn] fun_name-- FROM tablename-- [WHERE where_contition]-- [GROUP BY field1,field2,--fieldn-- [WITH ROLLUP]]-- [HAVING where_contition]-- 对其参数进行以下说明.fun_name 表示要做的聚合操作,也就是聚合函数,常用的有 sum(求和).count(*)(记录数).max(最大值

MYSQL查询--聚合函数查询

聚合函数查询 聚合函数的最大特点是它们根据一组数据求出一个值.聚合函数的结果值只根据选定行中非NULL的值进行计算,NULL值被忽略. COUNT()函数 COUNT()函数,对于除"*"以外的任何参数,返回所选择集合中非NULL值的行的数目:对于参数"*",返回选择集合中所有行的数目,包含NULL值的行.没有WHERE子句的COUNT(*)是经过内部优化的,能够快速的返回表中所有的记录总数. 例子: select COUNT(*) from info; 查询结果:

MySQL之聚合函数

1.AVG() 用法:求平均值 举例: mysql> select * from t1; +----+------+----------+---------+-------+-------+ | id | name | password | test001 | test3 | test4 | +----+------+----------+---------+-------+-------+ | 2 | 1 | 1 | 1 | 1 | 1 | | 3 | 3 | 4 | 5 | 6 | 7 |

MySQL使用聚合函数查询

create table `t_grade` ( `id` int , `stuName` varchar (60), `course` varchar (60), `score` int ); insert into `t_grade` (`id`, `stuName`, `course`, `score`) values('1','张三','语文','91');insert into `t_grade` (`id`, `stuName`, `course`, `score`) values(

MySQL 聚合函数(三)MySQL对GROUP BY的处理

原文来自MySQL 5.7 官方手册:12.20.3 MySQL Handling of GROUP BY SQL-92和更早版本不允许SELECT列表,HAVING条件或ORDER BY列表引用未在GROUP BY子句中命名的非聚合列的查询.即以下查询是被禁止的: SELECT o.custid, c.name, MAX(o.payment) FROM orders AS o, customers AS c WHERE o.custid = c.custid GROUP BY o.custid

MySQL 聚合函数

MySQL 聚合函数常用的有五个 SUM COUNT AVG MIN/MAX AVG ([DISTINCT] expr) 返回expr 的平均值.DISTINCT 选项可用于返回expr的不同值的平均值. SELECT gender, AVG(age) FROM student GROUP BY gender; COUNT(expr) 返回SELECT语句检索到的行中非NULL值的数目. SELECT COUNT(*) FROM student; --返回检索行的数目,不论其是否包含 NULL值

MySQL最常用分组聚合函数

一.聚合函数(aggregation function)---也就是组函数 在一个行的集合(一组行)上进行操作,对每个组给一个结果. 常用的组函数: AVG([distinct] expr) 求平均值 COUNT({*|[distinct] } expr) 统计行的数量 MAX([distinct] expr) 求最大值 MIN([distinct] expr) 求最小值 SUM([distinct] expr) 求累加和 ①每个组函数接收一个参数 ②默认情况下,组函数忽略列值为null的行,不

【mysql】 mysql 子查询、联合查询、模糊查询、排序、聚合函数、分组----------语法

第二章 mysql 一.模糊查询 like 1. 字段 like '河北省%' %代表任何N个字符 2 字段 like '河北省____' _代表任意1个字符 二.IN 语法:SELECT 字段列1,字段2 ,…FROM 表名 WHERE 字段x IN ( 值1,值2,值3…) 三.排序 语法:select 字段1, 字段2, ... from 表名 where 条件 order by 字段 [asc|desc] asc :升序 desc :降序 默认是升序asc SELECT * FROM s