6. 組み込み関数とカスタム関数
6.1 組み込み関数
- 文字関数
- 数値演算子と関数
- 比較演算子と関数
- 日時関数
- 情報機能
- 集計関数
- 暗号化機能
6.2 カスタム関数の概要
- カスタム関数の構文形式
CREATE FUNCTION 函数名(参数名 参数类型) # mysql中参数数量不能超过1024个(一般没问题)
RETURNS {
返回值类型}
函数体 #(函数体中如果为复合结构要用BEGIN...END语句;复合结构可以包含声明、循环、流程控制等;)
- パラメーターなしでカスタム関数を作成する
# 创建无参函数
CREATE FUNCTION f1()
RETURNS VARCHAR(40)
DETERMINISTIC # 确定性声明(不然会报错:> 1418-This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in...)
RETURN DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点:%i分:%s秒'); # RETURN表示有返回值
# 函数调用
SELECT f1();
- パラメーターを使用してカスタム関数を作成する
# 创建带参的函数
CREATE FUNCTION f2(num1 INT,num2 INT) # 两个参数
RETURNS FLOAT(10,2) # 返回值类型为float
DETERMINISTIC
RETURN (num1+num2)/3; # 一个返回值
SELECT f2(3,2);
- 複合構造の関数本体を使用してカスタム関数を作成します。
複数のステートメントを実行する場合は、begin で始まり end で終わる必要があります。begin と end の間に複数の実行ステートメントを置きます。戻り値がクエリ ステートメントの場合は、括弧で囲む必要があります。
# 创建带参的函数
delimiter //
CREATE FUNCTION fAddUser2(username11 VARCHAR(20),unit11 VARCHAR(20))
RETURNS INT
DETERMINISTIC
BEGIN
INSERT test_user(username) VALUES (username11);
INSERT test_unit(unit) VALUES (unit11);
RETURN (SELECT COUNT(id) FROM test_unit);# 注意返回值这里要带括号
END
//
delimiter ;
SELECT fAddUser2('马超','蜀汉');
7. ストアド プロシージャ
7.1 ストアド プロシージャの概要
利点:
2 回および複数回呼び出された場合の実行速度が速い (構文解析とコンパイルが不要)、
ネットワーク トラフィックの削減、
データ テーブルとデータベースの作成不可、
パラメーターのないストアド プロシージャのかっこは省略可能、
ストアド プロシージャ内のパラメーターの名前データと組み合わせることはできません テーブルのフィールドは同じ名前です
7.2 パラメータなしでストアド プロシージャを作成する
わずかに
7.3 IN 型パラメータを使用したストアド プロシージャの作成
わずかに
7.4 IN および OUT タイプのパラメータを使用したストアド プロシージャの作成
# 修改结束符号
delimiter //
# 创建存储过程
CREATE PROCEDURE delUserAndReturnUserNums(IN p_id INT, OUT userNums INT)
BEGIN
DELETE FROM test_user WHERE id = p_id;
SELECT count(id) FROM test_user INTO userNums;# 通过into将数值放到变量中
END //
# 将结束符号修改回来
delimiter ;
# 存储过程的调用与返回值的查看
CALL delUserAndReturnUserNums(10,@nums); # 用@来定义变量
SELECT @nums;
7.5 複数の OUT タイプのパラメータを使用したストアド プロシージャの作成
delimiter // # 修改结束符号 ";" 为 "//"
CREATE PROCEDURE removeUserByAgeAndReturnInfos( # 创建名为removeUserByAgeAndReturnInfos的存储过程
IN p_age INT, # IN输入变量,
OUT deleteUsers INT,# OUT输出变量1
OUT userRemain INT# OUT输出变量2
)
BEGIN # 过程体开始
DELETE FROM test_user WHERE age = p_age;# 按照年龄删除用户
SELECT ROW_COUNT() INTO deleteUsers;# 相当于php中mysql_affected_rows指的是被影响的行数,利用INTO放入OUT类型的变量1中
SELECT COUNT(id) FROM test_user INTO userRemain;# 将剩余用户的个数利用into放入OUT类型的变量2中
END # 过程体结束
// # 整个存储过程结束
delimiter ; # 将结束符号修改回来
CALL removeUserByAgeAndReturnInfos(20,@deleteUsers,@userRemain); # 使用CALL调用存储过程,并用@符号定义变量
SELECT @deleteUsers,@userRemain;# 查看变量的值
概要: ストアド プロシージャと関数の違い:
- ストアド プロシージャによって実装される関数はより複雑ですが、関数はよりターゲットが絞られています。
- エラー保存プロセスは複数の値を返すことができますが、関数は 1 つの値しか持てません (または、テーブルまたは JSON 文字列を使用して、複数の値に関する情報を偽装して出力します)。
- ストアド プロシージャは通常、独立して実行されますが、関数は他の SQL ステートメントのコンポーネントとして現れることがあります (使用法は count() などの組み込み関数の使用法と同じです)。