SELECT數據查詢5——group by分組查詢

語法格式:

       select 分組函數,列(要求出現在group by的後面)
       from 表
       【where】 篩選條件
       group by 分組列表
       【order by 子句】

注意:
查詢列表必須特殊,要求是分組函數和group by 後出現的字段

總結特點:

    1、分組查詢中的篩選條件分爲兩類
      				 數據庫        	   位置                	關鍵字
    	分組前篩前    原始表            group by子句前面    	where
   		分組篩選後    分組後的結果集 	   group by子句後面   	having
   		 
    (1)分組函數做條件一定是放在having子句中
    (2)能用分組前篩選的,就優先考慮使用分組前篩選
    2、group by子句支持單個子句字段分組,多個字段分組(逗號),
    表達式或函數
    3、可以添加排序,放在最後

下面例題使用到的數據:
employees 員工表

salary	job_id	commission_pct	departemt_id	last_name	manager_id
工資列	工資列	獎金率列			部門編號			員工名列		領導編號列

departments 部門表

department_id	department_name	manager_id	location_id
部門標號列		部門名稱列		領導編號列	位置編號列

#引入:查詢每個部門的平均工資

SELECT AVG(salary) FROM employees;

#簡單分組查詢題

#1、查詢每個工種的最高工資
SELECT MAX(salary),job_id
FROM employees
GROUP BY job_id;

#2、查詢每個位置上的部門個數
SELECT COUNT(*),location_id
FROM departments
GROUP BY location_id;

#添加簡單(分組前)的篩選條件

#1、查詢郵箱中包含a字符的,每個部門的平均工資
SELECT AVG(salary),department_id
FROM employees
WHERE email LIKE '%a%'
GROUP BY department_id;

#2、查詢有獎金的每個領導手下員工的最高工資
SELECT MAX(salary),manager_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY manager_id;

#添加複雜(分組後)的篩選條件

1、查詢哪個部門的員工個數>2

#(1)查詢每個員工的個數
SELECT COUNT(*),department_id
FROM employees
GROUP BY department_id;

#(2)根據(1)的結果進行篩選,查詢哪個部門的員工數>2  having
SELECT COUNT(*),department_id
FROM employees
GROUP BY department_id
HAVING COUNT(*)>2
ORDER BY COUNT(*);

2、查詢每個工種有獎金的員工的最高工資>12000的工種編號和最高工資

#(1)查詢每個工種有獎金的員工的最高工資
SELECT MAX(salary),job_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id;

#(2)根據(1)結果繼續篩選,最高工資>12000
SELECT MAX(salary),job_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING MAX(salary)>12000;

3、查詢領導編號>120的每個領導手下的最低工資>5000的領導編號是哪個,以及其最低工資

#(1)查詢每個領導
SELECT MIN(salary),manager_id
FROM employees
GROUP BY manager_id;

#(2)添加篩選條件:領導編號>120
SELECT MIN(salary),manager_id
FROM employees
WHERE manager_id>102
GROUP BY manager_id;

#(3)再添加篩選條件:最低工資>5000
SELECT MIN(salary),manager_id
FROM employees
WHERE manager_id>102
GROUP BY manager_id
HAVING MIN(salary)>5000
ORDER BY MIN(salary);

#按表達式或函數分組

按員工姓名的長度分組,查詢每一組的員工個數,篩選員工個數>5的有哪些

#(1)查詢每個長度的員工個數
SELECT COUNT(*),LENGTH(last_name) len_name
FROM employees
GROUP BY LENGTH(last_name);

#(2)添加篩選條件
SELECT COUNT(*),LENGTH(last_name) len_name
FROM employees
GROUP BY LENGTH(last_name)
HAVING COUNT(*)>5;
#使用別名
SELECT COUNT(*) AS a,LENGTH(last_name) len_name
FROM employees
GROUP BY LENGTH(last_name)
HAVING a>5;

#按多個字段分組

#查詢每個部門每個工種的員工的平均工資
SELECT AVG(salary),department_id,job_id
FROM employees
GROUP BY job_id,department_id;

#綜合
SELECT AVG(salary),department_id,job_id
FROM employees
WHERE department_id IS NOT NULL
GROUP BY job_id,department_id
HAVING AVG(salary)>10000
ORDER BY AVG(salary) DESC;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章