06_MySQL DQL_分组查询
# 分组查询
/*
语法:
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_分组查询的更多相关文章
- MySQL时间分组查询
表TESTER 字段:id -- INT date -- TIMESTAMP 1.如何按年.月.日分组查询? select DATE_FORMAT(date,'%Y-%m-%d') time, ...
- 关系数据库SQL之基本数据查询:子查询、分组查询、模糊查询
前言 上一篇关系数据库常用SQL语句语法大全主要是关系型数据库大体结构,本文细说一下关系型数据库查询的SQL语法. 语法回顾 SELECT [ALL|DISTINCT] <目标列表达式>[ ...
- Hibernate 分组查询 子查询 原生SQL
分组查询: 使用group by关键字对数据分组,使用having关键字对分组数据设定约束条件,从而完成对数据分组和统计 1.1 聚合函数:常被用来实现数据统计功能 ① count() 统计记录条数 ...
- mysql 分组查询问题 group_concat
这几天在做购物车的时候.购物车内的商品为一个商品占一行,结果再从数据库读出的时候,没有分组,而是循环所有的内容出来,然后进行判断.如果一样的话就把他保存到一个变量中.但是自己逻辑没搞清楚.一直出bug ...
- mongodb 分组查询
数据的保存 include_once 'mDB.class.php'; $m=new mDB(); $m->setDB('mydb'); // $m->save('stu',['dept' ...
- 08章 分组查询、子查询、原生SQL
一.分组查询 使用group by关键字对数据分组,使用having关键字对分组数据设定约束条件,从而完成对数据分组和统计 1.1 聚合函数:常被用来实现数据统计功能 ① count() 统计记录条数 ...
- Mongodb for C# 分组查询
#region 排序获取集合 static List<BsonDocument> GetPagerWithGroup(string connectionString, string dat ...
- SQL分组查询group by
注意:select 后的字段,必须要么包含在group by中,要么包含在having 后的聚合函数里. 1. GROUP BY 是分组查询, 一般 GROUP BY 是和聚合函数配合使用 group ...
- SQL group by分组查询(转)
本文导读:在实际SQL应用中,经常需要进行分组聚合,即将查询对象按一定条件分组,然后对每一个组进行聚合分析.创建分组是通过GROUP BY子句实现的.与WHERE子句不同,GROUP BY子句用于归纳 ...
随机推荐
- 十个技巧迅速提升JQuery性能
本文提供即刻提升你的脚本性能的十个步骤.不用担心,这并不是什么高深的技巧.人人皆可运用!这些技巧包括: 使用最新版本 合并.最小化脚本 用for替代each 用ID替代class选择器 给选择器指定前 ...
- echarts将折线图改为曲线图
只要在 series中加上属性: smooth: true(true为曲线.flase为直线)
- Ansible安装过程中常遇到的错误(FAQ)
1.安装完成后允许命令报错 Traceback (most recent call last): File , in <module> (runner, results) = cli.ru ...
- D. Mike and Feet---cf548D(最值)
题目链接:http://codeforces.com/problemset/problem/548/D 给你n个数,对于(1,n)长度,让你找到线段的最小值的最大值是多少 #include<io ...
- Bone Collector II---hdu2639(01背包求第k优解)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2639求01背包的第k大解.合并两个有序序列 选取物品i,或不选.最终的结果,是我们能在O(1)的时间内 ...
- Number Sequence---hdu1711(kmp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 题意就是求b数组在a数组出现的位置:就是kmp模板: #include<stdio.h&g ...
- riemann的安装和使用
Riemann monitors distributed systems. 具体介绍就不多说了,一个分布式的监控系统.可以接收各种event上报,然后通过强大的脚本和插件,展示曲线,柱状,饼图等来对系 ...
- Linux系统——磁盘管理
磁盘结构 (1)硬盘的物理结构 磁头:每面一个磁盘 盘片:硬盘有多个盘片,每个盘片2面 (2)硬盘的数据结构 扇区:盘片被分为多个扇形区域,每个扇形区存放512字节的数据 磁道:统一盘片不同半径的同心 ...
- 转:WebClient类(温习一下)
WebClient类提供向 URI 标识的资源发送数据和从 URI 标识的资源接收数据的公共方法. 其实就相当于创建一个请求客户端.可以获取网页和各种各样的信息,包括交互. 通过MSDN来看看WebC ...
- modelform 使用
modelForm (1) model的知识点: class UserInfo(AbstractUser): tel = models.CharField(max_length=32) gender ...