細枝末節
1. GROUP BY後的集必須出現在SELECT後
2. 分組函數做條件肯定放在HAVING中
3. 盡量使用WHERE篩選,性能高
4. GROUP BY支援單字段分組,多字段分組,表達式或函數分組
5. GROUP BY使用多字段分組時,無順序要求
格式
SELECT
分組,列(要求出現在GROUP BY後面)
FROM
表名
[WHERE 篩選調節]
GROUP BY
分組清單
[HAVING 篩選條件]
[ORDER BY 子句]
篩選條件分類
分組前篩選
資料源
原始表
位置
GROUP BY子句前面
關鍵字
WHERE
分組後篩選
分組後的結果集
GROUP BY子句後面
HAVING
示例
查詢哪些部門員工個數>2
/* 1. 先查詢每個部門員工個數 */
SELECT COUNT(*), dept_id
FROM emps
GROUP BY dept_id
/* 2. 根據1中的結果集,對>2條件進行篩選 */
SELECT COUNT(*),dept_id
HAVING COUNT(*)>2;
查詢每個工種有獎金的員工的最高工資>12000的工種編号和最高工資
/* 1. 先查詢每個工種有獎金的員工的最高工資及工種編号 */
SELECT MAX(salary), job_id
FROM emp
WHERE bonus IS NOT NULL
GROUP BY job_id;
/* 2. 根據1中的結果集繼續對最高工資>12000條件進行篩選 */
WHERE bons IS NOT NULL
GROUP BY job_id
HAVING MAX(salary)>12000;
查詢上司編号>102的每個上司手下的最低工資>5000的上司編号及其最低工資
/* 1. 先查詢上司編号>102的的每個上司手下的最低工資及上司編号 */
SELECT MIN(salary), mng_id
WHERE mng_id>102
GROUP BY mng_id;
/* 2. 根據1中的結果集繼續對最低工資>5000條件進行篩選 */
GROUP BY mng_id
HAVING MIN(salary)>5000;
按員工姓名的長度分組,查詢每組員工個數,篩選員工數>5的組有哪些
/* 1. 先将員工星空按長度分組,查詢每組員工個數 */
SELECT COOUNT(*), LENGTH(name)
GROUP BY LENGTH(name);
/* 2. 根據1中的結果集繼續對員工數>5條件進行篩選 */
SELECT COUNT(*), LENGTH(name)
GROUP BY LENGTH(name)
HAVING COUNT(*)>5;