MySQL進階四:常見函數

目錄

MySQL函數

概念

好處

調用

特點

分類

一、單行函數

1、字符函數

1) length 獲取參數值的字節個數

2) concat 拼接字符串

3) upper、lower 大寫、小寫

4) substr、substring 截取字符串

5) instr 查找子串

6) trim 去掉前後空格

7) lpad 左填充

8) rpad 右填充

9) replace 替代

2、數學函數

1) round 四捨五入

2) ceil 向上取整

3) floor 向下取整

4) truncate 截斷

5) mod 取餘

3、日期函數

1) now

2) curdate

3) curtime 

4) 獲取指定部分(年、月、日、小時、分鐘、秒)

5) str_to_date

6) date_format

4、其他函數

5、流程控制函數

1) if

2) case函數的使用一:類似switch

3) case函數的使用二:類似多重if

二、分組函數

綜述

1、簡單的使用

2、參數支持哪些類型

3、忽略null值

4、和distinct搭配

5、count函數詳細介紹

6、和分組查詢一同查詢的字段有限制

7、補充:計算自己到現在過了多少天?


文章涉及到的MySQL、SQLyog的配置安裝,請參考 MySQL配置+SQLyog安裝教程

MySQL函數

概念

類似於JAVA中的方法,將一組邏輯語句封裝在方法體中,對外暴露方法名

好處

  • 隱藏實現細節
  • 提高代碼的重用性

調用

#如果函數中的參數用到了某個表中的字段那麼就需要使用from加入這個表
SELECT 函數名(實參列表)
FROM 表;

特點

  • 叫什麼(函數名)
  • 幹什麼(函數功能)

分類

  1. 單行函數;功能:做處理的;例如:concat、length、ifnull等肯定有一個返回值
  2. 分組函數;功能:做統計使用的,又叫統計函數、聚合函數、組函數

一、單行函數

1、字符函數

1) length 獲取參數值的字節個數

SELECT LENGTH('john');
SELECT LENGTH('張三分hahaha'); # utf8一個漢字佔3個字節

2) concat 拼接字符串

SELECT CONCAT(last_name, '_', first_name) 姓名
FROM employees;

3) upper、lower 大寫、小寫

#案例:將姓變大寫,名變小寫然後拼接
SELECT CONCAT(UPPER(last_name), LOWER(first_name)) 姓名
FROM employees;

4) substr、substring 截取字符串

注意:SQL中索引都是從1開始

#返回“路站遠”
SELECT SUBSTR('李莫愁愛上了路站遠', 7) out_put;
#返回“李莫愁”截取從指定索引處,指定長度(字符長度不是字節長度)的字符
SELECT SUBSTR('李莫愁愛上了路站遠', 1, 3) out_put;
#案例:姓名中首字符大寫,然後其他字符小寫,用下劃線拼接
SELECT CONCAT(UPPER(SUBSTR(last_name, 1, 1)), '_', LOWER(SUBSTR(last_name, 2))) out_put
FROM employees;

5) instr 查找子串

返回字符串在大的字符串中第一次出現的起始索引,如果搜索不到返回0

SELECT INSTR('楊不引流俠悔愛上了引流俠', '引流俠') AS out_put;

6) trim 去掉前後空格

SELECT LENGTH(TRIM('    張翠山    ')) AS out_put;
#去掉前後的a中間的不去掉,或者是以aa爲單位進行刪除
SELECT TRIM('aa' FROM 'aaaaaaaaa張aaa翠aaaaa山aaaaaaaa') AS out_put;

7) lpad 左填充

用指定的字符實現左填充指定長度

SELECT LPAD('殷素素', 10, '*') AS out_put;
# 如果數值=2 返回 殷素 需要進行截斷

8) rpad 右填充

SELECT RPAD('殷素素', 12, 'ab') AS out_put;

9) replace 替代

SELECT REPLACE('張無忌愛周芷若上了周芷若', '周芷若', '趙明') AS out_put;

2、數學函數

1) round 四捨五入

SELECT ROUND(-1.45);
SELECT ROUND(1.567, 2); #小數點後保留2位

2) ceil 向上取整

返回大於等於該參數的最小整數

SELECT CEIL(1.00);

3) floor 向下取整

返回小於等於該參數的最大整數

SELECT FLOOR(-9.99);

4) truncate 截斷

小數點後x位之後進行截斷

SELECT TRUNCATE(1.65, 1);#小數點後的1位之後進行截斷

5) mod 取餘

a - a/b * b

SELECT MOD(10, -3);#被除數爲負數結果爲負數,被除數爲正數,結果爲正數
SELECT 10%3;

3、日期函數

1) now

返回當前系統日期

SELECT NOW();

2) curdate

返回當前系統的日期(不包含時間)

SELECT CURDATE();

3) curtime 

返回當前系統的時間(不包含日期)

SELECT CURTIME();

4) 獲取指定部分(年、月、日、小時、分鐘、秒)

SELECT YEAR(NOW()) 年;
SELECT YEAR('1998-1-1') 年;

SELECT YEAR(hiredate) 年
FROM employees;

SELECT MONTH(NOW()) 月;
SELECT MONTHNAME(NOW()) 月;

5) str_to_date

將日期格式的字符轉化成指定的日期

