mysql分組函數、組函數、聚合函數、統計函數
直接po代碼,代碼中有注釋
#二、分組函數/*功能:用作統計使用,又稱為聚合函數或統計函數或組函數分類:sum 求和、avg 平均值、max 最大值 、min 最小值 、count 計算個數特點:1、sum、avg一般用於處理數值型 max、min、count可以處理任何類型2、以上分組函數都忽略null值3、可以和distinct搭配實現去重的運算4、count函數的單獨介紹一般使用count(*)用作統計行數5、和分組函數一同查詢的欄位要求是group by後的欄位*/##1、分組函數的簡單 的使用SELECT SUM(salary) FROM employees;SELECT AVG(salary) FROM employees;SELECT MAX(salary) FROM employees;SELECT MIN(salary) FROM employees;SELECT COUNT(salary), COUNT(*), COUNT('aaa'), COUNT("bbbb"), COUNT(666) FROM employees;SELECT SUM(salary), AVG(salary), MAX(salary), MIN(salary), COUNT(salary)FROM employees;#函數嵌套SELECT SUM(salary), ROUND(AVG(salary), 2), MAX(salary), MIN(salary), COUNT(salary)FROM employees;#2、參數支持哪些類型#使用SUM()函數和AVG()函數去處理字符型和日期型,儘管語法不會報錯,但是沒什麼意義SELECT SUM(last_name), AVG(last_name) FROM employees; SELECT SUM(hiredate), AVG(hiredate) FROM employees;#max、min、count可以處理任何類型SELECT MAX(last_name), MIN(last_name) FROM employees;SELECT MAX(hiredate), MIN(hiredate) FROM employees;SELECT MAX(salary), MIN(salary) FROM employees;SELECT COUNT(salary), COUNT(last_name), COUNT(*), COUNT(hiredate) FROM employees;#COUNT()函數不會把null算進去,即忽略nullSELECT COUNT(salary), COUNT(commission_pct), COUNT(last_name), COUNT(*), COUNT(hiredate) FROM employees;SELECT * FROM employees WHERE commission_pct IS NOT NULL;SELECT * FROM employees WHERE commission_pct IS NULL;#3、是否忽略null (記住:分組函數都忽略null值,即不會把null算進去)SELECT COUNT(commission_pct), SUM(commission_pct), AVG(commission_pct), SUM(commission_pct) / 35, SUM(commission_pct) / 107 FROM employees ;#SELECT MAX(commission_pct), MIN(commission_pct) FROM employees; #SELECT COUNT(commission_pct) FROM employees;SELECT commission_pct FROM employees;##4、和distinct搭配使用SELECT COUNT(DISTINCT salary), COUNT(salary) FROM employees;SELECT SUM(DISTINCT salary), SUM(salary) FROM employees;SELECT SUM(DISTINCT commission_pct), SUM(commission_pct) FROM employees;SELECT COUNT(DISTINCT commission_pct), COUNT(commission_pct) FROM employees;#SELECT MAX(DISTINCT commission_pct) AS 結果, MAX(commission_pct) AS 結果, MIN(commission_pct) AS 結果, MIN(DISTINCT commission_pct) AS 結果, AVG(commission_pct) AS 結果, AVG(DISTINCT commission_pct) AS 結果, SUM(DISTINCT commission_pct) / COUNT(DISTINCT commission_pct) AS 結果FROM employees ;#SELECT MAX(DISTINCT salary), MAX(salary), MIN(salary), MIN(DISTINCT salary), AVG(salary), AVG(DISTINCT salary), SUM(DISTINCT salary) / COUNT(DISTINCT salary) AS 結果FROM employees ;#別名可以取一樣的,語法不會報錯,但是不建議取一樣的別名,容易混淆SELECT salary AS a, hiredate AS a FROM employees /*下面這條sql語句,語法報錯,原因是,取了一樣的別名,在使用別名排序時,搞不清該別名到底指的是誰(即模稜兩可;含糊的,不明確的,引起歧義的,有兩種或多種意思的)*/ #select salary as a,hiredate as a from employees order by a; #5、count函數的詳細介紹 #統計個數,推薦使用COUNT(*),不推薦使用COUNT(欄位名) SELECT COUNT(salary), COUNT(commission_pct), #統計個數最好用*星號,不要用具體的某個欄位,因為某欄位中可能有null COUNT(*) AS 個數, COUNT(NULL), COUNT('aaa'), COUNT(6666), COUNT("bbb") FROM employees ;/*效率:MYISAM存儲引擎下 ,COUNT(*)的效率高INNODB存儲引擎下,COUNT(*)和COUNT(1)的效率差不多,比COUNT(欄位)要高一些*/ #SELECT COUNT(salary), COUNT(commission_pct) FROM employees;#SELECT COUNT(*) FROM employees;#SELECT COUNT(1), COUNT(66), COUNT("bbb"), COUNT('aaa') FROM employees;#SELECT * FROM employees; #6、和分組函數一同查詢的欄位有限制 #如下這條sql語句語法不會報錯,但是沒有任何意義SELECT AVG(salary), employee_id, last_name FROM employees;#測試下ROUND()函數SELECT ROUND(689.257, 2), ROUND('689.257', 2), ROUND('hello', 2), ROUND( '江西省贛州市于都縣', 4 ) ;#1.查詢公司員工工資的最大值,最小值,平均值,總和SELECT MAX(salary), MIN(salary), AVG(salary), ROUND(AVG(salary), 2), SUM(salary) FROM employees ; #DATEDIFF()函數SELECT DATEDIFF('2018-12-18', '2018-12-01'), DATEDIFF('2018-12-18', '2018-12-2'); SELECT DATEDIFF('18-3-8', '2018-3-01'), DATEDIFF('2018-2-12', '18-2-02');SELECT DATEDIFF('2018-3-01', '18-3-8'), DATEDIFF('18-2-02', '2018-2-12');#算一下自己活了多少天了SELECT DATEDIFF(NOW(), '1995-08-27'); #2.查詢員工表中的最大入職時間和最小入職時間的相差天數 (DIFFRENCE),使用DATEDIFF()函數SELECT MIN(hiredate) 最早入職, MAX(hiredate) 最晚入職, DATEDIFF(MAX(hiredate), MIN(hiredate)) AS 相差天數FROM employees ; #查看下employees表結構,查看下employees表中的hiredate欄位的類型DESC employees;#也可以使用如下方式SELECT MIN(hiredate) 最早入職, MAX(hiredate) 最晚入職, (UNIX_TIMESTAMP(MAX(hiredate)) - UNIX_TIMESTAMP(MIN(hiredate)))/(60*60*24) 相差天數, (UNIX_TIMESTAMP(MAX(hiredate)) - UNIX_TIMESTAMP(MIN(hiredate)))/(60*60*24*365) 相差年 FROM employees ;#3.查詢部門編號為90的員工個數#SELECT COUNT(*) FROM employees WHERE department_id = 90 ;#用單引號把90包起來,效果一樣SELECT COUNT(*) FROM employees WHERE department_id = '90' ;#用雙引號把90包起來,效果一樣SELECT COUNT(*) FROM employees WHERE department_id = "90" ;