# 分组查询
/*
语法:
select 分组函数,列(group by中出现的字段)
from 表
【where 筛选条件】
group by 分组的列表(单个字段,多个字段,函数,表达式)
【having 分组后筛选】
【order by 子句】

执行顺序:
表 -> 分组前筛选 -> group by分小组 -> 分组统计 -> 分组后筛选 -> 排序

注意:
查询列表比较特殊:分组函数(统计值,一组一值), group by后出现的字段

特点:
1、分组查询中的筛选条件分为两类
分组前的筛选 原始表 筛选条件位于group by子句之前 where关键字
分组后的筛选 分组后的结果 筛选条件位于group by子句之后 having关键字

分组函数做筛选条件,肯定是在having子句,既分组后的筛选
*/

# 引入:查询每个部门的平均工资
# 本质:分组->小表
SELECT AVG(salary),department_id # 每组保留一个department_id
FROM employees
GROUP BY department_id;

# 案例1:查询每个工种的最高工资【简单分组查询】
SELECT MAX(salary),job_id
FROM employees
GROUP BY job_id;

# 案例2:查询每个工作地的部门个数
SELECT COUNT(*),location_id
FROM departments
GROUP BY location_id;

# 添加筛选条件
# 案例1: 查询邮箱中包含a字符的,每个部门的平均工资
SELECT AVG(salary), department_id
FROM employees
WHERE email LIKE '%a%'
GROUP BY department_id;

# 案例2: 有奖金的,每个领导手下员工的最高工资
SELECT MAX(salary), manager_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY manager_id;

# 添加分组后的筛选条件【having子句】
# 案例1:哪个部门的员工个数>2
#1.查询出每个部门的员工个数,中间结果
SELECT COUNT(*),department_id
FROM employees
GROUP BY department_id;

#2.根据1的结果,筛选出员工数大于2的最终结果
SELECT COUNT(*),department_id
FROM employees
GROUP BY department_id
HAVING COUNT(*)>2;

# 案例2:查询每个工种有奖金的员工的最高工资>12000的工种编号和工资
#1)查询每个工种中有奖金的员工的最高工资【分组前的筛选】
SELECT MAX(salary),job_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id;

#2) 在1的基础上,过滤出最高工资》12000【分组后的筛选】
SELECT MAX(salary),job_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING MAX(salary)>12000;

# 案例3:查询领导编号>102的每个领导下的最低工资》5000的领导编号,以及最低工资
# 1. 查询领导编号>102的每个领导下的最低工资【分组前筛选】
SELECT MIN(salary),manager_id
FROM employees
WHERE manager_id>102
GROUP BY manager_id;

# 2. 在1的基础上,筛选出最低工资》5000的最低工资,领导编号【分组后筛选】
SELECT MIN(salary),manager_id
FROM employees
WHERE manager_id>102
GROUP BY manager_id
HAVING MIN(salary)>5000;

# 按表达式/函数,分组查询
# 案例1:按员工姓名长度进行分组,查询每组员工的个数,筛选出员工个数>5
#1 按员工姓名长度进行分组,查询每组员工个数
SELECT COUNT(*), LENGTH(last_name)
FROM employees
GROUP BY LENGTH(last_name);

#2 分组后增加筛选条件
SELECT COUNT(*), LENGTH(last_name)
FROM employees
GROUP BY LENGTH(last_name)
HAVING COUNT(*)>5;

# 按多个字段分组查询
# 案例1:查询每个部门每个工种的员工平均工资
SELECT AVG(salary),job_id,department_id
FROM employees
GROUP BY department_id,job_id; # 先按部门分组,再按工种分组

# 添加排序
# 案例1:查询每个部门每个工种的员工平均工资,从高到低显示平均工资高于1万的结果
SELECT AVG(salary),department_id,job_id
FROM employees
WHERE department_id IS NOT NULL
GROUP BY department_id,job_id
HAVING AVG(salary)>10000
ORDER BY AVG(salary) DESC; # 对最终结果的排序

