'''分组:根据字段相同值形成不同的类别,不明确分组其实整个表就为一个默认大组
原因:把以值共性得到的类别作为考虑单位,不再关系单条记录,而且一组记录
结果:只能考虑组内多条数据的聚会结果(聚合函数结果),分组的字段同样是聚合结果,如:组内的最大最小值
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
聚合函数:
max():最大值
min():最小值
avg():平均值
sum():和
count():记数
group_concat():组内字段拼接,用来查看组内其他字段
eg:1
每个部门的平均薪资
select dep, avg(salary) '平均薪资' from emp group by dep;
+-----------+-------------------+
| dep | 平均薪资 |
+-----------+-------------------+
| 咨询部 | 6.250000059604645 |
| 教学部 | 5.512500047683716 |
| 教职部 | 5.850000023841858 |
+-----------+-------------------+
eg:2
每个部门都有哪些人
select dep, group_concat(name) from emp group by dep; #group_concat是固定的语句,不可修改
+-----------+--------------------------------------------+
| dep | group_concat(name) |
+-----------+--------------------------------------------+
| 咨询部 | san1,san,ying,zero |
| 教学部 | san2,kevin,alex,owen,jiboy,tank,jerry,engo |
| 教职部 | monkey,yangsir |
+-----------+--------------------------------------------+
需求:
各性别中附属于教学部的最高薪资
select max(salary) '最高薪资', gender from emp where dep='教学部' group by gender;
+--------+--------------+
| gender | 最高薪资 |
+--------+--------------+
| 男 | 9.4 |
| 女 | 3 |
+--------+--------------+
思考:
想知道需求中员工的姓名 => 子查询
上方结果: 男的最高薪资对应的人名, 女的最高薪资对应的人名
# select group_concat(name), max(salary) '最高薪资', gender from emp where dep='教学部' group by gender; 错误
select name from emp where salary in (select max(salary) '最高薪资' from emp where dep='教学部' group by gender);
+----+-------+--------+------+--------+--------+-----------+-----------+
| id | name | gender | age | salary | area | port | dep |
+----+-------+--------+------+--------+--------+-----------+-----------+
| 2 | engo | 男 | 38 | 9.4 | 山东 | 济南 | 教学部 |
| 3 | jerry | 女 | 30 | 3 | 江苏 | 张家港 | 教学部 |
+----+-------+--------+------+--------+--------+-----------+-----------+'''注:当我在表中插入:insert into emp(id,name,gender,age,salary,area,port,dep) values(15, 'per,'女',18, 3.0,'江苏','张家港','咨询部');时,此时在执行上诉mysql语句,得到的结果会变为:
+----+-------+--------+------+--------+--------+-----------+-----------+
| id | name | gender | age | salary | area | port | dep |
+----+-------+--------+------+--------+--------+-----------+-----------+
| 2 | engo | 男 | 38 | 9.4 | 山东 | 济南 | 教学部 |
| 3 | jerry | 女 | 30 | 3 | 江苏 | 张家港 | 教学部 |
| 15 | per | 女 | 18 | 3 | 江苏 | 张家港 | 咨询部 |
+----+-------+--------+------+--------+--------+-----------+-----------+很明显与我们的意愿相悖,但是也具有一定的参考度。
1. 14条数据部门有3个, 并且每个部分有多条记录, 可以作为分组依据, 同理, 性别也可以#select * from emp group by dep; # 非分组安全模式下, 可以查询非聚合结果, 显示的是第一条记录, 没有意义, 分组安全模式下不能查询非聚合结果的字段
result:'''ERROR 1055 (42000): 'kt1.emp.id' isn't in GROUP BY''' #select后面的查询内容必须要是分组字段或者聚合函数得到的结果,否则就会报错。
select depfromemp group by dep;+-----------+
| dep |
+-----------+
| 咨询部 |
| 教学部 |
| 教职部 |
+-----------+2. 如果就像以姓名进行分组, 可以, 但没多大意义, 原因name值基本上都不相同, 以组考虑会导致组内大多只要一条记录(自成一组), 组的利用就不是很强烈, 此类分组是无意义的
select namefrom emp group by name; #可以分组, 意义不大
考虑的三个问题: 以什么分组(相同数据较多的字段) 分组后的考虑单位(组并非组内的每一条记录) 可以查询的结果(当前分组的字段及聚合函数形成的聚合结果)