MySQL數(shù)據(jù)庫(kù)之內(nèi)置函數(shù)和自定義函數(shù) function
前言:
函數(shù)分為兩類:系統(tǒng)函數(shù)和自定義函數(shù)
使用函數(shù):
select 函數(shù)名(參數(shù)列表);
1、內(nèi)置函數(shù)
1.1、字符串函數(shù)
函數(shù)名 | 說(shuō)明 |
---|---|
char_length | 判斷字符串的字符數(shù) |
length | 判斷字符串的字節(jié)數(shù),與字符集有關(guān) |
concat | 連接字符串 |
insrt | 檢查字符是否在目標(biāo)字符串中,存在返回其位置,不存在返回 0 |
lcase | 全部小寫 |
ltrim | 消除左邊的空格 |
left(str, length) | 左側(cè)開始截取字符串,直到指定位置 |
right(str, length) | 右側(cè)開始截取字符串,直到指定位置 |
mid | 從中間指定位置開始截取,如果不指定截取長(zhǎng)度,直接到最后 |
substring(str, index, [length]) | 從指定位置開始,指定截取長(zhǎng)度 |
substring_index(str, delim, count) | 按照關(guān)鍵字截取 |
示例:
select char_length('你好中國(guó)'); // 4 select length('你好中國(guó)'); // 12 select length('hello'); // 5 select char_length('hello'); // 5 select concat('你好', '中國(guó)'); // 你好中國(guó) -- 下標(biāo)從 1 開始 select instr('你好中國(guó)', '中國(guó)'); // 3 select instr('你好中國(guó)', '我'); // 0 select lcase('aBcd'); // abcd select left('aBcd', 2); // aB select right('abcdef', 2); // ef select substring('abcdef', 2, 3); // bcd select substring('abcdef', -2, 3); // ef select ltrim(' abc d '); // abc d select mid('你好中國(guó)', 3); // 中國(guó) select substring_index('www.baidu.com', '.', 2); // www.baidu select substring_index('www.baidu.com', '.', -2); // baidu.com
1.2、時(shí)間函數(shù)
函數(shù)名 | 說(shuō)明 |
---|---|
now() | 返回當(dāng)前時(shí)間,日期 時(shí)間 |
curdate() | 當(dāng)前日期 |
curtime() | 當(dāng)前時(shí)間 |
datediff() | 判斷兩個(gè)日期之間的天數(shù)之差,日期使用字符串格式(用引號(hào)) |
date_add(日期, interval 時(shí)間數(shù)字 type) | 時(shí)間增加(type: |
unix_timestamp() | 獲取時(shí)間戳 |
from_unixtime() | 將指定時(shí)間戳轉(zhuǎn)換成對(duì)應(yīng)的日期時(shí)間格式 |
示例:
select now(); // 2022-04-10 22:05:38 select curdate(); // 2022-04-10 select curtime(); // 22:05:51 select datediff('2022-01-09', '2022-01-01'); // 8 select date_add('2000-10-01', interval 10 day); // 2000-10-11 select unix_timestamp(); // 1649599799 select from_unixtime(1649599799); // 2022-04-10 22:09:59
1.3、數(shù)學(xué)函數(shù)
函數(shù)名 | 說(shuō)明 |
---|---|
abs | 絕對(duì)值 |
ceiling | 向上取整 |
floor | 向下取整 |
pow | 指數(shù) |
rand | 隨機(jī)數(shù)(0-1) |
round | 四舍五入 |
示例:
select abs(-1); // 1 select ceiling(1.1); // 2 select floor(1.9); // 1 select pow(2, 4); // 16 select rand(); // 0.2616088308967732 select round(1.5); // 2
1.4、其他函數(shù)
函數(shù)名 | 說(shuō)明 |
---|---|
md5() | MD5 |
version() | 版本號(hào) |
database() | 顯示當(dāng)前所在數(shù)據(jù)庫(kù) |
uuid() | 生成一個(gè)唯一標(biāo)識(shí)符,全局唯一 |
示例:
select md5('abc'); // 900150983cd24fb0d6963f7d28e17f72 select version(); // 8.0.16 select database(); // mydatabase select uuid(); // c44a06a2-b8d8-11ec-a53c-504259f9d746
2、自定義函數(shù)
mysql一旦見(jiàn)到分號(hào)結(jié)束符,就會(huì)開始執(zhí)行
修改語(yǔ)句結(jié)束符
基本語(yǔ)法:
delimiter 符號(hào);
2.1、創(chuàng)建函數(shù)
基本語(yǔ)法:
-- 修改語(yǔ)句結(jié)束符 delimiter $$; create function 函數(shù)名(形參) returns 返回值類型 begin // 函數(shù)體 return 返回值數(shù)據(jù); end 語(yǔ)句結(jié)束符 -- 將語(yǔ)句結(jié)束符修改回來(lái) delimiter ;
示例:
-- 修改語(yǔ)句結(jié)束符 delimiter $$ create function my_func1() returns int begin return 10; end -- 結(jié)束 $$ -- 將語(yǔ)句結(jié)束符改回來(lái) delimiter ;
如果只有一條語(yǔ)句,可以省略begin 和 end
-- 最簡(jiǎn)單的函數(shù) create function foo() returns int return 10;
為函數(shù)的形參指定數(shù)據(jù)類型
基本語(yǔ)法:
形參 數(shù)據(jù)類型
示例:
create function my_func2(a int, b int) returns int return a * b;
2.2、查看函數(shù)
基本語(yǔ)法:
show function status [like 'pattern'];
示例:
-- 查看所有函數(shù) show function status\G -- 查看單個(gè)函數(shù) mysql> show function status like 'foo'\G *************************** 1. row *************************** Db: mydatabase Name: foo Type: FUNCTION Definer: root@localhost Modified: 2022-04-10 22:34:06 Created: 2022-04-10 22:34:06 Security_type: DEFINER Comment: character_set_client: utf8mb4 collation_connection: utf8mb4_general_ci Database Collation: utf8mb4_general_ci 1 row in set (0.00 sec) -- 查看函數(shù)創(chuàng)建語(yǔ)句 mysql> show create function foo\G *************************** 1. row *************************** Function: foo sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION Create Function: CREATE DEFINER=`root`@`localhost` FUNCTION `foo`() RETURNS int(11) return 10 character_set_client: utf8mb4 collation_connection: utf8mb4_general_ci Database Collation: utf8mb4_general_ci 1 row in set (0.01 sec)
2.3、調(diào)用函數(shù)
基本語(yǔ)法
select 函數(shù)名(實(shí)參列表);
示例:
mysql> select foo(); +-------+ | foo() | +-------+ | 10 | +-------+ mysql> select my_func2(2, 3); +----------------+ | my_func2(2, 3) | +----------------+ | 6 | +----------------+
2.4、刪除函數(shù)
基本語(yǔ)法
drop function 函數(shù)名;
示例:
drop function my_func1;
2.5、注意事項(xiàng)
- 自定義函數(shù)屬于用戶級(jí)別,只有當(dāng)前客戶端對(duì)應(yīng)的數(shù)據(jù)庫(kù)中可以使用
- 可以在不同數(shù)據(jù)庫(kù)下看到函數(shù),但是不可以調(diào)用
- 自定義函數(shù)通常是為了將多行代碼集合到一起解決一個(gè)重復(fù)性的問(wèn)題
4.函數(shù)必須規(guī)范返回值,那么在函數(shù)內(nèi)部不能使用select指令,select一旦執(zhí)行就會(huì)的到一個(gè)結(jié)果集 result set;
可以使用給變量賦值語(yǔ)句
select 字段 into @變量;
3、函數(shù)流程結(jié)構(gòu)案例
需求:
從1開始,直到用戶傳入的對(duì)應(yīng)的值位置,自動(dòng)求和,凡是5的倍數(shù)都不要
設(shè)計(jì):
- 創(chuàng)建函數(shù)
- 需要一個(gè)形參,確定要累加到什么位置
- 需要定義一個(gè)變量來(lái)保存對(duì)應(yīng)的結(jié)果
- 內(nèi)容部需要一個(gè)循環(huán)來(lái)實(shí)現(xiàn)迭代累加
- 循環(huán)內(nèi)部需要進(jìn)行條件判斷控制,5的倍數(shù)
定義函數(shù):
-- 創(chuàng)建一個(gè)自動(dòng)求和的函數(shù) -- 修改語(yǔ)句結(jié)束符 delimiter $$ -- 創(chuàng)建函數(shù) create function my_sum(end_value int) returns int begin -- 聲明局部變量 declare res int default 0; declare i int default 0; -- 循環(huán)處理 mywhile: while i <= end_value do -- mysql中沒(méi)有++ set i = i + 1; -- 判斷當(dāng)前數(shù)據(jù)是否合理 if i % 5 = 0 then iterate mywhile; end if; -- 修改變量,累加 set res = res + i; end while; -- 返回值 return res; end -- 結(jié)束 $$ -- 修改語(yǔ)句結(jié)束符 delimiter ;
調(diào)用函數(shù):
-- 實(shí)參個(gè)數(shù)必須等于形參個(gè)數(shù) select my_sum(10);
相關(guān)文章
最全50個(gè)Mysql數(shù)據(jù)庫(kù)查詢練習(xí)題
這篇文章主要介紹了最全50個(gè)數(shù)據(jù)庫(kù)查詢練習(xí)題,Mysql數(shù)據(jù)庫(kù)版本,全部都驗(yàn)證過(guò)2020-12-12Ubuntu?服務(wù)器安裝?MySQL?遠(yuǎn)程數(shù)據(jù)庫(kù)的方法
本篇介紹如何在 Linux 服務(wù)器上安裝 MySQL 數(shù)據(jù)庫(kù),并設(shè)置為可遠(yuǎn)程連接,本文通過(guò)命令給大家介紹的非常詳細(xì),對(duì)Ubuntu?安裝?MySQL遠(yuǎn)程數(shù)據(jù)庫(kù)感興趣的朋友一起看看吧2022-08-08數(shù)據(jù)庫(kù)SQL調(diào)優(yōu)的幾種方式匯總
在項(xiàng)目中,SQL的調(diào)優(yōu)對(duì)項(xiàng)目的性能來(lái)講至關(guān)重要,所有掌握常見(jiàn)的SQL調(diào)優(yōu)方式是必不可少的,下面這篇文章主要給大家介紹了關(guān)于數(shù)據(jù)庫(kù)SQL調(diào)優(yōu)的幾種方式,需要的朋友可以參考下2022-10-10詳解mysql 使用left join添加where條件的問(wèn)題分析
這篇文章主要介紹了詳解mysql 使用left join添加where條件的問(wèn)題分析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02