作者:gqk:
什么是組函數:
用於一組數據,並對一組數據返回一個值:
組函數類型:
- AVG:求平均值
- COUNT:計數
- MAX:最大值
- MIN:最小值
- SUM:求和
--查詢所有工資的總和
SELECT SUM(salary) FROM employees;
--組函數
SELECT SUM(salary),AVG(salary),MAX(salary),MIN(salary),COUNT(salary) FROM employees WHERE department_id=50;
--所有組函數都是忽略空值的
SELECT COUNT(commission_pct) FROM employees;
--查詢所有沒有獎金的人數
SELECT COUNT(*)-COUNT(commission_pct) FROM employees; SELECT COUNT(*) FROM employees WHERE commission_pct IS NULL;
--查詢部門的總數(統計不重復的計數)
SELECT COUNT(DISTINCT department_id) FROM employees;
--以下是錯誤的寫法,兩列的行數不兼容 --SELECT employee_id,SUM(salary) FROM employees;
分組查詢:
--查詢每個部門的ID,員工工資總和,最高工資
SELECT department_id,SUM(salary) sal_sum,MAX(salary) FROM employees WHERE department_id IS NOT NULL GROUP BY department_id ORDER BY sal_sum DESC;
--多個分組表達式 SELECT department_id,job_id,SUM(SALARY) FROM employees GROUP BY department_id,job_id;
--查詢每個部門的部門名稱,人數:
SELECT d.department_name,count(e.employee_id) emp_count FROM employees e INNER JOIN departments d ON e.department_id=d.department_id GROUP BY d.department_name;
--統計每年入職的人數:年份,人數
SELECT to_char(hire_date,'yyyy') 年份,count(*) 人數 FROM employees GROUP BY to_char(hire_date,'yyyy') ORDER BY 1;
非法使用組函數:
- 不能在where子句中使用組函數
- 可以在having子句中使用組函數
--查詢部門編號,每個部門的平均共組,平均工資大於8000的
select department_id, avg(salary) from employees group by department_id having avg(salary)>8000 and department_id is not null;
--統計每年入職的人數:年份,人數(僅返回入職不少於2人的年份的數據)
select to_char(hire_date,'yyyy'),count(*) from employees group by to_char(hire_date,'yyyy') having count(*)>=2;
--WHERE條件:過濾分組之前的數據
--HAVING條件:過濾分組之后的數據
--查詢每個部門的ID,員工工資總和(where 可以存放在 分組之前)
select department_id,sum(salary) from employees group by department_id having department_id is not null;
子查詢:
--查詢誰的工資比Abel高?(先查詢Abel的工資,再去查詢比他高的值)
select salary from employees where last_name='Abel';
select * from employees where salary>(select salary from employees where last_name='Abel');
--查詢工資最低的員工(先查詢最低工資為多少,在查詢最低工資的員工)
select min(salary) from employees;
SELECT * FROM employees WHERE salary = (SELECT MIN(salary) FROM employees);
--查詢和149號員工同一個部門的其他員工
- 先去查詢149號員工所在的部門編號:
SELECT department_id FROM employees WHERE employee_id = 149
- 再查詢80號員工部門的員工出過149號員工
SELECT * FROM employees WHERE department_id = (SELECT department_id FROM employees WHERE employee_id = 149) AND employee_id <> 149;
--查詢比202號員工的部門經理的工資還要高的員工
- 查詢202號員工所在的部門編號(20號部門)
- 查詢20號部門的員工經理id(201號)
- 查詢經理的工資
- 查詢還要高的員工
SELECT * FROM employees WHERE salary > (SELECT salary FROM employees WHERE employee_id = (SELECT manager_id FROM departments WHERE department_id = (SELECT department_id FROM employees WHERE employee_id = 202)));
--查詢員工編號,姓名,工資,工資總和(在查詢列表中使用子查詢,只能是單行單列)
SELECT employee_id,last_name,salary, (SELECT SUM(salary) FROM employees) AS 工資總和 FROM employees;
--查詢工資最高的前5名的員工(臨時視圖,內聯視圖)
SELECT * FROM (SELECT * FROM employees ORDER BY salary DESC) WHERE ROWNUM <= 5;
--查詢員工表中第6到第12條數據
SELECT * FROM (SELECT ROWNUM rnum, e.* FROM employees e) WHERE rnum BETWEEN 6 AND 12;
--推薦以下寫法,效率較高
SELECT * FROM (SELECT ROWNUM rnum, e.* FROM employees e WHERE ROWNUM <= 12) WHERE rnum >= 6;
--查詢工資最高的第6到第12條員工
SELECT * FROM (SELECT rownum rnum, e.* FROM (SELECT * FROM employees ORDER BY salary DESC) e WHERE rownum <= 12) WHERE rnum >= 6;
--查詢所有是部門經理的員工(多行子查詢)
SELECT * FROM employees WHERE employee_id IN (SELECT manager_id FROM departments);
--查詢所有不是部門經理的員工(多行子查詢)
SELECT * FROM employees WHERE employee_id NOT IN (SELECT manager_id FROM departments WHERE manager_id IS NOT NULL);
--ANY邏輯或比較 >ANY(50,80,90)
--查詢大於60號部門任何一個員工工資的員工
SELECT * FROM employees WHERE salary > ANY (SELECT salary FROM employees WHERE department_id = 60);
--ALL邏輯與比較 >ALL(50,80,90)
--查詢所有員工人數不少於3人的部門信息
SELECT * FROM departments WHERE department_id IN (SELECT department_id FROM employees GROUP BY department_id HAVING COUNT(*) >= 3);