group by 分组

  • 分组实际应用场景
    • 男女比例
    • 部门平均薪资
    • 国家之间数据统计

    

  • 1. 按照部门分组
    • select * from empt group by post;   # 报错
    • 分组后 最小可操作单位应该是组 还不再是组内的单个数据
    • 上述命令在没有设置严格模式的时候可正常执行,返回的是分组之后 每个组第一条数据 但是这不符合分组的规范:分组后不应该考虑单个数据,应该以组为操作单位(分组后 没办法直接获取组内单个数据)
  • 设置严格模式
    • set global set_mode = 'strict_trans_tables, only_full_group_by';
  • 严格模式, 分组 默认只能拿到分组的依据
    • select post from empt group by post; 
    • 按照什么分组就只能拿到分组,其他字段不能直接获取 需要借助于一些方法
  • 需要分组的关键字
    • 每个  平均  最高   最低
    • select post,max(salary) from empt group by post;
    • as
      • 可以给字段起别名 也可以直接省略不写(不推荐)
        • select post as '部门‘,max(salary) as '最高工资' from empt group by post;
      • 给表临时起别名
        • select t1.id, t1.name from empt as t1;
    • 聚合函数(必须在分组之后使用)
      • min(salary)
      • avg(salary)
      • sum(salary)
      • count(id) 推荐id符合逻辑
        • count(任意字段均可,但是不能是内容为NULL)
        • select post,count(post_comment) from empt group by post;  # null不可
  • group_concat 
    • 支持获取分组后的其他字段值
      • select post, group_concat(name) from empt group by post;
    • 支持拼接操作
      • select post, group_concat(name,'_DSB') from empt group by post;
      • select post, group_concat(name, ':', salary) from empt group by post;
  • concat 不分组的时候用
    • select concat('NAME:',name), concat('SAL:', salary) from empt;
    • 分组之前帮助获取字段信息并且可以拼接多个字段
  • concat_ws: 
    • 如果多个字段间的连接符合是相同的情况下,可直接使用concat_ws 完成
    • select concat_ws(':', name, age, gender) from empt;

    

  • 分组注意事项
    • 关键字where和group by 同时出现的时候 group by 必须在 where 的后面
      • where先对整体数据进行过滤之后再分组操作
      • where筛选条件不能使用聚合函数
          • select id,name,age from empt where max(salary) > 3000;   #错误
      • 不分组默认整体就是一组
    • 按照书写顺序的方式写sql语句
      • select *    # 先用*占位
      • 补全后面的sql语句
      • 最后将* 替换具体字段
posted @ 2020-09-06 11:16  MelissaD  阅读(107)  评论(0)    收藏  举报