#案例:查詢入職日期爲1992-4-3的員工信息
SELECT *
FROM employees
WHERE hiredate = STR_TO_DATE('4-3 1992', '%c-%d %Y');

6) date_format

將日期轉化成字符

#查詢有獎金的員工的名和入職日期(xx月/xx日 xx年)
SELECT last_name, DATE_FORMAT(hiredate, '%m月/%d日 %y年') AS 入職日期
FROM employees
WHERE commission_pct IS NOT NULL;

4、其他函數

SELECT VERSION();   #SQL版本查詢
SELECT DATABASE();  #當前所在DB
SELECT USER();      #當前的用戶

5、流程控制函數

1) if

if else的效果

SELECT IF(10>5, '大', '小') AS out_put;

SELECT last_name, commission_pct, IF(commission_pct IS NULL, '沒獎金', '有獎金,哈哈') AS out_put
FROM employees;

2) case函數的使用一:類似switch

語法

case 要判斷的字段或者表達式
when 常量1 then 要顯示的值1或語句1;
when 常量2 then 要顯示的值1或語句2;
when 常量3 then 要顯示的值1或語句3;(如果顯示的是值不加分號,語句加分號)
...
else (默認)要顯示的值n或語句n;
end
/* 案例:查詢員工的工資,要求
部門號=30,顯示工資爲1.1倍
部門號=40,顯示工資爲1.2倍
部門號=50,顯示工資爲1.3倍
*/
SELECT salary 原始工資, department_id, 
CASE department_id
WHEN 30 THEN salary*1.1
WHEN 40 THEN salary*1.2
WHEN 50 THEN salary*1.3
ELSE salary
END AS 新工資
FROM employees;

3) case函數的使用二:類似多重if

語法

case 
when 條件1 then 要顯示的值1或者語句1(值不加分號)
when 條件2 then 要顯示的值2或者語句2
...
else 要顯示的值n或者語句n
end
/*
案例:查詢員工的工資情況
如果工資>20000,顯示A級別
如果工資>15000,顯示B級別
如果工資>10000,顯示C級別
否則,顯示D級別
*/
SELECT salary,
CASE 
WHEN salary>20000 THEN 'A'
WHEN salary>15000 THEN 'B'
WHEN salary>10000 THEN 'C'
ELSE 'D'
END AS 新工資
FROM employees;

二、分組函數

綜述

功能:用作統計使用,又稱爲聚合函數或者統計函數或者組函數

分類:

  • sum 求和
  • avg 平均值
  • max 最大值
  • min 最小值
  • count 計算個數

特點:

  • sum、avg一般用於處理數值型
  • max、min、count可以處理任何類型
  • 以上分組函數都忽略null值
  • 可以和distinct搭配實現去重的運算
  • 一般使用count(*)用作統計行數
  • 和分組函數一同查詢的字段要求是group by後的字段,其他字段不行(之後介紹)

1、簡單的使用

SELECT SUM(salary) AS out_put
FROM employees;

SELECT AVG(salary) AS out_put
FROM employees;

SELECT MAX(salary) AS out_put
FROM employees;

SELECT MIN(salary) AS out_put
FROM employees;

SELECT COUNT(salary) AS out_put
FROM employees;

SELECT SUM(salary) 和, ROUND(AVG(salary), 2) 平均, MAX(salary) 最高, MIN(salary) 最低, COUNT(salary) 個數
FROM employees;

2、參數支持哪些類型

SELECT SUM(last_name), AVG(last_name) #按理是報錯的,失去了意義
FROM employees;

SELECT SUM(hiredate) #按理毅然沒有意義
FROM employees;

SELECT MIN(last_name), MAX(last_name) #由於last_name可以排序,所有是支持的,所以日期型也是可以支持的
FROM employees;

SELECT COUNT(last_name) #計算非null的值的個數
FROM employees;

3、忽略null值

SELECT SUM(commission_pct), AVG(commission_pct) 
FROM employees;

SELECT MAX(commission_pct), MIN(commission_pct)
FROM employees;

SELECT COUNT(commission_pct)
FROM employees;

4、和distinct搭配

SELECT SUM(DISTINCT salary), SUM(salary)
FROM employees;

SELECT COUNT(DISTINCT salary), COUNT(salary)
FROM employees;

5、count函數詳細介紹

SELECT COUNT(salary)
FROM employees;

SELECT COUNT(*) #統計列表中的總行數(任何字段只要有一個不爲null個數就+1,這樣做比放入字段更加的穩定)
FROM employees;

SELECT COUNT(1) #在字段前面加了一列的1,所以統計1的個數就是統計有多少行,自要在count中加入任何常量值都行,寫1是因爲簡單
FROM employees;

效率問題:

  • MYISAM存儲引擎下,count(*)效率最高,因爲在該引擎有內部計數器,count(*)直接返回個數
  • INNODB存儲引擎下,count(*)和count(1)的效率差不多,但是比count(字段)要高一些,因爲需要判斷字段每一行的值是否爲null
  • 綜上所述,直接使用count(*)

6、和分組查詢一同查詢的字段有限制

SELECT AVG(salary), employee_id # avg返回一個數,而後面的id是返回一個字段,查詢結果不管是返回什麼樣的表格都意義不大
FROM employees;

7、補充:計算自己到現在過了多少天?

SELECT DATEDIFF(NOW(), '1900-1-1');

 

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