因为在MySQL中使用group by是总是出现1055的错误,这就导致了必须去查看是什么原因了,查询了相关的资料,现在将笔记记录下来,以便后面可以参考使用:
sql_mode:简而言之就是:它定义了你MySQL应该支持的sql语法,对数据的校验等等
选择@@sql_mode:使用该命令我们可以查看我们当前数据库的sql_mode
mysql>选择@@sql_mode; + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + | @@sql_mode | + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + |> mysql>从tt1 select *; + - - - + - - - - - - - - - - - - - - - - - + 性别| | | | id名称 + - - - + - - - - - - - - - - - - - - - - - + | 1 | xiong | 0 | | 2 |应| 0 | | 3 | cai | 0 | 张| 4 | | 0 | 李| 5 | | 1 | 王| 6 | | 1 | + - - - + - - - - - - - - - - - - - - - - - + 6行集(0.00秒) mysql>选择id、名称从tt1组的名字; 错误1055 (42000): mysql>从tt1 select *; + - - - + - - - - - - - - - - - - - - - - - + 性别| | | | id名称 + - - - + - - - - - - - - - - - - - - - - - + | 1 | xiong | 0 | | 2 |应| 0 | | 3 | cai | 0 | 张| 4 | | 0 | 李| 5 | | 1 | 王| 6 | | 1 | + - - - + - - - - - - - - - - - - - - - - - + 6行集(0.00秒) mysql>选择的名字从tt1集团的名字; +-------+ | |名称 +-------+ 蔡| | 李| | 王| | | xiong | 应| | 张| | +-------+ 6行集(0.00秒)
所以我们要使用能正确的使用集团的话就必须删除掉only_full_group_by
设置sql_mode=(选择替换(@@sql_mode,‘ONLY_FULL_GROUP_BY’,”);可以使用该语句来将空格替换掉only_full_group_by,这样我们就可以使用 mysql>设置sql_mode=(选择替换(@@sql_mode,‘ONLY_FULL_GROUP_BY’,”); 查询好,0行影响(0.00秒) mysql>选择id、名称从tt1组的名字; + - - - + - - - - - - - + | | | id名称 + - - - + - - - - - - - + | 3 | cai | 李| 5 | | 王| 6 | | | 1 | |汽车 应| 2 | | 张| 4 | | + - - - + - - - - - - - + 6行集(0.00秒)
但是这种方法只是做了暂时的修改,我们可以更改配置文件my.ini
sql_mode=STRICT_TRANS_TABLES、NO_ZERO_IN_DATE NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION
STRICT_TRANS_TABLES:
在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做任何限制
NO_ZERO_IN_DATE:
在严格模式,不接受月或日部分为0的日期。如果使用忽略选项,我们为类似的日期插入‘0000-00-00’。在非严格模式,可以接受该日期,但会生成警告。
NO_ZERO_DATE:
在严格模式,不要将“0000-00-00”做为合法日期。你仍然可以用忽略选项插入零日期。在非严格模式,可以接受该日期,但会生成警告
ERROR_FOR_DIVISION_BY_ZERO:
在严格模式,在插入或更新过程中,如果被零除(或国防部(X, 0)),则产生错误(否则为警告)。如果未给出该模式,被零除时MySQL返回零。如果用到插入忽略或更新忽略中,MySQL生成被零除警告,但操作结果为空
NO_AUTO_CREATE_USER:
防止格兰特自动创建新用户,除非还指定了密码。
NO_ENGINE_SUBSTITUTION:
如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常
三,据说是MySQL5.0以上版本支持三种sql_mode模式:ANSI、传统和STRICT_TRANS_TABLES。
1, ANSI模式:宽松模式,更改语法和行为,使其更符合标准SQL。对插入数据进行校验,如果不符合定义类型或长度,对数据类型调整或截断保存,报预警警告。对于本文开头中提到的错误,可以先把sql_mode设置为ANSI模式,这样便可以插入数据,而对于除数为0的结果的字段值,数据库将会用NULL值代替。将当前数据库模式设置为ANSI模式: