天天看點

oracle group by和having用法

這是我遇到的一道原題
Examine the description of the EMPLOYEES table:
EMP_ID NUMBER(4) NOT NULL 
LAST_NAME VARCHAR2(30) NOT NULL
FIRST_NAME VARCHAR2(30)
DEPT_ID NUMBER(2)
JOB_CAT VARCHAR2(30)
SALARY NUMBER(8,2)

Which statement shows the department ID, minimum salary, and maximum salary paid in that
department, only if the minimum salary is less than 5000 and maximum salary is more than 15000?
查找到所有部門中,工資最大值大于15000和工資最小值小于5000的部門。      
然後給的解答是:
       
SELECT dept_id, MIN(salary), MAX(salary) FROM employees
GROUP BY dept_id
HAVING MIN(salary) < 5000 AND MAX(salary) > 15000;
           
為什麼這裡隻要group by dept_id就可以?能通俗的為我解釋一下麼,group by 和having到底是怎麼回事?
MIN(), MAX()是聚合函數.
group by 後面是要跟着的 select 中所有不是聚合函數的字段。
ex1:  select count(*) from emp;        //隻是查詢總總數 emp這張表裡一共有多少條記錄 是以不用group by
ex2:  select count(*) , deptno from emp group by deptno;  // 根據deptno 分組, 查到的資料就是  列出 不同部門 記錄總數
         select count(*) ,  deptno ,  comm from emp group by deptno , comm;
// 根據deptno 和 comm 分組  以此類推 group by 後面是要跟着的 select 中所有不是聚合函數的字段   否則會報錯。

having 相當于where     與where的唯一差別是 當查詢語句中有 聚合函數 的時候 就不能用where 了  隻能用having