|NO.Z.00025|——————————|BigDataEnd|——|Java&MySQL单表/约束/事务.V03|——|MySQL.v03|DQL_分组查询|

一、DQL分组查询
### --- 分组

——>        分组查询指的是使用 GROUP BY 语句,对查询的信息进行分组,相同数据作为一组
### --- 语法格式

SELECT 分组字段/聚合函数 FROM 表名 GROUP BY 分组字段 [HAVING 条件];
二、需求1: 通过性别字段 进行分组
### --- 需求1: 通过性别字段 进行分组

-- 按照性别进行分组操作
SELECT * FROM emp GROUP BY sex; -- 注意 这样写没有意义
三、分析: GROUP BY 分组过程
### --- 注意:

~~~     分组时可以查询要分组的字段, 或者使用聚合函数进行统计操作.
~~~     * 查询其他字段没有意义
### --- 需求: 通过性别字段 进行分组,求各组的平均薪资

SELECT sex, AVG(salary) FROM emp GROUP BY sex;
四、需求2:
### --- 需求2:

~~~     查询所有部门信息
~~~     查询每个部门的平均薪资
~~~     查询每个部门的平均薪资, 部门名称不能为null
### --- SQL实现

~~~     # 查询有几个部门
SELECT dept_name AS '部门名称' FROM emp GROUP BY dept_name;
~~~     # 查询每个部门的平均薪资

SELECT
dept_name AS '部门名称',
AVG(salary) AS '平均薪资'
FROM emp GROUP BY dept_name;
~~~     # 查询每个部门的平均薪资, 部门名称不能为null

SELECT
dept_name AS '部门名称',
AVG(salary) AS '平均薪资'
FROM emp WHERE dept_name IS NOT NULL GROUP BY dept_name;
五、需求3:
### --- 需求3:

~~~     查询平均薪资大于6000的部门.
~~~     # 分析:

——>        1) 需要在分组后,对数据进行过滤,使用 关键字 hiving
——>        2) 分组操作中的having子语句,是用于在分组后对数据进行过滤的,作用类似于where条件。
### --- SQL实现:

~~~     # 查询平均薪资大于6000的部门
-- 需要在分组后再次进行过滤,使用 having
SELECT
dept_name ,
AVG(salary)
FROM emp WHERE dept_name IS NOT NULL GROUP BY dept_name HAVING AVG(salary) >
6000 ;
六、where 与 having的区别
过滤方式 特点
where where 进行分组前的过滤
where 后面不能写 聚合函数
having having 是分组后的过滤
having 后面可以写 聚合函数
七、sql语句
### --- sql语句

/*
    分组查询 使用 group by 子句
    
    语法格式: select 分组字段/聚合函数 from 表名 group by 分组字段
*/
SELECT * FROM emp GROUP BY sex;
~~~     # 通过性别字段 进行分组,求各组的平均薪资
SELECT sex, AVG(salary) FROM emp GROUP BY sex;

~~~     # 查询所有部门信息 
SELECT dept_name AS '部门名称' FROM emp GROUP BY dept_name;

~~~     # 查询每个部门的平均薪资
SELECT dept_name,AVG(salary) FROM emp GROUP BY dept_name;
~~~     # 查询每个部门的平均薪资, 部门名称不能为null

SELECT 
    dept_name AS '部门名称',
    AVG(salary) AS '部门平均薪资'
FROM emp 
WHERE dept_name IS NOT NULL 
GROUP BY dept_name;
~~~     # 查询平均薪资大于6000的部门.

-- 1. 首先要分组求平均薪资
-- 2. 求出 平均薪资大于 6000的部门

-- 在分组之后 进行条件过滤 使用:  having 判断条件

SELECT 
    dept_name,
    AVG(salary)
FROM emp 
WHERE dept_name IS NOT NULL GROUP BY dept_name 
HAVING  AVG(salary) > 6000;
/*
    where 与 having的区别
        where 
            1.在分组前进行过滤
            2.where后面不能跟 聚合函数
        having
            1.是在分组后进行条件过滤
            2.having 后面可以写 聚合函数

*/

 
 
 
 
 
 
 
 
 

Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
                                                                                                                                                   ——W.S.Landor

 

posted on   yanqi_vip  阅读(21)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示