group by 是在where 之后运行

在写单表查询语法的时候 应该把group by 写在 where 之后

执行顺序

1.先找到表 from 库.表名

2.按照where 约束条件 过滤你想要的记录

3.group by 进行分组

4.分完组以后 再进行相应的查询

分组查询:GROUP BY

一 什么是分组?为什么要分组?

分类一定要找大家都有一样的属性

  1. #1、首先明确一点:分组发生在where之后,即分组是基于where之后得到的记录而进行的
  2.  
  3. #2、分组指的是:将所有记录按照某个相同字段进行归类,比如针对员工信息表的职位分组,或者按照性别进行分组等
  4.  
  5. #3、为何要分组呢?
  6. 取每个部门的最高工资
  7. 取每个部门的员工数
  8. 取男人数和女人数
  9.  
  10. 小窍门:‘每’这个字后面的字段,就是我们分组的依据
  11.  
  12. #4、大前提:
  13. 可以按照任意字段分组,但是分组完毕后,比如group by post,只能查看post字段,如果想查看组内信息,需要借助于聚合函数
  1. mysql> select * from employee;
  2. +----+------------+--------+-----+------------+-----------+--------------+------------+--------+-----------+
  3. | id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id |
  4. +----+------------+--------+-----+------------+-----------+--------------+------------+--------+-----------+
  5. | 1 | alex | male | 78 | 2015-03-02 | teacher | NULL | 1000000.31 | 401 | 1 |
  6. | 2 | yuanhao | male | 73 | 2014-07-01 | teacher | NULL | 3500.00 | 401 | 1 |
  7. | 3 | liwenzhou | male | 28 | 2012-11-01 | teacher | NULL | 2100.00 | 401 | 1 |
  8. | 4 | jingliyang | female | 18 | 2011-02-11 | teacher | NULL | 9000.00 | 401 | 1 |
  9. | 5 | jinxin | male | 18 | 1900-03-01 | teacher | NULL | 30000.00 | 401 | 1 |
  10. | 6 | 成龙 | male | 48 | 2010-11-11 | teacher | NULL | 10000.00 | 401 | 1 |
  11. | 7 | 歪歪 | female | 48 | 2015-03-11 | sale | NULL | 3000.13 | 402 | 2 |
  12. | 8 | 丫丫 | female | 38 | 2010-11-01 | sale | NULL | 2000.35 | 402 | 2 |
  13. | 9 | 丁丁 | female | 18 | 2011-03-12 | sale | NULL | 1000.37 | 402 | 2 |
  14. | 10 | 星星 | female | 18 | 2016-05-13 | sale | NULL | 3000.29 | 402 | 2 |
  15. | 11 | 格格 | female | 28 | 2017-01-27 | sale | NULL | 4000.33 | 402 | 2 |
  16. | 12 | 张野 | male | 28 | 2016-03-11 | operation | NULL | 10000.13 | 403 | 3 |
  17. | 13 | 程咬金 | male | 18 | 1997-03-12 | operation | NULL | 20000.00 | 403 | 3 |
  18. | 14 | 程咬银 | female | 18 | 2013-03-11 | operation | NULL | 19000.00 | 403 | 3 |
  19. | 15 | 程咬铜 | male | 18 | 2015-04-11 | operation | NULL | 18000.00 | 403 | 3 |
  20. | 16 | 程咬铁 | female | 18 | 2014-05-12 | operation | NULL | 17000.00 | 403 | 3 |
  21. +----+------------+--------+-----+------------+-----------+--------------+------------+--------+-----------+
  22. 16 rows in set (0.00 sec)

这样写 分完组以后 只能取分组字段post

select post from employee group by post

  1. #由于没有设置ONLY_FULL_GROUP_BY,于是也可以有结果,默认都是组内的第一条记录,但其实这是没有意义的
  1. mysql> select * from employee group by post;
  2. +----+--------+--------+-----+------------+-----------+--------------+------------+--------+-----------+
  3. | id | name | sex | age | hire_date | post | post_comment | salary | office | depart_id |
  4. +----+--------+--------+-----+------------+-----------+--------------+------------+--------+-----------+
  5. | 12 | 张野 | male | 28 | 2016-03-11 | operation | NULL | 10000.13 | 403 | 3 |
  6. | 7 | 歪歪 | female | 48 | 2015-03-11 | sale | NULL | 3000.13 | 402 | 2 |
  7. | 1 | alex | male | 78 | 2015-03-02 | teacher | NULL | 1000000.31 | 401 | 1 |
  8. +----+--------+--------+-----+------------+-----------+--------------+------------+--------+-----------+
  9. 3 rows in set (0.06 sec)

ONLY_FULL_GROUP_BY

查看现在sql_mode 模式

  1. mysql> select @@global.sql_mode;
  2. +--------------------------------------------+
  3. | @@global.sql_mode |
  4. +--------------------------------------------+
  5. | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
  6. +--------------------------------------------+
  7. 1 row in set (0.00 sec)

设置mysql严格模式

  1. "ONLY_FULL_GROUP_BY" 只能取分组的字段 以及每个组聚合函数结果
  1. mysql> set global sql_mode="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION ";
  2. Query OK, 0 rows affected (0.00 sec)
  3.  
  4. mysql> select @@global.sql_mode;
  5. +---------------------------------------------------------------+
  6. | @@global.sql_mode |
  7. +---------------------------------------------------------------+
  8. | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
  9. +---------------------------------------------------------------+
  10. 1 row in set (0.00 sec)

退出一下mysql 再重新登mysql 查看

  1. mysql> quit #设置成功后,一定要退出,然后重新登录方可生效
  2. Bye

报错 已经是严格模式了 只能取分组的字段

  1. mysql> select * from employee group by post;
  2. ERROR 1055 (42000): 'company.employee.id' isn't in GROUP BY
  1. mysql> select post from employee group by post;
  2. +-----------+
  3. | post |
  4. +-----------+
  5. | operation |
  6. | sale |
  7. | teacher |
  8. +-----------+
  9. 3 rows in set (0.00 sec)

想统计每个部门的相关数据 用到聚合函数

把某一个组里面的一推人统计出结果 以组为单位统计

  1. #查看MySQL 5.7默认的sql_mode如下:
  2. mysql> select @@global.sql_mode;
  3. 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
  4.  
  5. #!!!注意
  6. ONLY_FULL_GROUP_BY的语义就是确定select target list中的所有列的值都是明确语义,
    简单的说来,在ONLY_FULL_GROUP_BY模式下,target list中的值要么是来自于聚集函数的结果,要么是来自于group by list中的表达式的值。
  7.  
  8. #设置sql_mole如下操作(我们可以去掉ONLY_FULL_GROUP_BY模式):
  9. 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';
  10.  
  11. !!!SQL_MODE设置!!!

mysql 数据操作 单表查询 group by 介绍的更多相关文章

  1. mysql 数据操作 单表查询 group by 分组 目录

    mysql 数据操作 单表查询 group by 介绍 mysql 数据操作 单表查询 group by 聚合函数 mysql 数据操作 单表查询 group by 聚合函数 没有group by情况 ...

  2. mysql 数据操作 单表查询 group by 聚合函数

    强调: 如果我们用unique的字段作为分组的依据,则每一条记录自成一组,这种分组没有意义 多条记录之间的某个字段值相同,该字段通常用来作为分组的依据 如果按照每个字段都是唯一的进行分组,意味着按照这 ...

  3. mysql 数据操作 单表查询 group by 练习

    小练习: 1. 查询岗位名以及岗位包含的所有员工名字 mysql> select post,group_concat(name) from employee group by post ; +- ...

  4. mysql 数据操作 单表查询 group by 注意

    GROUP BY 单独使用GROUP BY关键字分组 SELECT post FROM employee GROUP BY post; 注意:我们按照post字段分组,那么select查询的字段只能是 ...

  5. mysql 数据操作 单表查询 group by group_concat() 函数

    # group_concat() 和concat() 一样拼接字符串 用在分组里 需求:查看每个职位都有哪些员工名字 把所有员工成员的名字都列出来 把每个职位里的员工姓名列出来 mysql> s ...

  6. mysql 数据操作 单表查询 group by 聚合函数 没有group by情况下

    聚合函数只能用在组里使用 #没有group by 则默认算作一组 取出所有员工的最高工资 mysql> select max(salary) from employee; +---------- ...

  7. mysql 数据操作 单表查询 目录

    mysql 数据操作 单表查询 mysql 数据操作 单表查询 简单查询 避免重复DISTINCT mysql 数据操作 单表查询 通过四则运算查询 mysql 数据操作 单表查询 concat()函 ...

  8. mysql 数据操作 单表查询 where 约束 目录

    mysql 数据操作 单表查询 where约束 between and or mysql 数据操作 单表查询 where约束 is null in mysql 数据操作 单表查询 where约束 li ...

  9. mysql 数据操作 单表查询

    单表查询的语法 distinct 去重 SELECT 字段1,字段2... FROM 表名 库.表名 WHERE 条件 过滤 符合条件的 GROUP BY field 分组条件 HAVING 筛选 过 ...

随机推荐

  1. Linux内核剖析 之 内存管理

    1. 内存管理区 为什么分成不同的内存管理区? ISA总线的DMA处理器有严格的限制:仅仅能对物理内存前16M寻址. 内核线性地址空间仅仅有1G,CPU不能直接訪问全部的物理内存. ZONE_DMA  ...

  2. c++ 向main传递参赛

    1.今天写了个批处理文件 准备向main传递参赛  发现在vs2008运行正常 vs2010运行只有首字母 2.需要在项目--属性--常规-字符集里面设置成多字节就好了,以前是unicode 3.因为 ...

  3. write solid code 零散(原文)

    整理下目录,看了这个文件,幸好未删除. 以下是<write solid code>中的原文摘录. 1.How could I have prevented this bug? 2.How ...

  4. Windows下配置Apache+PHP跑Wordpress拾遗

    首先,我很少这么做,因为一旦有跑WAMP的需求,我就直接下一个wamp的安装包就可以了,市面上数不胜数,我一直用的是EasyPHP,不是说它有多好,而是很多年前第一次用后没什么问题,就一直用下来了.这 ...

  5. Dedecms当前位置{dede:field name='position'/}修改,去掉>方法

    Dedecms当前位置{dede:field name='position'/}修改,如何去掉> 一.修改{dede:field name='position'/}的文字间隔符,官方默认的是&g ...

  6. LazyValue<T>

    public void ExtendFuncT() { //():匿名无参方法.() =>方法名,指派匿名无参方法去执行另外一个方法. LazyValue<int> lazyOne ...

  7. oracle函数学习_根据用户id获取用户角色

    create or replace function FN_GET_ROLES(v_user_id varchar2) return varchar2 istype zy_emp_cursor is ...

  8. Razor------引入css文件的方法

    MVC3.0之前版本: <link href=@Url.Content("~/Content/Styles.css") rel="stylesheet" ...

  9. Effective C++ —— 设计与声明(四)

    条款18 : 让接口容易被正确使用,不易被误用 欲开发一个“容易被正确使用,不容易被误用”的接口,首先必须考虑客户可能做出什么样的错误操作.  1. 明智而审慎地导入新类型对预防“接口被误用”有神奇疗 ...

  10. C++模板中的嵌套

    在下面的程序中,我们创建了一个模板类用于实现Queue容器的部分功能,并且在模板类中潜逃使用了一个Node类.queuetp.h // queuetp.h -- queue template with ...