**1. 定義函數**
```sql
# 定義函數的語法
CREATE FUNCTION fun_name(param_name param_type, ...)
RETURNS type_
[COMMENT 'string']
[LANGUAGE SQL]
[DETERMINISTIC | NOT DETERMINISTIC]
[CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA]
[SQL SECURITY {DEFINER | INVOKER}]
BEGIN
-- 業務邏輯代碼
RETURN value_;
END;
- fun_name:自定義的函數名稱,建議避免與MySQL中的函數重名
- COMMENT'string':用于對存儲過程的描述,其中string為描述內容,comment為關鍵字
- LANGUAGE SQL:指明編寫這個存儲過程的語言為SQL語言
- DETERMINISTIC:表示存儲過程對同樣的輸入參數產生相同的結果
- NOT DETERMINISTIC:表示存儲過程對同樣的輸入參數產生不相同的結果(默認)
- CONTAINS SQL:表示存儲過程包含讀或寫數據的SQL語句(默認)
- NO SQL:表示存儲過程不包含任何SQL語句
- READS SQL DATA:表示存儲過程只包含讀數據的SQL語句
- MODIFIES SQL DATA:表示存儲過程只包含寫數據的SQL語句
- SQL SECURITY:表示存儲過程的調用是用存儲過程的定義者的許可(definer,默認)來執行,
還是用調用者的許可(invoker)來執行
```
```sql
# 案例演示準備數據
drop table if exists `user`;
create table `user`(
`id` int(11) primary key not null auto_increment,
`username` varchar(255) not null,
`password` varchar(255) not null
)engine=INNODB default charset=utf8;
# 創建函數
delimiter $
create function fun_user(uname varchar(255), pass varchar(255))
returns int
begin
-- 聲明一個局部變量
declare result int default 0;
insert into `user`(`username`, `password`) values(uname, pass);
-- 給變量賦值
set result = 1;
return result;
end $
# 調用函數
mysql> select fun_user('張三', 'zhangsan') $
+--------------------------------+
| fun_user('張三', 'zhangsan') |
+--------------------------------+
| 1 |
+--------------------------------+
mysql> select * from user;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | 張三 | zhangsan |
+----+----------+----------+
```
**2. 調用函數**
```sql
select fun_name(params_list);
```
**3. 查看函數**
```sql
(1)查看數據庫 learn_mysql 下有哪些函數
# 建議全部大寫
mysql> SELECT SPECIFIC_NAME FROM INFORMATION_SCHEMA.ROUTINES
-> WHERE ROUTINE_SCHEMA = 'LEARN_MYSQL' AND ROUTINE_TYPE = 'FUNCTION';
+---------------+
| SPECIFIC_NAME |
+---------------+
| fun_user |
+---------------+
(2)查看函數基本信息
mysql> show function status like 'fun_user'; ...
+-------------+----------+----------+----------------+---...
| Db | Name | Type | Definer | Modified ...
+-------------+----------+----------+----------------+---...
| learn_mysql | fun_user | FUNCTION | root@localhost | 20...
+-------------+----------+----------+----------------+---...
(3)查看函數定義信息
mysql> show create function fun_user;
+----------+...--------------------------------------+-...
| Function | ... | Create Function ...
+----------+...--------------------------------------+-...
| fun_user | ... | CREATE DEFINER=`root`@`localhost` FUNCTION `fun_user`(uname varchar(255), pass varchar(255)) RETURNS int
DETERMINISTIC
begin
declare result int default 0;
insert into `user`(`username`, `password`) values(uname, pass);
set result = 1;
return result;
end | ... |
+----------+-------------------------------------------...
```
**4. 刪除函數**
```sql
drop function [if exists] fun_name;
```
**5. 修改函數**
```sql
# 只能修改函數的特征
# 如果要修改參數列表或begin...end,只能刪除重新定義
ALTER FUNCTION process_name
[COMMENT 'string']
[LANGUAGE SQL]
[DETERMINISTIC | NOT DETERMINISTIC]
[CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA]
[SQL SECURITY {DEFINER | INVOKER}]
```
- MySQL
- MySQL是什么
- MySQL環境搭建
- centos7-MySQL8
- windows-MySQL8
- 數據庫軟件
- sqlyog軟件安裝
- navicat軟件安裝
- powerDesigner軟件安裝
- RDBMS術語
- SQL語句組成
- 數據庫系統組成
- 數據庫操作
- 數據表操作
- 查詢語句
- 基本語法
- 子查詢
- 表連接
- 查詢語句執行順序
- 事務
- 事務是什么
- 事務的作用
- 事務的4個特性
- 事務隔離級別
- 事務的實現
- 索引
- 索引的作用
- 索引操作
- 存儲引擎
- 備份與恢復
- 視圖
- 視圖是什么
- 視圖的作用
- 創建視圖
- 查看視圖
- 更改視圖
- DML操作視圖
- 刪除視圖
- 存儲過程與函數
- 過程與函數是什么
- 存儲過程操作
- 定義存儲過程
- 調用存儲過程
- 查看存儲過程
- 刪除存儲過程
- 修改存儲過程
- 函數操作
- 過程與函數區別
- 流程控制
- if語句
- case語句
- while循環語句
- repeat循環語句
- loop循環語句
- 變量
- 處理程序
- 光標
- Redis
- 簡介
- 下載與安裝
- 命令操作redis數據庫
- 通用命令
- 數據操作
- 持久化
- Windows上的持久化操作
- 數據庫設計
- 數據庫設計過程
- ER模型圖
- MongoDB
- MongoDB是什么?
- MongoDB特性
- MongoDB 數據模型
- 安裝MongoDB
- MongoDB認證
- Database操作
- Collection操作
- Document操作
- 插入
- 查詢
- 更新
- 刪除
- buckWrite
- MongoDB索引
- 副本集
- 聚焦分析
- 事務管理
- 寫關注
- 讀關注