MySQL之存儲(chǔ)函數(shù)詳細(xì)介紹
1、創(chuàng)建存儲(chǔ)函數(shù)
語(yǔ)法格式:
CREATE FUNCTION 函數(shù)名(參數(shù)名 參數(shù)類型,...) RETURNS 返回值類型 BEGIN 函數(shù)體 #函數(shù)體中肯定有 RETURN 語(yǔ)句 END
說(shuō)明:
參數(shù)列表:
FUNCTION中總是默認(rèn)為IN參數(shù)
RETURNS
后的語(yǔ)句表示函數(shù)返回?cái)?shù)據(jù)的類型;
RETURNS子句只能對(duì)FUNCTION做指定,對(duì)函數(shù)而言這是強(qiáng)制
的。它用來(lái)指定函數(shù)的返回類型,而且函數(shù)體必須包含一個(gè)RETURN value
語(yǔ)句。
函數(shù)體也可以用BEGIN…END
來(lái)表示SQL代碼的開(kāi)始和結(jié)束。
如果函數(shù)體只有一條語(yǔ)句,也可以省略BEGIN…END
。
2 、調(diào)用存儲(chǔ)函數(shù)
在MySQL中,存儲(chǔ)函數(shù)的使用方法與MySQL內(nèi)部函數(shù)的使用方法是一樣的。換言之,用戶自己定義的存儲(chǔ)函數(shù)與MySQL內(nèi)部函數(shù)是一個(gè)性質(zhì)的。區(qū)別在于,存儲(chǔ)函數(shù)是用戶自己定義
的,而內(nèi)部函數(shù)是MySQL的開(kāi)發(fā)者定義
的。
SELECT 函數(shù)名(實(shí)參列表)
3、刪除存儲(chǔ)函數(shù)
語(yǔ)法結(jié)構(gòu):
DROP FUNCTION [IF EXISTS] 存儲(chǔ)函數(shù)名
4、查看存儲(chǔ)過(guò)程
1. 使用SHOW CREATE語(yǔ)句查看存儲(chǔ)過(guò)程和函數(shù)的創(chuàng)建信息
語(yǔ)法結(jié)構(gòu):
SHOW CREATE FUNCTION 存儲(chǔ)函數(shù)名
2. 使用SHOW STATUS語(yǔ)句查看存儲(chǔ)函數(shù)的狀態(tài)信息
語(yǔ)法結(jié)構(gòu):
SHOW FUNCTION STATUS [LIKE 'pattern']
這個(gè)語(yǔ)句返回子程序的特征,如數(shù)據(jù)庫(kù)、名字、類型、創(chuàng)建者及創(chuàng)建和修改日期。
[LIKE 'pattern']
匹配存儲(chǔ)函數(shù)的名稱,可以省略。當(dāng)省略不寫(xiě)時(shí),會(huì)列出MySQL數(shù)據(jù)庫(kù)中存在的所有存儲(chǔ)函數(shù)的信息。
舉例:
#查詢名稱以select開(kāi)頭的存儲(chǔ)函數(shù) mysql> SHOW FUNCTION STATUS LIKE 'SELECT%'; *************************** 1. row *************************** Db: test_db Name: SelectAllData Type: FUNCTION Definer: root@localhost Modified: 2021-10-16 15:55:07 Created: 2021-10-16 15:55:07 Security_type: DEFINER Comment: character_set_client: utf8mb4 collation_connection: utf8mb4_general_ci Database Collation: utf8mb4_general_ci
3. 從information_schema.Routines表中查看存儲(chǔ)函數(shù)的信息
MySQL中存儲(chǔ)函數(shù)的信息存儲(chǔ)在information_schema數(shù)據(jù)庫(kù)下的Routines表中。可以通過(guò)查詢?cè)摫淼挠涗泚?lái)查詢存儲(chǔ)函數(shù)的信息。
語(yǔ)法結(jié)構(gòu):
SELECT * FROM information_schema.Routines WHERE ROUTINE_NAME='存儲(chǔ)函數(shù)名' [AND ROUTINE_TYPE = 'FUNCTION '];
說(shuō)明: 如果在MySQL數(shù)據(jù)庫(kù)中存在存儲(chǔ)過(guò)程和函數(shù)名稱相同的情況
,最好指定ROUTINE_TYPE
查詢條件來(lái)指明查詢的是存儲(chǔ)過(guò)程還是函數(shù)。
5、修改存儲(chǔ)函數(shù)
修改存儲(chǔ)函數(shù),不影響存儲(chǔ)函數(shù)功能,只是修改相關(guān)特性。使用ALTER語(yǔ)句實(shí)現(xiàn)。
ALTER FUNCTION 存儲(chǔ)函數(shù)名;
6、對(duì)比存儲(chǔ)函數(shù)和存儲(chǔ)過(guò)程
關(guān)鍵字 | 調(diào)用語(yǔ)法 | 返回值 | 應(yīng)用場(chǎng)景 | |
---|---|---|---|---|
存儲(chǔ)過(guò)程 | PROCEDURE | CALL 存儲(chǔ)過(guò)程() | 理解為有0個(gè)或多個(gè) | 一般用于更新 |
存儲(chǔ)函數(shù) | FUNCTION | SELECT 函數(shù)() | 只能是一個(gè) | 一般用于查詢結(jié)果為一個(gè)值并返回時(shí) |
此外,存儲(chǔ)函數(shù)可以放在查詢語(yǔ)句中使用,存儲(chǔ)過(guò)程不行。反之,存儲(chǔ)過(guò)程的功能更加強(qiáng)大,包括能夠執(zhí)行對(duì)表的操作(比如創(chuàng)建表,刪除表等)和事務(wù)操作,這些功能是存儲(chǔ)函數(shù)不具備的。
7、練習(xí)題加強(qiáng)
#前提準(zhǔn)備 CREATE TABLE employees AS SELECT * FROM atguigudb.`employees`; CREATE TABLE departments AS SELECT * FROM atguigudb.`departments`;
#1. 創(chuàng)建函數(shù)get_count(),返回公司的員工個(gè)數(shù) #有參有返回 SET GLOBAL log_bin_trust_function_creators = 1; DELIMITER $ CREATE FUNCTION get_count() RETURNS INT BEGIN RETURN (SELECT COUNT(*) FROM employees); END $ DELIMITER ;
注意:
自己在創(chuàng)建存儲(chǔ)函數(shù)中報(bào)錯(cuò)“you might want to use the less safe log_bin_trust_function_creators variable
”,然后查看筆記發(fā)現(xiàn)解決此問(wèn)題的一種方式就是執(zhí)行SET GLOBAL log_bin_trust_function_creators = 1;
SQL語(yǔ)句
#2. 創(chuàng)建函數(shù)ename_salary(),根據(jù)員工id,返回它的工資 #查詢表結(jié)構(gòu)來(lái)看要返回?cái)?shù)據(jù)的類型 DESC employees; DELIMITER $ CREATE FUNCTION ename_salary(id INT) RETURNS DOUBLE(8,2) BEGIN RETURN (SELECT salary FROM employees WHERE employee_id = id); END $ DELIMITER ; #查詢結(jié)果 SELECT ename_salary(100);
愛(ài)在結(jié)尾:自己應(yīng)該學(xué)會(huì):1、會(huì)使用創(chuàng)建存儲(chǔ)函數(shù)的基本語(yǔ)法 ; 2、學(xué)會(huì)調(diào)用存儲(chǔ)函數(shù); 3、知道存儲(chǔ)函數(shù)與存儲(chǔ)過(guò)程的相同和不同點(diǎn)
到此這篇關(guān)于MySQL之存儲(chǔ)函數(shù)詳細(xì)介紹的文章就介紹到這了,更多相關(guān)MySQL存儲(chǔ)函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mysql5.7.17 winx64.zip解壓縮版安裝配置圖文教程
這篇文章主要介紹了Mysql5.7.17 winx64.zip解壓縮版安裝配置圖文教程,需要的朋友可以參考下2018-03-03mysql 無(wú)限級(jí)分類實(shí)現(xiàn)思路
關(guān)于該問(wèn)題,暫時(shí)自己還沒(méi)有深入研究,在網(wǎng)上找到幾種解決方案,各有優(yōu)缺點(diǎn)。2011-08-08MySQL腳本批量自動(dòng)插入數(shù)據(jù)及數(shù)據(jù)可按條件插入實(shí)現(xiàn)
在初始化數(shù)據(jù)庫(kù)或者導(dǎo)入一些數(shù)據(jù)時(shí),常常會(huì)用到批量的操作,本文主要介紹了MySQL腳本批量自動(dòng)插入數(shù)據(jù)及數(shù)據(jù)可按條件插入實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01Mybatis的where標(biāo)簽使用總結(jié)梳理
這篇文章主要介紹了Mybatis的where標(biāo)簽使用總結(jié)梳理,文章通過(guò)將Mybatis中where標(biāo)簽的基本使用形式展開(kāi)where標(biāo)簽小技巧以及容易踩到的坑進(jìn)行總結(jié)梳理,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-05-05win10下安裝mysql8.0.23 及 “服務(wù)沒(méi)有響應(yīng)控制功能”問(wèn)題解決辦法
這篇文章主要介紹了win10下安裝mysql8.0.23 及 “服務(wù)沒(méi)有響應(yīng)控制功能”問(wèn)題解決辦法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03Mysql?innoDB修改自增id起始數(shù)的方法步驟
本文主要介紹了Mysql?innoDB修改自增id起始數(shù)的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧<BR>2023-03-03