精华内容
下载资源
问答
  • sql分组查询
    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基础之分组查询和聚合函数,简洁的描述了查询的语法和规则,列举实例容易理解。
  • 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:26
    DQL语言-分组查询 一、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:41
    1. 实现思路 ...--分组查询证书信息列表--> <resultMap id="groupResultMap" type="java.util.Map"> <result column="count(1)" property="num" jdbcType="VARCHAR"/> <res..

    目录

    1.  实现思路

    2. 代码实现

    2.1  mapper

    2.2 mapper 接口

    2.3 Service层

     AjaxResult对象

    2.4 controller 

    2.5 测试


    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:56
    SQL分组查询语句 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:17
    sql分组查询最新一条数据
  • 按照uc分组,获取score最大值,并且要获取相应的duration列 sql实现 传统的group by,不能查询额外的列 select uc, max(score) from t_ch group by uc; 查询结构: 使用row_number函数: 注意:mysql8.0版本需在...
  • SQL中使用GROUP BY来对SELECT的结果进行数据分组,在具体使用GROUP BY之前需要知道一些重要的规定。 1、GROUP BY子句可以包含任意数目的列。也就是说可以在组里再分组,为数据分组提供更细致的控制。 2、如果在...
  • SQL分组查询的教学探讨.pdf
  • 正常分组的结果 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则使用笛卡尔积将多个表连接展开。...未分组查询返回的行直接与数据库表中的...
  • 日常写代码经常会遇到数据统计的业务场景,分组查询 group by 结合 count 和 sum 的复杂语句写起来容易令人头大,在这里分享几种常用的统计场景,做个记录的同时也希望能帮到大家。 场景1:统计每个学生的加分次数/...
  • 分组查询后取每组的前N条记录 标签 mysql 数据库 分组 TOPN 一、背景 最近,有个功能需求。系统有个发布资讯模块,要求按照卡片形式展示。如下图: 按照项目组展示卡片,每个项目组展示阅读量最多的TOP2...
  • ' 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:34
    SQL分组查询 一、在SQL中Group By从字面的意思上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个‘数据集’划分成若干个‘小区域’,然后针对若干个‘小区域’进行数据处理。在此语法中group ...
  • sql分组查询,显示要有分组字段

    千次阅读 2018-07-16 18:36:02
    select name ,MAX(gmt_create) as createTime from base_ec_black group by name 
  • sql语法基础,sql分组查询

    千次阅读 2019-11-09 11:04:18
    01分组查询–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 ①.分组函数
  • 导致我之前的分组查询会出现NULL一个分组,空白值一个分组,由于业务上的需求是没有值的归类为其他(虽然在真实使用时99.99999%不会出现这个null或者空白值乱传问题,但强迫症的我决定重拳出击),为了不改变我的...
  • sql分组查询使用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:50
    1: 分组函数/又称聚集函数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:01
    SQL基础系列的第三篇文章,主要介绍分组查询,仍然是在单表查询的范围内。理解单表分组查询后,多表分组查询也会比较好理解。
  • 高级SQL查询-(聚合查询,分组查询,联合查询)

    千次阅读 多人点赞 2022-03-07 19:28:48
    高级SQL查询-(聚合查询,分组查询,联合查询)
  • 请各位大侠支个招,万分感谢 table表:有如下2列 Number view ...条件:查询View列,含有A同时不含有B ...这里只是举个个小例子,实际数据量很大,如果用子查询,就会执行两遍 ...最好不要用子查询
  • SQL——分组统计查询

    千次阅读 2021-10-18 13:44:00
    统计函数 COUNT(*|DISTINCT|列) --求出全部的记录数,即全部行 SUM(列) --求出总和,操作的列是数字 AVG(列) --求平均值 MAX(列) --求最大值 MIN(列) --求最小值 MEDIAN(列) --返回中间值 ...分组

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 264,035
精华内容 105,614
关键字:

sql分组查询

友情链接: DesktopRose.zip