oracle分组函数

oracle基础
oracle单行函数
oracle多表查询
oracle分组函数
oracle子查询

/*
	AVG(expr)         平均值   必须是number类型
	COUNT(expr)       统计条数 可以是任意数据类型
	MAX(expr)         最大值   可以是任意数据类型
	MIN(expr)         最小值   可以是任意数据类型 
	SUM(expr)         求和     必须是number类型
*/


SELECT ROUND(AVG(SALARY), 2),MAX(SALARY),MIN(SALARY),SUM(SALARY)
FROM EMPLOYEES
-- 姓名字母排序最大,与最小,日期最早与最晚
SELECT MAX(LAST_NAME),MIN(LAST_NAME),MAX(HIRE_DATE),MIN(HIRE_DATE)
FROM EMPLOYEES
--count(列名) 
-- EMPLOYEE_ID 不为空有多少行,HIRE_DATE不为空有多少行,LAST_NAME不为空有多少行  
-- count(1),count(2),count(*) 表示的是统计这个表有多少行,跟里面的数据没有关系
--107 条
SELECT COUNT(EMPLOYEE_ID),COUNT(HIRE_DATE),COUNT(LAST_NAME)
FROM EMPLOYEES

-- COMMISSION_PCT 不为空有多少行
-- 35条
SELECT COUNT(COMMISSION_PCT)
FROM EMPLOYEES


-- 不忽略 空值做法
-- AVG(COMMISSION_PCT)忽略了空值 所以结果不对
SELECT AVG(COMMISSION_PCT),SUM(COMMISSION_PCT)/COUNT(NVL(COMMISSION_PCT, 1)),SUM(COMMISSION_PCT)/COUNT(107)
FROM EMPLOYEES

-- DISTINCT 去重复
-- 返回公司所有部门的个数

SELECT COUNT(DISTINCT DEPARTMENT_ID)
FROM EMPLOYEES

--GROUP BY 
-- 列中非分组函数包裹的必须加入到 GROUP BY中
-- 不能在 WHERE子句中使用分组函数


-- 求公司各个部门的平均工资
SELECT DEPARTMENT_ID,ROUND(AVG(SALARY),2)
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID

-- 求公司40,60,80部门的平均工资
SELECT DEPARTMENT_ID,ROUND(AVG(SALARY),2)
FROM EMPLOYEES
WHERE DEPARTMENT_ID in(40,60,80)
GROUP BY DEPARTMENT_ID

-- 不同部门的不同工种的平均工资

SELECT DEPARTMENT_ID,JOB_ID,ROUND(AVG(SALARY),2)
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID,JOB_ID


--求出各部门中平均工资大于6000的部门,以及其平均工资
SELECT DEPARTMENT_ID,AVG(SALARY)
FROM EMPLOYEES
HAVING AVG(SALARY)>6000
GROUP BY DEPARTMENT_ID
ORDER BY DEPARTMENT_ID asc

-- 显示各个部门平均工资的最大值

SELECT MAX(AVG(SALARY))
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID


----------------------------------------------------------------------

-- 练习
-- 33. 查询 employees 表中有多少个部门
SELECT COUNT(DISTINCT DEPARTMENT_ID)
FROM EMPLOYEES

--34. 查询全公司奖金基数的平均值(没有奖金的人按 0 计算)

SELECT AVG(NVL(COMMISSION_PCT, 0))
FROM EMPLOYEES


-- 35. 查询各个部门的平均工资

SELECT AVG(SALARY)
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID


-- 36. Toronto 这个城市的员工的平均工资

SELECT  l.CITY,AVG(e.SALARY)
FROM EMPLOYEES e
LEFT JOIN DEPARTMENTS d
ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
LEFT JOIN LOCATIONS l
ON d.LOCATION_ID = l.LOCATION_ID
WHERE l.CITY = 'Toronto'
GROUP BY l.CITY


-- 37. (有员工的城市)各个城市的平均工资


SELECT  l.CITY,AVG(e.SALARY)
FROM EMPLOYEES e
LEFT JOIN DEPARTMENTS d
ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
LEFT JOIN LOCATIONS l
ON d.LOCATION_ID = l.LOCATION_ID
GROUP BY l.CITY

