sql语句 : SELECT … FROM … WHERE … GROUP BY … HAVING … ORDER BY … LIMIT … 的执行顺序为 FROM, WHERE, GROUP BY, SELECT, HAVING, ORDER BY, LIMIT。
student 表数据如下:
idnameclassid1A12B13C24D25A16F17G2以SQL语句 : select count(1), name from student where id%2 = 0 group by classid为例。 使用groupby分组,在mysql5.7出现,如下错误:
ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘school.student.id’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
可执行以下三步操作:
在mysql命令行: SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); 在mysql的配置文件的[mysqld]下加入以下内容: [mysqld] sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 重启mysql执行到 group by 时, 会将分组内的第一行输出。到此步骤 classid为1的一共有两条, id为6的被"舍弃"。
select count(1), name 获取表结果如下: count(1)name2D1Bcount() 相当于在执行select 时获取到的数据表的每行"加"一个字段为count(1), 值为where或where + group by 后对应数据的相应条数。
select count(1) 和 select count(name) 的区别: 如果name中有NULL值, 那么count(name)不记录, 其他情况二者一致。
idnameclassid2B14NULL26F1以上数据表中 执行count(1)和count(name), 值分别为: 3, 2
idnameclassid2B14D2count(name) 可加参数 distince :
idnameclassid1A12B13A2以上数据表 执行count(distinct name), 值为: 2
聚集函数:
count 计数 count(1) : 满足条件所有数据条数 count(name) : 满足条件且name不为NULL的数据条数 count(distinct name) : 满足条件且name不为NULL的数据去重后的条数sum 求和 sum(1) : 与 count(1)效果相同 sum(age 1 ) : 将所有age不为NULL的数据的age值加起来 sum(distinct name) : 满足条件且age不为NULL的数据去重后的各age值之和(以下类似)max 最大值min 最小值avg 平均值group_concat 字符串集合int类型字段, string类型字段sum()值为0。 ↩︎