首页 > 数据库 >MySQL6 - 分组查询

MySQL6 - 分组查询

时间:2023-01-07 10:33:56浏览次数:38  
标签:GROUP MySQL6 sal 查询 分组 deptno WHERE SELECT

分组查询

为什么需要分组查询? 在实际应用中,可能需要先进行分组,再对每一组数据进行操作

什么是分组查询?

SELECT
	...
FROM 
	...
WHERE
	...
GROUP BY
	...
ORDER BY
	...

以上关键字顺序不能随意变换

★★★执行顺序:FROM > WHERE > GROUP BY > SELECT > ORDER BY

为什么分组函数不能用于WHERE的子句中?

  • SELECT ename,sal FROM emp WHERE sal > min(sal); //报错,无效使用分组函数
    
  • 因为分组函数必须先分组之后再使用,WHERE 执行时还未分组(默认)分组发生在WHERE后

  • 因此SELECT 和 ORDER BY 中可以使用分组函数,即是没有 GROUP BY 语句 = 默认分组


例子:找出每个工作岗位的工资和

  • 先安装工作岗位分组,然后对工资求和

  • SELECT
    	job, sum(sal)
    FROM 
    	emp
    ORDER BY
    	job;
    
  • 先从 emp 中获取全部记录,对记录进行分组,最后每一组得到 job 和 sum( sal )SELECT

  • 在SELECT语句中,如果有GROUP BY语句,SELECT后只能跟:参加分组的字段,以及分组函数,其他都不能跟(MySQL不会报错,Oracle会报错)

例子:找出 ” 每个部门,不同工作岗位 “ 的最高薪资

  • 技巧:两个字段联合成一个字段看 => 两个字段联合分组

  • SELECT 
    	deptno,job, MAX(sal) AS max_sal
    FROM
    	emp
    GROUP BY
    	deptno, job;
    

使用having可以对分完组之后的数据进一步过滤

例子:找出每个部门最高薪资,要求显示最高薪资大于3000的

  • 1 找出每个部门最高薪资 => 按照部门编号分组,求每一组最大值

    • SELECT deptno, max(sal) FROM emp GROUP BY deptno;
      
  • 2 要求显示最高薪资大于3000

    • SELECT
      	deptno, max(sal)
      FROM 
      	emp 
      GROUP BY 
      	deptno 
      HAVING 
      	max(sal) > 3000;
      
  • 3 提高查找效率,先将大于3000的找出,再分组

    • SELECT 
      	deptno, max(sal) 
      FROM 
      	emp 
      WHERE
      	sal > 3000
      GROUP BY 
      	deptno;
      
  • 4 优化策略,WHERE 和 HAVING,优先选择WHERE,WHERE无法完成时,再选择HAVING

    • WHERE无法完成:找出每个部门平均薪资,要求显示平均薪资 > 2500

    • 1 找出每个部门平均薪资

    • SELECT deptno, avg(sal) FROM emp GROUP BY deptno;
      
    • WHERE 在 GROUP BY 之前执行,对分组后的信息无法筛选 = 不能在 WHERE 子句使用分组函数

    • SELECT 
      	deptno, avg(sal) 
      FROM 
      	emp 
      GROUP BY 
      	deptno
      HAVING
      	avg(sal);
      

标签:GROUP,MySQL6,sal,查询,分组,deptno,WHERE,SELECT
From: https://www.cnblogs.com/Ashen-/p/17032204.html

相关文章

  • oracle查询连接池常用语句
    selectusername,count(*),machinefromv$sessionwhereusernameisnotnullgroupbyusername,machineorderbyusername;selectsid,machine,LAST_CALL_ET,......
  • Cron 常用快速查询
    (1)0/2****?表示每2秒执行任务  (1)00/2***?表示每2分钟执行任务  (1)0021*?表示在每月的1日的凌晨2点调整任务  (2)01510?*MON-FRI......
  • 复杂条件查询功能
    复杂条件查询功能分析   总记录数统计的代码实现UserDao接口:/***查询总记录数*@return*/intfindTotalCount(Map<String,String[......
  • MySQL5 - 分组函数
    分组函数又称多行处理函数特点:输入多行,输出一行共5个:count计数、sum求和、avg平均值、max最大值、min最小值多行处理函数在使用时必须先进行分组,然后才能使用......
  • MySQL3 - DQL 数据查询语句基础
    DQL简单查询查询一个字段SELECT字段名FROM表名;select和from都是关键字,字段名和表名是标识符查询两个或多个字段使用逗号","隔开SELECTdeptno,dnameFROM......
  • gget: 一款强大的基因组参考数据库的高效查询工具
    开源Python和命令行程序gget可以高效、轻松地以编程方式访问存储在各种大型公共基因组参考数据库中的信息。gget与可获取用户生成的测序数据的现有工具一起使用,以取......
  • bootstrap-select 的多选+模糊查询下拉框详解(官方示例文档解读)
    bootstrap-select的多选+模糊查询下拉框详解(官方示例文档解读)引入问题之前博主在实际开发中遇到了一个问题,就是需要既支持多选又同时支持模糊查询的下拉控件,大家所熟知......
  • MySQL2 - 基本信息查询
    MySQL基本信息查询操作所有SQL语句以;结尾SQL语句不区分大小写查询数据库有哪些表SHOWTABLES;查看表中全部数据SELECT*FROMemp;查看表的结构DESCemp;/......
  • 在sqlite数据库使用sql查询显示表头列和自动对齐列的方法
    在sqlite数据库使用sql查询的结果中是不带表头列的。如下: 上面已经显示出了SCORE表中的所有数据,但似乎显示的不太明白,因为看不出来各个数据的含义。显示表头(.headero......
  • sqlserver2019创建“可查询”“可创建视图”的用户
      ————————————(个人随笔,记录使用,仅供参考)一、SqlserverSSMS创建一个只读的用户1、用拥有管理权限的用户连接数据库(sa)2、选择“安全性”=》“登录名”=......