-- 38. 查询平均工资高于 8000 的部门 id 和它的平均工资.	


SELECT DEPARTMENT_ID,AVG(SALARY)
FROM EMPLOYEES
HAVING AVG(SALARY) >8000
GROUP BY DEPARTMENT_ID

		
-- 39. 查询平均工资高于 6000 的 job_title 有哪些


SELECT JOB_TITLE,AVG(SALARY)
FROM EMPLOYEES e 
LEFT JOIN JOBS j
ON e.JOB_ID = j.JOB_ID
HAVING AVG(SALARY) >6000
GROUP BY JOB_TITLE


-- 4.	查询公司员工工资的最大值,最小值,平均值,总和

SELECT MAX(SALARY),MIN(SALARY),AVG(SALARY),SUM(SALARY)
FROM EMPLOYEES


-- 5.	查询各job_id的员工工资的最大值,最小值,平均值,总和

SELECT JOB_ID,MAX(SALARY),MIN(SALARY),AVG(SALARY),SUM(SALARY)
FROM EMPLOYEES
GROUP BY JOB_ID


-- 6.	选择具有各个job_id的员工人数

SELECT JOB_ID,COUNT(JOB_ID)
FROM EMPLOYEES
GROUP BY JOB_ID

-- 7.	查询员工最高工资和最低工资的差距(DIFFERENCE)

SELECT MAX(SALARY),MIN(SALARY),(MAX(SALARY)-MIN(SALARY)) "DIFFERENCE"
FROM EMPLOYEES

-- 8.	查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内

SELECT MANAGER_ID,MIN(SALARY)
FROM EMPLOYEES
WHERE MANAGER_ID is not null
GROUP BY MANAGER_ID
HAVING MIN(SALARY) >= 6000


-- 9.	查询所有部门的名字,location_id,员工数量和工资平均值

SELECT d.DEPARTMENT_NAME,d.LOCATION_ID,COUNT(EMPLOYEE_ID),AVG(SALARY)
FROM EMPLOYEES e,DEPARTMENTS d
WHERE e.DEPARTMENT_ID(+) = d.DEPARTMENT_ID
GROUP BY d.DEPARTMENT_NAME,d.LOCATION_ID


select department_name,location_id,count(employee_id),avg(salary)
from employees e right outer join departments d
on e.department_id = d.department_id
group by department_name,location_id




/*
10.	查询公司在1995-1998年之间,每年雇用的人数,结果类似下面的格式
total	1995	1996	1997	1998
20	   3	   4	   6	   7

*/


SELECT COUNT(*) "total" , 
			 COUNT(DECODE(TO_CHAR(HIRE_DATE,'yyyy'), '1995',1, NULL)) "1995",
			 
			 COUNT(DECODE(TO_CHAR(HIRE_DATE,'yyyy'), '1996',1, NULL)) "1996",
			 
			 COUNT(DECODE(TO_CHAR(HIRE_DATE,'yyyy'), '1997',1, NULL)) "1997",
			 
			 COUNT(DECODE(TO_CHAR(HIRE_DATE,'yyyy'), '1998',1, NULL)) "1998"
FROM EMPLOYEES
WHERE  TO_NUMBER(TO_CHAR(HIRE_DATE,'yyyy'))   BETWEEN 1995 AND 1998


SELECT COUNT(*) "total" , 
			 COUNT(CASE TO_CHAR(HIRE_DATE,'yyyy') WHEN '1995' THEN 1 ELSE NULL END) "1995",
			 
			 COUNT(CASE TO_CHAR(HIRE_DATE,'yyyy') WHEN '1996' THEN 1 ELSE NULL END) "1996",
			 
			 COUNT(CASE TO_CHAR(HIRE_DATE,'yyyy') WHEN '1997' THEN 1 ELSE NULL END) "1997",
			 
			 COUNT(CASE TO_CHAR(HIRE_DATE,'yyyy') WHEN '1998' THEN 1 ELSE NULL END) "1998"
FROM EMPLOYEES
WHERE  TO_NUMBER(TO_CHAR(HIRE_DATE,'yyyy'))  BETWEEN 1995 AND 1998














  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值