目錄
文章涉及到的MySQL、SQLyog的配置安裝,請參考 MySQL配置+SQLyog安裝教程
MySQL函數
概念
類似於JAVA中的方法,將一組邏輯語句封裝在方法體中,對外暴露方法名
好處
- 隱藏實現細節
- 提高代碼的重用性
調用
#如果函數中的參數用到了某個表中的字段那麼就需要使用from加入這個表
SELECT 函數名(實參列表)
FROM 表;
特點
- 叫什麼(函數名)
- 幹什麼(函數功能)
分類
- 單行函數;功能:做處理的;例如:concat、length、ifnull等肯定有一個返回值
- 分組函數;功能:做統計使用的,又叫統計函數、聚合函數、組函數
一、單行函數
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');