SQL中GROUP BY/left join用法示例

SQL中GROUP BY用法示例

原文鏈接:https://www.jianshu.com/p/9f0a49c04bce

概述

GROUP BY我們可以先從字面上來理解,GROUP表示分組,BY後面寫字段名,就表示根據哪個字段進行分組,如果有用Excel比較多的話,GROUP BY比較類似Excel裏面的透視表。
GROUP BY必須得配合聚合函數來用,分組之後你可以計數(COUNT),求和(SUM),求平均數(AVG)等。
聚合函數目前只能對數值型(int,float)進行計算,非數值型(字符串)可以自定義函數計算

常用聚合函數

count() 計數
sum() 求和
avg() 平均數
max() 最大值
min() 最小值

語法

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;

例子

下圖是員工在職時間表 dept_emp共四個字段,分別是emp_no(員工編號),dept_no(部門編號),from_date(起始時間),to_date(結束時間),記錄了員工在某一部門所處時間段,to_date等於9999-01-01的表示目前還在職。
員工任職時間表
如果想統計每個部門有多少名在職員工,步驟如下:
1.篩選在職員工 where to_date=‘9999-01-01’;
2.對部門進行分組group by dept_no
3.對員工進行計數 count(emp_no)

SELECT
  dept_no as 部門,
  count(emp_no) as 人數
FROM
  dept_emp 
WHERE
  to_date = '9999-01-01' 
GROUP BY
  dept_no

結果
在這裏插入圖片描述

進一步獲取部門編號對應的部門名稱

另外一張表departments具有字段dept_name、dept_no

SELECT
    ( SELECT d.dept_name FROM departments d WHERE de.dept_no = d.dept_no ) AS 部門,
    count( de.emp_no ) AS 人數 
FROM
    dept_emp de 
WHERE
    de.to_date = '9999-01-01' 
GROUP BY
    de.dept_no

結果
在這裏插入圖片描述

HAVING

where是聚合前的篩選,having是聚合後對篩選
舉個例子:
每個部門人數都有了,那如果我們想要進一步知道員工人數大於30000的部門是哪些,這個時候就得用到HAVING了。
語句如下:

SELECT
    ( SELECT d.dept_name FROM departments d WHERE de.dept_no = d.dept_no ) AS 部門,
    count( de.emp_no ) AS 人數 
FROM
    dept_emp de 
WHERE
    de.to_date = '9999-01-01' 
GROUP BY
    de.dept_no
HAVING
    count( de.emp_no ) > 30000 

結果
在這裏插入圖片描述

聯合

現在有一張表titles,共有4個字段,分別是emp_no(員工編號),title(職位),from_date(起始時間),to_date(結束時間),記錄的是員工在某個時間段內職位名稱,因爲會存在升職,轉崗之類的,裏面emp_no可能會對應多個職位,我們現在要取到所有員工最近的職位信息,包括離職員工。

本文介紹兩種方法去實現結果:

方法一

嵌套一個group by、聚合函數max()子查詢獲取最近的職位信息。

思路
1.通過對emp_no分組取每個emp_no對應的最大的from_date;

SELECT
    emp_no,
    max( from_date ) AS max_date 
FROM
    titles 
GROUP BY
    emp_no

在這裏插入圖片描述
2.通過查詢出來的最大的from_date取篩選最近的的一條職位信息。

SELECT
    t.emp_no,
    t.title 
FROM
    titles t
    LEFT JOIN ( SELECT emp_no, max( from_date ) AS max_date FROM titles GROUP BY emp_no ) et 
ON t.emp_no = et.emp_no AND t.from_date = et.max_date

嵌套語句編寫時先測試最裏層的結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章