一蔚万、常見內置函數(shù)
從文檔列表可知贺待,MySQL內置函數(shù)涵蓋范圍非常廣:控制流函數(shù)徽曲、字符串函數(shù)、數(shù)值函數(shù)狠持、時間日期函數(shù)疟位、全文搜索函數(shù) 映射函數(shù)、XML函數(shù)喘垂、位函數(shù)甜刻、加密和壓縮函數(shù)、信息函數(shù)正勒、空間分析函數(shù)得院、Json函數(shù)、企業(yè)加密函數(shù)等等章贞。在此只列舉開發(fā)中常用的函數(shù)祥绞。
聚合函數(shù)
這些函數(shù)與其它函數(shù)有些不同:它們一般作用在多條記錄上,一般與GROUP BY等關鍵字組合使用鸭限。
- AVG([DISTINCT] expr):返回平均值
mysql> SELECT student_name, AVG(test_score)
-> FROM student
-> GROUP BY student_name;
- COUNT(expr):返回記錄數(shù)
mysql> SELECT student.student_name,COUNT(*)
-> FROM student,course
-> WHERE student.student_id=course.student_id
-> GROUP BY student_name;
#
# COUNT(*) is somewhat different in that it returns a count of the number of rows retrieved,
# whether or not they contain NULL values.`
-
COUNT(DISTINCT expr,[expr...]):
Returns a count of the number of rows with different non-NULL expr values.
mysql> SELECT COUNT(DISTINCT results) FROM student;
- MAX([DISTINCT] expr):返回表達式中的最大值
mysql> SELECT student_name, MIN(test_score), MAX(test_score)
-> FROM student
-> GROUP BY student_name;
- MIN([DISTINCT] expr) :返回表達式的最小值
mysql> SELECT student_name, MIN(test_score), MAX(test_score)
-> FROM student
-> GROUP BY student_name;
-
SUM([DISTINCT] expr)
:返回表達式的和
字符串函數(shù)
-
CONCAT()
:返回連接字符串(如果其中任何一個參數(shù)為NULL蜕径,則返回NULL)
mysql> SELECT CONCAT('My', 'S', 'QL');
-> 'MySQL'
mysql> SELECT CONCAT('My', NULL, 'QL');
-> NULL
mysql> SELECT CONCAT(14.3);
-> '14.3'
- INSERT(str,pos,len,newstr) :將str的從pos位置開始的len個字符替換為newstr(如果其中任何一個參數(shù)為NULL,則返回NULL)
mysql> SELECT INSERT('Quadratic', 3, 4, 'What');
-> 'QuWhattic'
mysql> SELECT INSERT('Quadratic', -1, 4, 'What');
-> 'Quadratic'
mysql> SELECT INSERT('Quadratic', 3, 100, 'What');
-> 'QuWhat'
LOWER(str)和UPPER(str) :將字符串str轉換成小寫/大寫
LEFT(str,len)和RIGHT(str,len) :分別返回str最左邊/最右邊的n個字符(如果其中任何一個參數(shù)為NULL败京,則返回NULL)
TRIM(str)和RTRIM(str)以及LTRIM(str):去除字符串str左右空格/右空格/左空格
REPLACE(str,from_str,to_str):將字符串str中所有出現(xiàn)的from_str字符串替換為to_str
mysql> SELECT REPLACE('www.mysql.com', 'w', 'Ww');
-> 'WwWwWw.mysql.com'
- SUBSTRING(str,pos,len):返回字符串str中從pos起兜喻,len個字符長度的字符串
mysql> SELECT SUBSTRING('Quadratically',5);
-> 'ratically'
mysql> SELECT SUBSTRING('foobarbar' FROM 4);
-> 'barbar'
mysql> SELECT SUBSTRING('Quadratically',5,6);
-> 'ratica'
mysql> SELECT SUBSTRING('Sakila', -3);
-> 'ila'
mysql> SELECT SUBSTRING('Sakila', -5, 3);
-> 'aki'
mysql> SELECT SUBSTRING('Sakila' FROM -4 FOR 2);
-> 'ki'
數(shù)值函數(shù)
- ABS(x):返回x的絕對值
mysql> SELECT ABS(2);
-> 2
mysql> SELECT ABS(-32);
-> 32
- CEILING(x)或者CEIL(x):返回大于x的最小整數(shù)
- FLOOR(x) :返回小于x的最大整數(shù)
mysql> SELECT CEILING(1.23);
-> 2
mysql> SELECT CEILING(-1.23);
-> -1
mysql> SELECT FLOOR(1.23), FLOOR(-1.23);
-> 1, -2
- MOD(N,M) 或者 N % M 或者 N MOD M:取模
mysql> SELECT MOD(234, 10);
-> 4
mysql> SELECT 253 % 7;
-> 1
mysql> SELECT MOD(29,9);
-> 2
mysql> SELECT 29 MOD 9;
-> 2
- RAND()
用法1:返回[0 ~1.0)之間的隨機數(shù)
//要得到i <= R < j的隨機數(shù): FLOOR(i + RAND() * (j?i))
//比如,要得到5~10之間的隨機數(shù):FLOOR(5 + RAND()*5)
用法2:SELECT * FROM tbl_name ORDER BY RAND();
:retrieve rows in random order
- ROUND(X)或者ROUND(X,D):對X四舍五入赡麦,含有D位小數(shù)的值朴皆,D值默認為0
mysql> SELECT ROUND(-1.23);
-> -1
mysql> SELECT ROUND(-1.58);
-> -2
mysql> SELECT ROUND(1.58);
-> 2
mysql> SELECT ROUND(1.298, 1);
-> 1.3
mysql> SELECT ROUND(1.298, 0);
-> 1
mysql> SELECT ROUND(23.298, -1);
-> 20
- TRUNCATE(X,D):返回數(shù)字X被截斷為D位小數(shù)的數(shù)值(與ROUND()類似帕识,只是不四舍五入)
mysql> SELECT TRUNCATE(1.223,1);
-> 1.2
mysql> SELECT TRUNCATE(1.999,1);
-> 1.9
mysql> SELECT TRUNCATE(1.999,0);
-> 1
mysql> SELECT TRUNCATE(-1.999,1);
-> -1.9
mysql> SELECT TRUNCATE(122,-2);
-> 100
mysql> SELECT TRUNCATE(10.28*100,0);
-> 1028
時間日期函數(shù)
-
CURDATE()
:返回當前日期,格式為'YYYY-MM-DD'或者YYYYMMDD遂铡,取決于該函數(shù)的使用場景
mysql> SELECT CURDATE();
-> '2008-06-13'
mysql> SELECT CURDATE() + 0;
-> 20080613
- CURTIME([fsp]):返回當前時間肮疗,格式為'HH:MM:SS'或者HHMMSS
mysql> SELECT CURTIME();
-> '23:50:26'
mysql> SELECT CURTIME() + 0;
-> 235026.000000
- NOW([fsp]):返回當前日期+時間
mysql> SELECT NOW();
-> '2007-12-15 23:50:26'
mysql> SELECT NOW() + 0;
-> 20071215235026.000000
- UNIX_TIMESTAMP(), UNIX_TIMESTAMP(date):返回當前時間/date的unix時間戳
mysql> SELECT UNIX_TIMESTAMP();
+------------------+
| UNIX_TIMESTAMP() |
+------------------+
| 1496132631 |
+------------------+
1 row in set
mysql> SELECT UNIX_TIMESTAMP('2017-05-30 16:25:19');
+---------------------------------------+
| UNIX_TIMESTAMP('2017-05-30 16:25:19') |
+---------------------------------------+
| 1496132719 |
+---------------------------------------+
1 row in set
mysql> SELECT FROM_UNIXTIME(1447430881);
-> '2015-11-13 10:08:01'
mysql> SELECT FROM_UNIXTIME(1447430881) + 0;
-> 20151113100801
mysql> SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(),
-> '%Y %D %M %h:%i:%s %x');
-> '2015 13th November 10:08:01 2015'
- DATE_FORMAT(date,format):將date時間格式化
mysql> SELECT DATE_FORMAT('2009-10-04 22:23:00', '%W %M %Y');
-> 'Sunday October 2009'
mysql> SELECT DATE_FORMAT('2007-10-04 22:23:00', '%H:%i:%s');
-> '22:23:00'
mysql> SELECT DATE_FORMAT('1900-10-04 22:23:00', '%D %y %a %d %m %b %j');
-> '4th 00 Thu 04 10 Oct 277'
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%H %k %I %r %T %S %w');
-> '22 22 10 10:23:00 PM 22:23:00 00 6'
mysql> SELECT DATE_FORMAT('1999-01-01', '%X %V');
-> '1998 52'
mysql> SELECT DATE_FORMAT('2006-06-00', '%d');
-> '00'
其他函數(shù)
- database() :當前數(shù)據(jù)庫
- version():當前數(shù)據(jù)庫版本
- user() :當前登錄用戶
mysql> select database(), version(), user();
+------------+------------+----------------+
| database() | version() | user() |
+------------+------------+----------------+
| cpgl | 5.7.17-log | root@localhost |
+------------+------------+----------------+
1 row in set
二、自定義函數(shù)
基本語法
- 創(chuàng)建
CREATE FUNCTION [db_name.]fn_name(func_parameter[,...])
RETURNS type
[characteristic...]
routine_body
#解釋
db_name:數(shù)據(jù)庫名扒接,不指明則為當前數(shù)據(jù)庫
type: 任何mysql支持的類型
routine_body: 函數(shù)體
characteristic:
LANGUAGE SQL | [NOT]DETERMINISTIC
| {CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA}
| SQL SECURITY {DEFINER | INVOKER}
| COMMENT 'String'
注意:函數(shù)中一定要有return返回值語句
- 刪除
DROP FUNCTION [IF EXISTS] fn_name;
- 更改
ALTER FUNCTION fn_name [characteristic...]
- 查看狀態(tài)或定義語句
SHOW FUNCTION STATUS [LIKE 'pattern']
SHOW CREATE FUNCTION fn_name;
- 函數(shù)中的變量
- 定義變量
a.通過DECLARE可以定義一個局部變量伪货,變量的作用范圍BEGIN...END塊中;
b.全局變量不用聲明珠增,可以直接@XXX使用超歌。定義全局變量:set @var_name=value
,如:
mysql> set @a=1;
Query OK, 0 rows affected
c.變量語句必須寫在復合語句開頭蒂教,并且在其他語句的前面;
d.一次性可以聲明多個變量;
DECLARE var_name[,...] type [DEFAULT value]
- 為變量賦值
a.直接賦值:SET var_name = expr[,var_name=expr]...
b.通過查詢語句賦值:SELECT...INTO...
巍举,如:
SELECT 表中某字段 INTO 變量名 FROM 表名 WHERE條件;
這種方式下,SELECT語句的查詢結果只能有一個凝垛。
- 其他說明
- 運行包含DDL語句懊悯,允許提交或回滾
- 可以在函數(shù)中調用其它函數(shù)或者存儲過程
- 與存儲過程類似,可以一塊看
實例
例子1
#創(chuàng)建表
CREATE TABLE `t_user_main` (
`f_userId` int(10) NOT NULL AUTO_INCREMENT COMMENT '用戶id,作為主鍵',
`f_userName` varchar(5) DEFAULT NULL COMMENT '用戶名',
`f_age` int(3) DEFAULT NULL COMMENT '年齡',
PRIMARY KEY (`f_userId`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
#插入數(shù)據(jù)
INSERT INTO t_user_main (f_userName, f_age)
VALUES('one',24),('two',25),('three',26),('four',27),('five',28),('six',29);
#創(chuàng)建一個函數(shù)
DELIMITER $$ -- 定界符
-- 開始創(chuàng)建函數(shù)
CREATE FUNCTION user_main_fn(v_id INT)
RETURNS VARCHAR(50)
BEGIN
-- 定義變量
DECLARE v_userName VARCHAR(50);
-- 給定義的變量賦值
SELECT f_userName INTO v_userName FROM t_user_main
WHERE f_userId = v_id;
-- 返回函數(shù)處理結果
RETURN v_userName;
END $$ -- 函數(shù)創(chuàng)建定界符
DELIMITER ;
例子2