-----------------------------------------------分组函数
--1,如果数据库没有的数据,count(*)返回的不是null,而是0
--2,Avg Max Min Sum
--3,分组函数与空值
--分组函数省略列中的空值
select avg(comm) from emp;
select sum(comm) from emp;
--可以使用nvl()函数强制分组函数处理空值
select avg(nvl(comm,0)) from emp;
--4,group by 子句
--出现在select列表的字段或者出项在order by后面的字段,
--如果不是包含在分组函数中,那么该字段必须同时在group by
--子句中出现,包含在group by子句中的字段则不必须出现在select
--列表中。可以使用where子句限定查询条件,可以使用order by指定排序方式
--如果没有group by子句,select列表中不允许出现字段(单行函数)与
--分组函数混用的情况
select empno,sal from emp;
select avg(sal) from emp;
select empno,initcap(ename),avg(sal),from emp;--(非法)
--不允许在where子句中使用分组函数
select deptno,avg(sal)as a
from emp
--where avg(sal)>2000;
group by deptno;
--那么怎么得到部门平均工资>2000的部门列表呢?
select dept.deptno 部门编号,dept.dname 部门,a.asal 部门平均工资
from dept
join (select deptno,avg(sal) asal from emp
group by deptno)a
on dept.deptno=a.deptno
where a.asal>1000
--5,having子句
select deptno,job,avg(sal)
from emp
where hiredate>=to_date('1981-05-01','yyyy-mm-dd')
group by emp.deptno,job
having avg(sal)>1200
order by deptno,job
--要是要求在上调查询中加入部门名称呢?
select deptno,dname,job,
--6,分组函数的嵌套
select max(avg(sal)) from emp group by deptno;
--7,分组统计各部门下工资>500的员工的平均工资
select deptno,nvl(avg(sal),0) from emp where sal>2500 group by deptno;
--8,统计部门下平均工资大于500的部门
select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;
--9,算出部门30中得到最多奖金的员工的奖金
select max(comm) from emp where deptno=30;
--如果要显示他是谁呢?
select * from emp a where a.comm = (select max(b.comm) from emp b where b.deptno=30);
--10,算出每个职位的员工数和最低工资
select job 职位,count(*) 在职人数,min(sal) 最低工资 from emp group by job;
--11,算出每个部门每个职位的平均工资和平均奖金(平均值包括没有奖金),如果平均奖大于300
--显示'奖金不错',如果平均奖100-300显示'奖金一般',如果奖金小于100,显示'基本没有奖金'
--按部门编号降序,平均工资降序
select deptno 部门,job 职位,avg(sal) 同职位平均工资,avg(nvl(comm,0)) 同职位平均奖金,case
when avg(nvl(comm,0))>300 then '奖金不错'
when avg(nvl(comm,0))<300 and avg(nvl(comm,0))>100 then '奖金一般'
when avg(nvl(comm,0))<100 then '奖金太糙'
end 奖金
from emp group by job,deptno order by deptno desc,job desc,avg(sal) desc;
--如果要显示部门后面对应的职位的对应情况呢?(在这里发现表不合理,同一部门同意职位的奖金也是不相同的2)
select deptno,job,comm from emp group by empno, deptno,job,comm order by deptno;
--12,列出员工表中每个部门的员工数和部门编号
select deptno 部门编号,count(deptno) 部门人数 from emp group by deptno
--13,得到工资大于自己部门平均工资的员工信息
create or replace view avg_sal_deptno as select deptno deptno,avg(sal) avg_sal from emp group by deptno;
select * from avg_sal_deptno;
select * from emp join avg_sal_deptno on emp.sal>avg_sal_deptno.avg_sal and emp.deptno=avg_sal_deptno.deptno;
select * from emp a join
(select deptno deptno,avg(sal) avg_sal from emp group by deptno) b
on a.deptno=b.deptno and a.sal>b.avg_sal;
--14,分组统计每个部门下,每种职位的平均奖金(也要算没有奖金的人)和总工资(包括奖金)
--注明:此题有问题:每个部门每个人的总工资是不一样的,所以只能按不同的人来求
--同部门同职位的平均工资
create or replace view v_avg_sal_dept_job as select deptno,job,avg(sal) avg_sal from emp group by deptno,job order by deptno
select * from v_avg_sal_dept_job
select a.empno 员工编号,a.deptno 所在部门编号,v_avg_sal_dept_job.avg_sal 所在部门同工作平均工资,a.sal+nvl(a.comm,0) 总工资 from emp a join v_avg_sal_dept_job
on a.deptno = v_avg_sal_dept_job.deptno
and a.job=v_avg_sal_dept_job.job;
分享到:
相关推荐
Oracle 中分组后拼接分组字符串 本文主要介绍了在 Oracle 中如何对分组后的数据进行拼接操作,生成分组字符串。下面将对这个问题进行详细的分析和解释。 首先,我们需要创建一个测试表,并插入一些测试数据。这个...
Oracle 中分组后拼接分组字符串 在 Oracle 中,分组后拼接...本文介绍了如何在 Oracle 中使用 `sys_connect_by_path` 函数与 `start` 递归实现分组后拼接分组字符串。该方法可以应用于各种数据分析和报表生成场景。
7. **分组和窗口函数**:如RANK、DENSE_RANK、LAG、LEAD,用于数据分析,特别是在复杂的排序和分组场景下。 8. **其他特殊函数**:如DBMS_OUTPUT.PUT_LINE、USER、SYSDUMMY1,分别用于输出信息、获取当前用户信息或...
2. **分组函数**: - `COUNT()`: 计算非空值的数量。 - `SUM()`: 求和。 - `AVG()`: 计算平均值。 - `MIN()` 和 `MAX()`: 找到最小值和最大值。 3. **移动函数**: - `LEAD()`: 提取当前行之后的值。 - `LAG...
使用自定义聚集函数,实现聚集乘积: 测试select id,fun_multiply(t.value) "乘积" from (select 3 id , 4 value from dual union select 1 id , 1 value from dual union select 1 id , 0 value from dual ...
`dual`是一个特殊的单行单列表,通常用于执行那些不依赖于任何表数据的查询,如函数测试、变量赋值等。 ### 转换函数to_date() `to_date()`函数用于将字符串转换为日期格式,通常用于将用户输入的日期字符串转换为...
Oracle数据库中的RATIO_TO_REPORT()函数是一个非常有用的分析函数,尤其在进行数据比例分析和比较时。这个函数能够计算一个值相对于所有值总和的比例,返回的结果是一个百分比。配合OVER()子句,它可以用于全局或者...
建议按照文件顺序逐一运行并理解每个脚本的作用,遇到问题时查阅相关文档或在线资源,以加深对Oracle SQL的理解和应用能力。同时,实际操作和动手实践是学习数据库知识的关键,这将帮助你在理论知识与实际技能之间...
Oracle SQL 是一种强大的数据库查询语言...以上是对测试题目中涉及的Oracle SQL知识的详细解释,涵盖了统计、联接、子查询、排序、转换函数、序列和约束等核心概念。这些知识点对于理解并有效使用Oracle SQL至关重要。
Oracle 10g 提供了一系列强大的统计与分析函数,这些函数极大地增强了数据库系统对业务数据的计算和统计能力。在10g版本中,引入了一些新的功能,使得数据分析更为便捷和高效。以下是对这些函数的详细说明: 1. **...
Oracle数据库中的`GROUP BY`语句是SQL查询中用于数据分组的重要部分,它允许我们对数据进行聚合操作,如计算总和、平均值、最大值等。在本例中,我们将通过具体的实例来理解`GROUP BY`语句的用法。 首先,创建了一...
Oracle数据库是世界上最广泛使用的数据库系统之一,其强大的功能在很大程度上归功于其丰富的内置函数。本篇文章将详细探讨在"oracle函数大全-数字-字符-日期-聚合函数"这个主题中涵盖的关键知识点。 首先,我们来看...
Oracle中的WMSYS.WM_CONCAT函数是一个自定义聚合函数,用于在分组查询中合并多个字符串值。在某些情况下,可能需要重建这个函数,可能是由于升级、数据库迁移或者遇到与该函数相关的问题。重建过程通常涉及以下步骤...
### ORACLE数据库笔试题解析及知识点总结 #### 一、选择题解析 1. **算法的执行效率与数据的存储结构无关** - **解析**: 正确选项为 **C**。算法的执行效率与数据的存储结构密切相关。例如,数组与链表在查找、...
### Oracle PL/SQL测试题目与知识点解析 #### 一、选择题知识点解析 **1. Oracle数据库中为新创建的表分配的初始空间通常为多大?** - **知识点解析:** Oracle数据库为新创建的表分配的空间单位是“区”(Extent...
这个开发指南将深入探讨Oracle Developer的相关知识点,帮助开发者掌握其核心功能和使用技巧。 一、Oracle Developer简介 Oracle Developer主要包括Oracle Forms、Oracle Reports、Oracle PL/SQL Developer等组件,...