综合练习

目录

[显示所有非销售人员的工作名称以及计算出从事同一工作的员工的月工资总和,并且筛选出从事同一工作的员工的月工资总和大于 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子句可以包含统计函数。

相关推荐
编程充电站pro13 分钟前
面试陷阱:SQL 子查询 vs JOIN 的性能差异
数据库·sql
中文Python32 分钟前
小白中文Python-db_桌面小黄鸭宠物
数据库·python·pygame·宠物·中文python·小白学python
李慕婉学姐34 分钟前
【开题答辩过程】以《基于 Spring Boot 的宠物应急救援系统设计与实现》为例,不会开题答辩的可以进来看看
数据库·spring boot·宠物
倔强的石头_1 小时前
【金仓数据库】ksql 指南(二) —— 创建与管理本地数据库
数据库
努力学习的小廉2 小时前
初识MYSQL —— 数据类型
android·数据库·mysql
MoRanzhi12032 小时前
12. Pandas 数据合并与拼接(concat 与 merge)
数据库·人工智能·python·数学建模·矩阵·数据分析·pandas
William_cl2 小时前
【连载3】MySQL 的 MVCC 机制剖析
数据库·mysql
235162 小时前
【MySQL】MVCC:从核心原理到幻读解决方案
java·数据库·后端·sql·mysql·缓存
zym大哥大2 小时前
高并发内存池
服务器·数据库·windows
. . . . .3 小时前
数据库迁移migration
数据库