-
2021-08-24 10:45:03
1.基本语法:
select 查询列表 from 表 【where 筛选条件】 group by 分组的字段 【order by 排序的字段】;
特点:
1、和分组函数一同查询的字段必须是group by后出现的字段
2、筛选分为两类:分组前筛选和分组后筛选分类 针对的表 位置 连接的关键字 分组前筛选 原始表 group by前 where 分组后筛选 group by后的结果集 group by后 having 问题1:分组函数做筛选能不能放在where后面
答:不能问题2:where——group by——having
一般来讲,能用分组前筛选的,尽量使用分组前筛选,提高效率
3、分组可以按单个字段也可以按多个字段
4、可以搭配着排序使用2.简单的分组
#案例1:查询每个工种的员工平均工资 SELECT AVG(salary),job_id FROM employees GROUP BY job_id; #案例2:查询每个位置的部门个数 SELECT COUNT(*),location_id FROM departments GROUP BY location_id;
3.可以实现分组前的筛选
#案例1:查询邮箱中包含a字符的 每个部门的最高工资 SELECT MAX(salary),department_id FROM employees WHERE email LIKE '%a%' GROUP BY department_id; #案例2:查询有奖金的每个领导手下员工的平均工资 SELECT AVG(salary),manager_id FROM employees WHERE commission_pct IS NOT NULL GROUP BY manager_id;
4.分组后筛选
#案例:查询哪个部门的员工个数>5 #(1)查询每个部门的员工个数 SELECT COUNT(*),department_id FROM employees GROUP BY department_id; #(2)筛选刚才(1)结果 SELECT COUNT(*),department_id FROM employees GROUP BY department_id HAVING COUNT(*)>5; #案例2:每个工种有奖金的员工的最高工资>12000的工种编号和最高工资 SELECT job_id,MAX(salary) FROM employees WHERE commission_pct IS NOT NULL GROUP BY job_id HAVING MAX(salary)>12000; #案例3:领导编号>102的每个领导手下的最低工资大于5000的领导编号和最低工资 manager_id>102 SELECT manager_id,MIN(salary) FROM employees GROUP BY manager_id HAVING MIN(salary)>5000;
5.分组后添加排序
#案例:每个工种有奖金的员工的最高工资>6000的工种编号和最高工资,按最高工资升序 SELECT job_id,MAX(salary) m FROM employees WHERE commission_pct IS NOT NULL GROUP BY job_id HAVING m>6000 ORDER BY m ;
6.按多个字段分组
#案例:查询每个工种每个部门的最低工资,并按最低工资降序 SELECT MIN(salary),job_id,department_id FROM employees GROUP BY department_id,job_id ORDER BY MIN(salary) DESC;
更多相关内容 -
sql分组查询和聚合函数
2018-10-25 10:58:02sql基础之分组查询和聚合函数,简洁的描述了查询的语法和规则,列举实例容易理解。 -
SQL分组查询数据
2022-04-18 20:27:22我们在生活中会碰到不少分组的情况,比如常见的根据性别来分组,男的一组,女的一组,所以在SQL中也可以对数据进行分组,这样可以更加便利的操作数据 1.Group By 语句 Group By 从字面意义上理解就是根据“By”...我们在生活中会碰到不少分组的情况,比如常见的根据性别来分组,男的一组,女的一组,所以在SQL中也可以对数据进行分组,这样可以更加便利的操作数据
1.Group By 语句
Group By 从字面意义上理解就是根据“By”指定的条件对数据进行分组,所谓的分组就是将一个“数据集” 划分成若干个“小区域”,然后针 对若干个“小区域”进行数据处理,你也可以想象成将数据分成多个集合。 以下是 GROUP BY 子句的语法:
Select T1.ID from Table T1
Group By T1.ID
上面的意思就是根据T1表中相同的ID来分组,假设T1中有1,2,1,4这四个数据,那就是分成三组,1,2,4
2.聚合函数
GROUP BY 子句通常与聚合函数一起用于统计数据。聚合函数对组执行计算并返回每个组的唯一值。例如,COUNT()函数返回每个组中的行数。其他常用的聚合函数是:SUM(),AVG(),MIN(),MAX()。 GROUP BY 子句将行排列成组,聚合函数返回每个组的统计量(总数量,总和,平均值,最小值,最大值等)。
不过要注意,当使用Group By 时,选择列表只能写Group By的条件或者是聚合函数,否则就会报以下错误
就拿1中的语法来说,
给你演示错误的
Select T1.Name from table T1
Group By T1.ID
因为是以ID来分组,所以选择列表T1.Name是不行的,正确的是
Select T1.ID,Count(*) from table T1
Group By T1.ID
返回的是这个ID一共有多少行
3.Having 子句
这个的作用就是筛选数据,类似于Where,但在Group By中Where子句会受到限制,所以就用Having子句,语法:
Select T1.ID from table T1
Where T1.Age > 30
Group By T1.ID
Having Sum(T1.Money)>30000
首先筛选出年龄大于30的(where可以用在Group By前面,但不可以用在后面),根据ID分组,再筛选钱大于30000的
-
MySQL SQL分组查询
2021-12-25 14:53:26DQL语言-分组查询 一、group by 子句 语法: select 分组函数,列(要求出现在group by)的后面 from 表 【where 筛选条件】 group by 分组的列表 【order by 子句】 注意: 查询列表必须特殊,要求是分组函数和group...一、group by 子句
语法:
select 分组函数,列(要求出现在group by)的后面
from 表
【where 筛选条件】
group by 分组的列表
【order by 子句】注意:
查询列表必须特殊,要求是分组函数和group by 后出现的字段
特点:
1、分组查询中的筛选条件分为两类
数据源 位置 关键字 分组前的筛选 原始表 group by 前面 where 分组后的筛选 分组后的新表 group by 后面 having 分组函数做条件肯定是放在having子句后面
能用分组前筛选的,就优先使用分组前筛选
2、group by子句支持
单个字段分组
多个字段分组(多个字段按照逗号隔开,没有顺序要求)
表达式或者函数(用的相对较少)
3、也可以添加排序,排序放在整个分组查询的最后面二、案例
1、查询每个工种的最高工资
select MAX(salary) 工种最高工资,job_id 工种 from employees group by job_id;
2、查询每个位置上的部门个数
3、添加筛选条件
查询邮箱中包含a字符的,每个部门的平均工资
4、查询有奖金的每个领导手下员工的最高工资
5、添加比较复杂的筛选条件
查询哪个部门的员工个数大于2
步骤1:查询每个部门的员工个数
步骤2:根据步骤一的结果再去筛选员工个数大于2的部门
6、查询有奖金的员工的工资大于12000的工种编号和最高工资
7、查询(领导编号>102)的每个领导手下的最低工资>5000的领导编号,以及其手下的最低工资
8、按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>5的有哪些
按函数和表达式分组
9、查询每个部门每个工种的员工的平均工资
按多个字段分组
10、查询每个部门每个工种的员工的平均工资,并且从高到底排序
-
Mybatis:动态SQL分组查询
2020-08-19 14:27:411. 实现思路 ...--分组查询证书信息列表--> <resultMap id="groupResultMap" type="java.util.Map"> <result column="count(1)" property="num" jdbcType="VARCHAR"/> <res..目录
1. 实现思路
利用Mybatis 动态SQL 拼装Group By 语句,实现单个和多个字段分组
2. 代码实现
2.1 mapper
<!--分组查询证书信息列表--> <resultMap id="groupResultMap" type="java.util.Map"> <result column="count(1)" property="num" jdbcType="VARCHAR"/> <result column="user_unit" jdbcType="VARCHAR" property="userUnit"/> <result column="train_cycle_zh" jdbcType="VARCHAR" property="trainCycleZh"/> <result column="train_cycle_en" jdbcType="VARCHAR" property="trainCycleEn"/> <result column="train_major_zh" jdbcType="VARCHAR" property="trainMajorZh"/> <result column="train_major_en" jdbcType="VARCHAR" property="trainMajorEn"/> <result column="certif_type" jdbcType="VARCHAR" property="certifType"/> <result column="certif_status" jdbcType="INTEGER" property="certifStatus"/> </resultMap> <select id="groupCetifInfoBySelective" parameterType="com.ruoyi.certif.domain.CertifInfoDO" resultMap="groupResultMap"> SELECT COUNT(1), <trim suffixOverrides=","> <if test="userUnit != null"> user_unit, </if> <if test="trainCycleZh != null"> train_cycle_zh, </if> <if test="trainCycleEn != null"> train_cycle_en, </if> <if test="trainMajorZh != null"> train_major_zh, </if> <if test="trainMajorEn != null"> train_major_en, </if> <if test="certifType != null"> certif_type, </if> <if test="certifStatus != null"> certif_status, </if> </trim> FROM certif_info GROUP BY <trim suffixOverrides=","> <if test="userUnit != null"> user_unit, </if> <if test="trainCycleZh != null"> train_cycle_zh, </if> <if test="trainCycleEn != null"> train_cycle_en, </if> <if test="trainMajorZh != null"> train_major_zh, </if> <if test="trainMajorEn != null"> train_major_en, </if> <if test="certifType != null"> certif_type, </if> <if test="certifStatus != null"> certif_status, </if> </trim> </select>
2.2 mapper 接口
/** * 分组查询证书信息列表 * @param certifInfo * @return */ public List<Map> groupCetifInfoBySelective(CertifInfoDO certifInfo);
2.3 Service层
public AjaxResult groupCetifInfo(CertifInfoDO certifInfo) { log.info("【分组查询证书信息】,参数:{}", certifInfo); if (Objects.isNull(certifInfo)) { log.error("【分组查询证书信息列表】参数缺失"); AjaxResult.error("分组查询证书信息,参数缺失"); } List<Map> maps = certifInfoMapper.groupCetifInfoBySelective(certifInfo); return AjaxResult.success(maps); }
AjaxResult对象
import java.util.HashMap; import com.ruoyi.common.core.constant.HttpStatus; import com.ruoyi.common.core.utils.StringUtils; /** * 操作消息提醒 * */ public class AjaxResult extends HashMap<String, Object> { private static final long serialVersionUID = 1L; /** 状态码 */ public static final String CODE_TAG = "code"; /** 返回内容 */ public static final String MSG_TAG = "msg"; /** 数据对象 */ public static final String DATA_TAG = "data"; /** * 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。 */ public AjaxResult() { } /** * 初始化一个新创建的 AjaxResult 对象 * * @param code 状态码 * @param msg 返回内容 */ public AjaxResult(int code, String msg) { super.put(CODE_TAG, code); super.put(MSG_TAG, msg); } /** * 初始化一个新创建的 AjaxResult 对象 * * @param code 状态码 * @param msg 返回内容 * @param data 数据对象 */ public AjaxResult(int code, String msg, Object data) { super.put(CODE_TAG, code); super.put(MSG_TAG, msg); if (StringUtils.isNotNull(data)) { super.put(DATA_TAG, data); } } /** * 返回成功消息 * * @return 成功消息 */ public static AjaxResult success() { return AjaxResult.success("操作成功"); } /** * 返回成功数据 * * @return 成功消息 */ public static AjaxResult success(Object data) { return AjaxResult.success("操作成功", data); } /** * 返回成功消息 * * @param msg 返回内容 * @return 成功消息 */ public static AjaxResult success(String msg) { return AjaxResult.success(msg, null); } /** * 返回成功消息 * * @param msg 返回内容 * @param data 数据对象 * @return 成功消息 */ public static AjaxResult success(String msg, Object data) { return new AjaxResult(HttpStatus.SUCCESS, msg, data); } /** * 返回错误消息 * * @return */ public static AjaxResult error() { return AjaxResult.error("操作失败"); } /** * 返回错误消息 * * @param msg 返回内容 * @return 警告消息 */ public static AjaxResult error(String msg) { return AjaxResult.error(msg, null); } /** * 返回错误消息 * * @param msg 返回内容 * @param data 数据对象 * @return 警告消息 */ public static AjaxResult error(String msg, Object data) { return new AjaxResult(HttpStatus.ERROR, msg, data); } /** * 返回错误消息 * * @param code 状态码 * @param msg 返回内容 * @return 警告消息 */ public static AjaxResult error(int code, String msg) { return new AjaxResult(code, msg, null); } }
2.4 controller
/** * 分组查询证书信息列表 */ @GetMapping("/statis") public AjaxResult listGroup(CertifInfoDO certifInfo) { AjaxResult result = certifInfoService.groupCetifInfo(certifInfo); return result; }
2.5 测试
http://localhost:8081/certif/info/statis?trainMajorZh=GROUP 【中文专业分组】 http://localhost:8081/certif/info/statis?userUnit=GROUP 【用户单位分组】 http://localhost:8081/certif/info/statis?certifType=GROUP 【证书类型分组】 http://localhost:8081/certif/info/statis?certifStatus=GROUP 【证书状态分组】
-
SQL分组查询语句
2020-12-10 15:02:56SQL分组查询语句 select country(查询的列的名字), sum(case when patient_state = '5' then 1 else 0 end) as a(统计state=5的数据有多少条 并命名别名为 a) from world group by country; (按county分组) -
sql分组查询每组最新一条数据
2022-06-01 14:19:17sql分组查询最新一条数据 -
sql分组查询并获取其它字段
2021-07-01 16:17:21按照uc分组,获取score最大值,并且要获取相应的duration列 sql实现 传统的group by,不能查询额外的列 select uc, max(score) from t_ch group by uc; 查询结构: 使用row_number函数: 注意:mysql8.0版本需在... -
分组查询GROUP BY的使用与SQL执行顺序的讲解
2020-12-15 23:56:49在SQL中使用GROUP BY来对SELECT的结果进行数据分组,在具体使用GROUP BY之前需要知道一些重要的规定。 1、GROUP BY子句可以包含任意数目的列。也就是说可以在组里再分组,为数据分组提供更细致的控制。 2、如果在... -
SQL分组查询的教学探讨.pdf
2021-09-19 13:00:28SQL分组查询的教学探讨.pdf -
sql 分组查询没有记录的组不显示时 设置为0
2022-01-18 21:30:19正常分组的结果 SELECT username,COUNT(*) AS Number FROM USER WHERE use_status='2' GROUP BY username 方法1 SELECT t.username,SUM(t.Number) AS Number FROM (SELECT username,COUNT(*) AS Number ... -
深入理解sql分组查询(group by)
2018-05-28 11:24:00理解group by语义个人认为sql中的group by和join是两大难点,因为它们转换了原来的表结构,group把表按某些字段统计缩小,join则使用笛卡尔积将多个表连接展开。...未分组时查询返回的行直接与数据库表中的... -
sql分组查询group by结合count,sum统计语句的实现(附带sql详细分析步骤)
2021-04-21 10:22:32日常写代码经常会遇到数据统计的业务场景,分组查询 group by 结合 count 和 sum 的复杂语句写起来容易令人头大,在这里分享几种常用的统计场景,做个记录的同时也希望能帮到大家。 场景1:统计每个学生的加分次数/... -
【Mysql】Sql分组查询后取每组的前N条记录
2020-11-07 13:34:46分组查询后取每组的前N条记录 标签 mysql 数据库 分组 TOPN 一、背景 最近,有个功能需求。系统有个发布资讯模块,要求按照卡片形式展示。如下图: 按照项目组展示卡片,每个项目组展示阅读量最多的TOP2... -
Sql分组查询,如何把纵向显示的结果变成横向显示
2021-01-20 14:18:20' select @execSql=@execSql+',max(case when [科目]='''+[科目] +''' then [数量] else '''' end) as '''+ [科目] + '''' from BookLibary group by [科目] set @execSql=@execSql+'from BookLibary group by ... -
SQL的分组查询
2022-04-07 20:31:34SQL的分组查询 一、在SQL中Group By从字面的意思上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个‘数据集’划分成若干个‘小区域’,然后针对若干个‘小区域’进行数据处理。在此语法中group ... -
sql分组查询,显示要有分组字段
2018-07-16 18:36:02select name ,MAX(gmt_create) as createTime from base_ec_black group by name -
sql语法基础,sql分组查询
2019-11-09 11:04:1801分组查询–group by 格式: SELECT 列名1,列名2,。。。 FROM 表名 GROUP BY 列名1,列名2.。。。 例一,按照商品种类统计一下行数 SELECT product_type,COUNT(*) FROM PRODUCT GROUP BY product_type ... -
sql语句分组查询
2021-06-07 19:56:22/* 引入:查询每个部门的平均工资...1.分组查询中的筛选条件分为两类 数据源 位置 关键字 分组前筛选 原始表 group by子句的前面 where 分组后筛选 分组后的结果集 group by子句的后面 having ①.分组函数 -
如何在SQL分组查询时将空白值和NULL值分为一组
2021-11-04 11:05:45导致我之前的分组查询会出现NULL一个分组,空白值一个分组,由于业务上的需求是没有值的归类为其他(虽然在真实使用时99.99999%不会出现这个null或者空白值乱传问题,但强迫症的我决定重拳出击),为了不改变我的... -
SQL使用分组查询并计算条数
2022-05-20 14:57:28sql分组查询使用COUNT计算每一组的条数并添加条件 SELECT f.jxlx, COUNT(*) AS 全部, COUNT( CASE WHEN ( f.zt = 1 ) THEN jxlx END ) AS 在线, COUNT( CASE WHEN ( f.zt = 2 ) THEN jxlx END ) AS 不在线 ... -
SQL分组查询,子查询
2015-10-14 19:26:501: 分组函数/又称聚集函数1.分组函数(默认情况下就是ALL)AVG (DISTINCT |ALL| n) COUNT (DISTINCT |ALL| expr | *) // NULL不计算,但对数字0计算 MAX (DISTINCT |ALL| expr) ...2: 分组函数与分组查询 -
SQL排序&分组查询
2021-11-19 20:11:06分组查询排序&分组查询1. 排序查询2. 常见函数3. 分组函数4.分组查询 排序&分组查询 1. 排序查询 * 语法: select 要查询的东西 from 表 where 条件 order by 排序的字段|表达式|函数|别名 【asc|... -
SQL基础系列(三)——分组查询
2022-04-20 21:47:01SQL基础系列的第三篇文章,主要介绍分组查询,仍然是在单表查询的范围内。理解单表分组查询后,多表分组查询也会比较好理解。 -
高级SQL查询-(聚合查询,分组查询,联合查询)
2022-03-07 19:28:48高级SQL查询-(聚合查询,分组查询,联合查询) -
【更新了下】SQL分组查询,包含一个字段但同时不包含另外一个字段,刚描述的不清楚,希望不要有子查询谢谢
2017-06-26 09:12:39请各位大侠支个招,万分感谢 table表:有如下2列 Number view ...条件:查询View列,含有A同时不含有B ...这里只是举个个小例子,实际数据量很大,如果用子查询,就会执行两遍 ...最好不要用子查询的 -
SQL——分组统计查询
2021-10-18 13:44:00统计函数 COUNT(*|DISTINCT|列) --求出全部的记录数,即全部行 SUM(列) --求出总和,操作的列是数字 AVG(列) --求平均值 MAX(列) --求最大值 MIN(列) --求最小值 MEDIAN(列) --返回中间值 ...分组