综合练习

目录

[显示所有非销售人员的工作名称以及计算出从事同一工作的员工的月工资总和,并且筛选出从事同一工作的员工的月工资总和大于 500 的工作名称,显示的结果按照月工资总和进行升序排列](#显示所有非销售人员的工作名称以及计算出从事同一工作的员工的月工资总和,并且筛选出从事同一工作的员工的月工资总和大于 500 的工作名称,显示的结果按照月工资总和进行升序排列)

统计所有领取佣金和不领取佣金的人数、平均工资

注意事项


Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645

显示所有非销售人员的工作名称以及计算出从事同一工作的员工的月工资总和,并且筛选出从事同一工作的员工的月工资总和大于 500 的工作名称,显示的结果按照月工资总和进行升序排列

第一步:查询所有非销售人员的信息,使用 where子句进行限定查询

sql 复制代码
SQL> select *
  2  from emp
  3  where job<>'SALESMAN';

     EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
      7369 SMITH                CLERK                    7902 17-12月-80            800                    20
      7566 JONES                MANAGER                  7839 02-4月 -81           2975                    20
      7698 BLAKE                MANAGER                  7839 01-5月 -81           2850                    30
      7782 CLARK                MANAGER                  7839 09-6月 -81           2450                    10
      7839 KING                 PRESIDENT                     17-11月-81           5000                    10
      7900 JAMES                CLERK                    7698 03-12月-81            950                    30
      7902 FORD                 ANALYST                  7566 03-12月-81           3000                    20
      7934 MILLER               CLERK                    7782 23-1月 -82           1300                    10

已选择 8 行。

第二步:按照职位进行分组,而后求出月工资的总支出

sql 复制代码
SQL> select job,sum(sal)
  2  from emp
  3  where job<>'SALESMAN'
  4  group by job;

JOB                  SUM(SAL)
------------------ ----------
CLERK                    3050
ANALYST                  3000
MANAGER                  8275
PRESIDENT                5000

第三步:分组后的数据进行再次的筛选,使用 HAVING 子句

sql 复制代码
SQL> select job,sum(sal)
  2  from emp
  3  where job<>'SALESMAN'
  4  group by job
  5  having sum(sal)>5000;

JOB                  SUM(SAL)
------------------ ----------
MANAGER                  8275

第四步:按照月工资的合计进行升序排列,使用 order by 子句

sql 复制代码
SQL> select job,sum(sal) sum
  2  from emp
  3  where job<>'SALESMAN'
  4  group by job
  5  having sum(sal)>5000
  6  order by sum;

JOB                       SUM
------------------ ----------
MANAGER                  8275

我这儿只有一行,但是可能有些朋友数据不一样,我还是写一下吧

统计所有领取佣金和不领取佣金的人数、平均工资

按照简单的思维模式,可以使用 com 分组

sql 复制代码
SQL> select comm,count(*),avg(sal)
  2  from emp
  3  group by comm;

      COMM   COUNT(*)   AVG(SAL)
---------- ---------- ----------
       300          1       1600
      1400          1       1250
                    9   2415.625
       500          1       1250
         0          1       1500

使用 group by 的时候会把每一个种子值当做一个分组,所以此时不可能直接使用 GROUP BY

那么现在可以换一个思路,把问题拆分一下

查询出所有领取佣金的员工的人数、平均工资。直接使用 where子句,不使用 group by

sql 复制代码
SQL> select '领取佣金' info ,count(*),avg(sal)
  2  from emp
  3  where comm is not null;

INFO                       COUNT(*)   AVG(SAL)
------------------------ ---------- ----------
领取佣金                          4       1400

查询出所有不领取佣金的员工的人数、平均工资。直接使用 where子句,不使用 group by

sql 复制代码
SQL> select '不领取佣金' info ,count(*),avg(sal)
  2  from emp
  3  where comm is null;

INFO                             COUNT(*)   AVG(SAL)
------------------------------ ---------- ----------
不领取佣金                              9   2415.625

既然此时两个查询结果返回的结构完全相同,那么直接连接即可

sql 复制代码
SQL> select '领取佣金' info ,count(*),avg(sal)
  2  from emp
  3  where comm is not null
  4  union
  5  select '领取佣金' info ,count(*),avg(sal)
  6  from emp
  7  where comm is null;

INFO                       COUNT(*)   AVG(SAL)
------------------------ ---------- ----------
领取佣金                          4       1400
领取佣金                          9   2415.625

说明并不是什么时候都要使用分组统计函数,要根据具体要求灵活使用

注意事项

(1)hroup by 子句经常和统计函数一起使用,在一起使用的时候,如果 select 语句中包含统 计函数,则计算每组的汇总值。

(2)Having 子句对 group by 子句选择出来的结果进行二次筛选,最后输出符合 having 子句中条件的记录。

(3)Havinh子句与 where 子句的语法类型,二者不同之处在于 having子句可以包含统计函数。

相关推荐
DARLING Zero two♡17 分钟前
用Rust构建一个OCR命令行工具
数据库·rust·ocr
chxii22 分钟前
MyBatis 动态 SQL,通过 XML (如 <if>、<foreach> 等)实现灵活的 SQL 拼接。
xml·sql·mybatis
蟹至之1 小时前
增删查改基础(其三)—— 聚合函数、分组查询(group by与having)、内置函数
数据库·mysql·增删查改
2501_941111241 小时前
Django全栈开发入门:构建一个博客系统
jvm·数据库·python
Wang's Blog2 小时前
MySQL: 数据库索引深度解析:B树与哈希索引的结构、应用与优化策略
数据库·b树·mysql
2501_941112142 小时前
Python Web爬虫入门:使用Requests和BeautifulSoup
jvm·数据库·python
d***9352 小时前
Redis五种用途
数据库·redis·缓存
Armyyyyy丶2 小时前
MySQL系列之数据读取与存储核心机制
数据库·mysql·架构分析
TDengine (老段)2 小时前
TDengine 字符串函数 Replace 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
workflower3 小时前
软件压力测试
数据库·压力测试·需求分析·个人开发·极限编程·结对编程