mysql 数据操作 单表查询 group by 介绍
group by 是在where 之后运行
在写单表查询语法的时候 应该把group by 写在 where 之后
执行顺序
1.先找到表 from 库.表名
2.按照where 约束条件 过滤你想要的记录
3.group by 进行分组
4.分完组以后 再进行相应的查询
分组查询:GROUP BY
一 什么是分组?为什么要分组?
分类一定要找大家都有一样的属性
- #1、首先明确一点:分组发生在where之后,即分组是基于where之后得到的记录而进行的
- #2、分组指的是:将所有记录按照某个相同字段进行归类,比如针对员工信息表的职位分组,或者按照性别进行分组等
- #3、为何要分组呢?
- 取每个部门的最高工资
- 取每个部门的员工数
- 取男人数和女人数
- 小窍门:‘每’这个字后面的字段,就是我们分组的依据
- #4、大前提:
- 可以按照任意字段分组,但是分组完毕后,比如group by post,只能查看post字段,如果想查看组内信息,需要借助于聚合函数
- mysql> select * from employee;
- +----+------------+--------+-----+------------+-----------+--------------+------------+--------+-----------+
- | id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id |
- +----+------------+--------+-----+------------+-----------+--------------+------------+--------+-----------+
- | 1 | alex | male | 78 | 2015-03-02 | teacher | NULL | 1000000.31 | 401 | 1 |
- | 2 | yuanhao | male | 73 | 2014-07-01 | teacher | NULL | 3500.00 | 401 | 1 |
- | 3 | liwenzhou | male | 28 | 2012-11-01 | teacher | NULL | 2100.00 | 401 | 1 |
- | 4 | jingliyang | female | 18 | 2011-02-11 | teacher | NULL | 9000.00 | 401 | 1 |
- | 5 | jinxin | male | 18 | 1900-03-01 | teacher | NULL | 30000.00 | 401 | 1 |
- | 6 | 成龙 | male | 48 | 2010-11-11 | teacher | NULL | 10000.00 | 401 | 1 |
- | 7 | 歪歪 | female | 48 | 2015-03-11 | sale | NULL | 3000.13 | 402 | 2 |
- | 8 | 丫丫 | female | 38 | 2010-11-01 | sale | NULL | 2000.35 | 402 | 2 |
- | 9 | 丁丁 | female | 18 | 2011-03-12 | sale | NULL | 1000.37 | 402 | 2 |
- | 10 | 星星 | female | 18 | 2016-05-13 | sale | NULL | 3000.29 | 402 | 2 |
- | 11 | 格格 | female | 28 | 2017-01-27 | sale | NULL | 4000.33 | 402 | 2 |
- | 12 | 张野 | male | 28 | 2016-03-11 | operation | NULL | 10000.13 | 403 | 3 |
- | 13 | 程咬金 | male | 18 | 1997-03-12 | operation | NULL | 20000.00 | 403 | 3 |
- | 14 | 程咬银 | female | 18 | 2013-03-11 | operation | NULL | 19000.00 | 403 | 3 |
- | 15 | 程咬铜 | male | 18 | 2015-04-11 | operation | NULL | 18000.00 | 403 | 3 |
- | 16 | 程咬铁 | female | 18 | 2014-05-12 | operation | NULL | 17000.00 | 403 | 3 |
- +----+------------+--------+-----+------------+-----------+--------------+------------+--------+-----------+
- 16 rows in set (0.00 sec)
这样写 分完组以后 只能取分组字段post
select post from employee group by post
#由于没有设置ONLY_FULL_GROUP_BY,于是也可以有结果,默认都是组内的第一条记录,但其实这是没有意义的
- mysql> select * from employee group by post;
- +----+--------+--------+-----+------------+-----------+--------------+------------+--------+-----------+
- | id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id |
- +----+--------+--------+-----+------------+-----------+--------------+------------+--------+-----------+
- | 12 | 张野 | male | 28 | 2016-03-11 | operation | NULL | 10000.13 | 403 | 3 |
- | 7 | 歪歪 | female | 48 | 2015-03-11 | sale | NULL | 3000.13 | 402 | 2 |
- | 1 | alex | male | 78 | 2015-03-02 | teacher | NULL | 1000000.31 | 401 | 1 |
- +----+--------+--------+-----+------------+-----------+--------------+------------+--------+-----------+
- 3 rows in set (0.06 sec)
ONLY_FULL_GROUP_BY
查看现在sql_mode 模式
- mysql> select @@global.sql_mode;
- +--------------------------------------------+
- | @@global.sql_mode |
- +--------------------------------------------+
- | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
- +--------------------------------------------+
- 1 row in set (0.00 sec)
设置mysql严格模式
- "ONLY_FULL_GROUP_BY" 只能取分组的字段 以及每个组聚合函数结果
- mysql> set global sql_mode="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION ";
- Query OK, 0 rows affected (0.00 sec)
- mysql> select @@global.sql_mode;
- +---------------------------------------------------------------+
- | @@global.sql_mode |
- +---------------------------------------------------------------+
- | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
- +---------------------------------------------------------------+
- 1 row in set (0.00 sec)
退出一下mysql 再重新登mysql 查看
- mysql> quit #设置成功后,一定要退出,然后重新登录方可生效
- Bye
报错 已经是严格模式了 只能取分组的字段
- mysql> select * from employee group by post;
- ERROR 1055 (42000): 'company.employee.id' isn't in GROUP BY
- mysql> select post from employee group by post;
- +-----------+
- | post |
- +-----------+
- | operation |
- | sale |
- | teacher |
- +-----------+
- 3 rows in set (0.00 sec)
想统计每个部门的相关数据 用到聚合函数
把某一个组里面的一推人统计出结果 以组为单位统计
- #查看MySQL 5.7默认的sql_mode如下:
- mysql> select @@global.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
- #!!!注意
- ONLY_FULL_GROUP_BY的语义就是确定select target list中的所有列的值都是明确语义,
简单的说来,在ONLY_FULL_GROUP_BY模式下,target list中的值要么是来自于聚集函数的结果,要么是来自于group by list中的表达式的值。- #设置sql_mole如下操作(我们可以去掉ONLY_FULL_GROUP_BY模式):
- mysql> set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
- !!!SQL_MODE设置!!!
mysql 数据操作 单表查询 group by 介绍的更多相关文章
- mysql 数据操作 单表查询 group by 分组 目录
mysql 数据操作 单表查询 group by 介绍 mysql 数据操作 单表查询 group by 聚合函数 mysql 数据操作 单表查询 group by 聚合函数 没有group by情况 ...
- mysql 数据操作 单表查询 group by 聚合函数
强调: 如果我们用unique的字段作为分组的依据,则每一条记录自成一组,这种分组没有意义 多条记录之间的某个字段值相同,该字段通常用来作为分组的依据 如果按照每个字段都是唯一的进行分组,意味着按照这 ...
- mysql 数据操作 单表查询 group by 练习
小练习: 1. 查询岗位名以及岗位包含的所有员工名字 mysql> select post,group_concat(name) from employee group by post ; +- ...
- mysql 数据操作 单表查询 group by 注意
GROUP BY 单独使用GROUP BY关键字分组 SELECT post FROM employee GROUP BY post; 注意:我们按照post字段分组,那么select查询的字段只能是 ...
- mysql 数据操作 单表查询 group by group_concat() 函数
# group_concat() 和concat() 一样拼接字符串 用在分组里 需求:查看每个职位都有哪些员工名字 把所有员工成员的名字都列出来 把每个职位里的员工姓名列出来 mysql> s ...
- mysql 数据操作 单表查询 group by 聚合函数 没有group by情况下
聚合函数只能用在组里使用 #没有group by 则默认算作一组 取出所有员工的最高工资 mysql> select max(salary) from employee; +---------- ...
- mysql 数据操作 单表查询 目录
mysql 数据操作 单表查询 mysql 数据操作 单表查询 简单查询 避免重复DISTINCT mysql 数据操作 单表查询 通过四则运算查询 mysql 数据操作 单表查询 concat()函 ...
- mysql 数据操作 单表查询 where 约束 目录
mysql 数据操作 单表查询 where约束 between and or mysql 数据操作 单表查询 where约束 is null in mysql 数据操作 单表查询 where约束 li ...
- mysql 数据操作 单表查询
单表查询的语法 distinct 去重 SELECT 字段1,字段2... FROM 表名 库.表名 WHERE 条件 过滤 符合条件的 GROUP BY field 分组条件 HAVING 筛选 过 ...
随机推荐
- Linux内核剖析 之 内存管理
1. 内存管理区 为什么分成不同的内存管理区? ISA总线的DMA处理器有严格的限制:仅仅能对物理内存前16M寻址. 内核线性地址空间仅仅有1G,CPU不能直接訪问全部的物理内存. ZONE_DMA ...
- c++ 向main传递参赛
1.今天写了个批处理文件 准备向main传递参赛 发现在vs2008运行正常 vs2010运行只有首字母 2.需要在项目--属性--常规-字符集里面设置成多字节就好了,以前是unicode 3.因为 ...
- write solid code 零散(原文)
整理下目录,看了这个文件,幸好未删除. 以下是<write solid code>中的原文摘录. 1.How could I have prevented this bug? 2.How ...
- Windows下配置Apache+PHP跑Wordpress拾遗
首先,我很少这么做,因为一旦有跑WAMP的需求,我就直接下一个wamp的安装包就可以了,市面上数不胜数,我一直用的是EasyPHP,不是说它有多好,而是很多年前第一次用后没什么问题,就一直用下来了.这 ...
- Dedecms当前位置{dede:field name='position'/}修改,去掉>方法
Dedecms当前位置{dede:field name='position'/}修改,如何去掉> 一.修改{dede:field name='position'/}的文字间隔符,官方默认的是&g ...
- LazyValue<T>
public void ExtendFuncT() { //():匿名无参方法.() =>方法名,指派匿名无参方法去执行另外一个方法. LazyValue<int> lazyOne ...
- oracle函数学习_根据用户id获取用户角色
create or replace function FN_GET_ROLES(v_user_id varchar2) return varchar2 istype zy_emp_cursor is ...
- Razor------引入css文件的方法
MVC3.0之前版本: <link href=@Url.Content("~/Content/Styles.css") rel="stylesheet" ...
- Effective C++ —— 设计与声明(四)
条款18 : 让接口容易被正确使用,不易被误用 欲开发一个“容易被正确使用,不容易被误用”的接口,首先必须考虑客户可能做出什么样的错误操作. 1. 明智而审慎地导入新类型对预防“接口被误用”有神奇疗 ...
- C++模板中的嵌套
在下面的程序中,我们创建了一个模板类用于实现Queue容器的部分功能,并且在模板类中潜逃使用了一个Node类.queuetp.h // queuetp.h -- queue template with ...