Oracle分組函數和連接子查詢


作者: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);

 

 

 

  

  

 

  

  

  

  

  

  

  

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM