# 分组查询
/*
语法:
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. flask系列

    1.flask基础 2.flask上下文 3.flask源码剖析--请求流程 4.数据库连接池DButils 5.Flask-Session 6.WTForms 7.Flask-SQLAlchemy ...

  2. 持续集成之戏说Check-in Dance(转)

    add by zhj: 先说一下持续集成的定义,这是ThoughtWorks首席科学家Martin Fowler在<持续集成>第二版中给出的,“持续集成是一种软件开发实践.在持续集成中,团 ...

  3. Python高级特性(1):Iterators、Generators和itertools(转)

    译文:Python高级特性(1):Iterators.Generators和itertools [译注]:作为一门动态脚本语言,Python 对编程初学者而言很友好,丰富的第三方库能够给使用者带来很大 ...

  4. OCR技术浅探: 光学识别(3)

    经过前面的文字定位和文本切割,我们已经能够找出图像中单个文字的区域,接下来可以建立相应的模型对单字进行识别. 模型选择 在模型方面,我们选择了深度学习中的卷积神经网络模型,通过多层卷积神经网络,构建了 ...

  5. Selenium+Python学习之一

    刚入门selenium+Python,实验成功之后,记录一下过程. 首先是在知乎上面看到一个关于selenium+python的示例,于是自己便尝试搭建环境上手实验. 按照作者的代码敲一遍之后执行,竟 ...

  6. django的所有app放在一个文件夹下便于管理

    1.新建一个python Package,名字叫apps 2.拖拽以后的app到apps文件夹下,把Search for references勾选去掉,重要重要重要!!!! 3.右键点击apps文件夹 ...

  7. PKU 1655 Balancing Act(树+树的重心)

    #include<cstdio> #include<cstring> #include<algorithm> #define maxn 20005 using na ...

  8. PL/SQL编程—函数

    SQL> select * from mytest; ID NAME PASSWD SALARY ----- -------------------- -------------------- ...

  9. 在Linux下不重启让配置文件修改后立即生效的办法

    在linux修改配置文件后可能没有生效,比如JDK文件配置,配置后可能没有生效,为了让文件生效,如下操作可以让配置文件生效. 例如,我刚修改了“/etc/profile”或“~/.bash_profi ...

  10. Web服务器实现文件传输程序设计

    总体概括来说就是设计一个Web服务器的流程,将执行流程分为简单的步骤,每个步骤作为一个模块来实现. 1.整体设计 服务器程序发送文件给客户端或者从客户端接收文件,每次通信只能做一次文件传输,传输完毕后 ...