語法格式:
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;