06_MySQL DQL_分组查询的更多相关文章

  1. MySQL时间分组查询

    表TESTER 字段:id -- INT    date  -- TIMESTAMP 1.如何按年.月.日分组查询? select DATE_FORMAT(date,'%Y-%m-%d') time, ...

  2. 关系数据库SQL之基本数据查询:子查询、分组查询、模糊查询

    前言 上一篇关系数据库常用SQL语句语法大全主要是关系型数据库大体结构,本文细说一下关系型数据库查询的SQL语法. 语法回顾 SELECT [ALL|DISTINCT] <目标列表达式>[ ...

  3. Hibernate 分组查询 子查询 原生SQL

    分组查询: 使用group by关键字对数据分组,使用having关键字对分组数据设定约束条件,从而完成对数据分组和统计 1.1 聚合函数:常被用来实现数据统计功能 ① count() 统计记录条数 ...

  4. mysql 分组查询问题 group_concat

    这几天在做购物车的时候.购物车内的商品为一个商品占一行,结果再从数据库读出的时候,没有分组,而是循环所有的内容出来,然后进行判断.如果一样的话就把他保存到一个变量中.但是自己逻辑没搞清楚.一直出bug ...

  5. mongodb 分组查询

    数据的保存 include_once 'mDB.class.php'; $m=new mDB(); $m->setDB('mydb'); // $m->save('stu',['dept' ...

  6. 08章 分组查询、子查询、原生SQL

    一.分组查询 使用group by关键字对数据分组,使用having关键字对分组数据设定约束条件,从而完成对数据分组和统计 1.1 聚合函数:常被用来实现数据统计功能 ① count() 统计记录条数 ...

  7. Mongodb for C# 分组查询

    #region 排序获取集合 static List<BsonDocument> GetPagerWithGroup(string connectionString, string dat ...

  8. SQL分组查询group by

    注意:select 后的字段,必须要么包含在group by中,要么包含在having 后的聚合函数里. 1. GROUP BY 是分组查询, 一般 GROUP BY 是和聚合函数配合使用 group ...

  9. SQL group by分组查询(转)

    本文导读:在实际SQL应用中,经常需要进行分组聚合,即将查询对象按一定条件分组,然后对每一个组进行聚合分析.创建分组是通过GROUP BY子句实现的.与WHERE子句不同,GROUP BY子句用于归纳 ...

随机推荐

  1. js Ajax 跨域请求

    一.使用jsonp的方式(只支持get请求) 二.使用cors的方式(支持HTTP的大部分请求方式) 三.apache的转发(修改服务器配置) 没有试验,暂时不详细写!

  2. c++ caffe 输出 activation map 、 层参数

    python输出activation map与层参数:https://blog.csdn.net/tina_ttl/article/details/51033660 caffe::Net文档: htt ...

  3. DtypeWarning: Columns (1,5,7,16,......) have mixed types. Specify dtype option on import or set low_memory=False.

    DtypeWarning: Columns (1,5,7,16,......) have mixed types. Specify dtype option on import or set low_ ...

  4. mysql数据池设置

    参考链接https://www.cnblogs.com/KKSoft/p/8040374.html python的数据库连接池包:DBUtils DBUtils提供两种外部接口: Persistent ...

  5. 可能引起「We Were Unable to Load Disqus」错误的一种情况分析

    今天想往Octopress里加评论,之前看了网上的教程,应该是简单的事情,因为Octopress本来为你准备好了评论插件Disqus的代码,只需要去Disqus注册个帐号,然后在_config.yml ...

  6. 02-django查询

      目录 (一)查询 1 .基本查询(等于.大于.包含字符.日期.字段比较.逻辑) 2 .关联查询(即为join查询)(一对多.多对多.一对一) 3 .聚合查询(统计查询) (二)关联对象(已知A表的 ...

  7. 深入了解跟踪(trace)

    深入了解跟踪(trace) 转自:https://www.cnblogs.com/zhijianliutang/p/4113911.html 前言 一提到跟踪俩字,很多人想到警匪片中的场景,同样在我们 ...

  8. spring MVC学习(三)

    1. @RequestMapping: 在请求的路径中传递参数:参数作为路径的一部分,可以在路径中直接使用 {paramName}来表示,另一种就是更加传统的表示方式?paramName=paramV ...

  9. python学习笔记(二十四)继承与封装

    继承(extends)就是把多个类中相同的成员给提取出来定义到一个独立的类中,然后让这多个类和该独立的类产生一个关系,这多个类就具备了这些类容,这个关系就叫做继承. 实现继承的类称为子类,也叫派生类, ...

  10. matplotlib中的legend()—显示图例

    源自  matplotlib中的legend()——用于显示图例 -- 博客园 http://www.cnblogs.com/yinheyi/p/6792120.html legend()的一个用法: ...