分组查询知识

本文详细介绍了SQL中的分组查询语法,通过实例展示了如何计算每个部门的工资和、每个工作岗位的工资总和,以及如何利用HAVING子句进行更复杂的过滤条件设置。同时,讲解了WHERE和HAVING的使用区别,并给出了一些高级查询示例,如找出每个部门平均薪资高于特定值的情况以及特定岗位之外的平均薪资等。

分组查询

在实际的运用中,需要先进行分组,然后对每一组的数据进行操作,这时候需要分组查询

select ... from ... group by ...;

eg:比如计算每个部门的工资和

找出每个工作岗位的工资和?

​ 实现思路:按照工作岗位进行分组,然后对工资求和

select job,sum(sal) from emp group by job;

​ 执行顺序:先从emp中查询数据;然后对job进行分组;然后对每一组数据进行求和
重点结论:在一条sql语句中,如果含有group by语句,select只能跟:参加分组的字段,以及分 组函数;其他的一律不能跟

找出每个部门的最高薪资
select deptno,max(sal) from emp group by deptno;
找出每个部门,不同工作岗位的最高薪资
select max(sal) from emp group by deptno,job;
/**按照两个字段进行分组**/
找出每个部门最高薪资,要求显示最高薪资大于3000的
select max(sal) from emp where sal>3000 group by deptno;
or
select max(sal) from emp group by deptno having max(sal)>3000;//效率低
/**可以用having来再次过滤,having必须和group by一起使用
如果where和having都可以实现,则优先使用where**/
找出每个部门平均薪资,要求显示平均薪资高于2500的
select avg(sal) from emp group by deptno having avg(sal)>2500;
/**这个只能用having实现,where不能实现,因为分组函数avg不能写在where里**/
找出每个岗位的平均薪资,要求显示平均薪资大于1500,除了MANAGER之外,要求按照平均薪资降序排列
select avg(sal) from emp where job!='MANAGER' group by job having avg(sal)>1500 order by avg(sal) desc;
MySQL 分组查询用于将查询结果按照指定列进行分组,常用于分组统计,如按部门统计人数、按工种统计工资情况等。分组查询一定会用到分组函数和 `GROUP BY` 子句 [^3]。 ### 基本语法 ```sql SELECT 列名... FROM 表名 GROUP BY 列名1, 列名2 [HAVING 条件表达式]; ``` - `GROUP BY` 后面跟字段名,即按照该字段的值进行分组,分组是所依据的列名称。 - `HAVING` 条件表达式用于限制分组后的显示,符合条件表达式的结果将被显示 [^2]。 ### 功能及作用 `GROUP BY` 子句的功能是将查询到的结果中该子句后的列完全相同的合并在一起 [^1]。 ### 注意事项 1. 在单表分组查询中,所有不是分组函数的查询字段都要出现在 `GROUP BY` 子句之后,出现的顺序不影响查询结果。 2. `WHERE` 子句一定紧跟着 `FROM` 子句,`FROM` 关键字后是操作的表对象,`WHERE` 子句中的判断条件要么是常量要么是操作的表对象的字段,且 `WHERE` 子句中不支持使用别名,子查询同样如此。 3. 通常分组前的数据筛选放在 `WHERE` 子句中,分组后的数据筛选放在 `HAVING` 子句中。但如果分组后的数据筛选条件是操作表的字段(如分组的条件),也可放在 `WHERE` 子句中,且此时效率更高。不过,`WHERE` 子句中不能使用分组函数,因为分组函数的结果并非操作表的字段。可记忆为:只要筛选条件是操作表中的字段就放在 `WHERE` 子句中,否则放在 `HAVING` 子句中 [^3]。 ### 示例 ```sql -- 示例表创建 CREATE DATABASE des; CREATE TABLE emp( id INT COMMENT '编号', warkno VARCHAR(10) COMMENT '工号', name VARCHAR(32) COMMENT '姓名', gender VARCHAR(10) COMMENT '性别', age INT COMMENT '年龄', idcard CHAR(18) COMMENT '身份证号', workaddress VARCHAR(32) COMMENT '地址', entrydate DATE COMMENT '入职时间' ) COMMENT '员工表'; -- 分组查询示例 SELECT COUNT(*), gender FROM emp GROUP BY gender; -- WHERE 和 HAVING 示例 -- 分组前筛选,效率高 SELECT COUNT(*), order_code FROM lmt_flow_advance_check_apply WHERE order_code >= 'BJ20190104' GROUP BY order_code; -- 分组后筛选 SELECT COUNT(*), order_code FROM lmt_flow_advance_check_apply GROUP BY order_code HAVING order_code >= 'BJ20190104'; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值