MySQLのクイックチェック
日々の仕事や勉強の中で、mysql のステートメント、キーワード、操作などを忘れることがよくあるため、最近少し時間をとって mysql に関する次の内容を書きました。辞書のようなものです
mysql パスワードのリセット
データ型
演算子共通関数データの整合性データベースの基本操作 テーブル
自体の操作 テーブル内のデータの操作サブクエリマルチテーブル接続インデックスビューSQL ステートメントの前処理この記事はMySQL でプログラミングしています。
カスタム関数とストアド プロシージャ
関数とストアド プロシージャの公式説明:
CREATE PROCEDURE ステートメントと CREATE FUNCTION ステートメント
カスタム機能
MySQL 関数の概念は、C などのプログラミング言語の概念に似ています。
カスタム関数の作成
create function func_name([[in | out | inout]func_parameter type[, ...]])
returns return_type
[characteristic...]
begin
# 函数体;
return [return_values];
end;
# func_name 函数名
# [in | out | inout] in表示输入参数,out表示输出参数,inout表示输入输出参数
# func_parameter 参数名
# type 参数类型
# return_type 函数返回值类型
# characteristic 指定函数的特征参数,可选值:
language sql
# 默认选项,用于说明函数体使用SQL语言编写
| [not] deterministic
# detrministic(确定性),当函数返回值不确定时,该选项是为了防止“复制”时的不一致。如果
# 函数总是对同样的输入参数产生同样的结果,则被认为是“确定的”,否则认为是“不确定的”。
# 不指定默认是“not deterministic”
| {
contains sql | no sql | reads sql data | modifies sql data}
# 指明子程序使用SQL语句的限制。
# contains sql 表示函数体中不包含读或写数据的语句,如set
# no sql 表示函数体中不包含SQL语句
# reads sql data 表示函数体中包含select查询语句,但不包含更新语句
# modifies sql data 表示函数体包含更新语句
# 不指明默认时contains sql
| sql security {
definer | invoker}
# 设置执行权限。用于指定函数的执行许可
# definer表示该函数只能由创建者调用
# invoker 表示该函数可以被其他数据库用户调用
# 默认是definer
| comment 'string'
# 注释,引号内就是要添加的注释内容
例:
# 创建一个做减法的函数
delimiter //
create function sub(arg1 int, arg2 int)
returns int
DETERMINISTIC
begin
return arg1 - arg2;
end //
delimiter ;
# 调用自定义函数与调用MySQL中的系统函数的方法一样
select sub(3, 1);
+-----------+
| sub(3, 1) |
+-----------+
| 2 |
+-----------+
1 row in set (0.00 sec)
デリミタ
MySQL は区切り文字を使用してコマンドの終了マーカーを変更します。デフォルトの終了タグは「;」です。
なぜ終了タグを変更するのでしょうか?
上記の例のように、関数やストアドプロシージャには「;」がたくさんあるため、サブ関数内の「return arg1 - arg2;」文に「;」がある場合、ターミネータを変更しないと、サブ関数の場合、このステートメントを記述するときに Enter キーと改行キーを押します。「;」がデフォルトの終了マークであるため、MySQL はこの時点でそれを実行しようとします。関数の記述が完了していないため、次の時点でエラーが報告されます。したがって、関数を作成するとき、またはプロシージャを保存するときは、最初に終了文字を別の文字に変更し、作成後に元に戻す必要があります。
関数定義の表示
show function status; # 查看全部函数
show function status like 模式; # 模糊查询
show create function 函数名; # 精确查看
show function status; # 查出的内容太多,不方便
+-------+----------------------------------+----------+---------------------+---------------------+---------------------+---------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
| Db | Name | Type | Definer | Modified | Created | Security_type | Comment | character_set_client | collation_connection | Database Collation |
+-------+----------------------------------+----------+---------------------+---------------------+---------------------+---------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
| sys | extract_schema_from_file_name | FUNCTION | mysql.sys@localhost | 2021-07-27 13:37:12 | 2021-07-27 13:37:12 | INVOKER |
Description
-----------
...太多了
############################################################
show function status like 'su%'; # 模糊查询
+-------+------+----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| Db | Name | Type | Definer | Modified | Created | Security_type | Comment | character_set_client | collation_connection | Database Collation |
+-------+------+----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| testt | sub | FUNCTION | root@localhost | 2021-10-21 17:24:39 | 2021-10-21 17:24:39 | DEFINER | | utf8mb4 | utf8mb4_0900_ai_ci | utf8mb4_0900_ai_ci |
+-------+------+----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
1 row in set (0.01 sec)
################################################
show create function sub;
+----------+-----------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
| Function | sql_mode | Create Function | character_set_client | collation_connection | Database Collation |
+----------+-----------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
| sub | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION | CREATE DEFINER=`root`@`localhost` FUNCTION `sub`(arg1 int, arg2 int) RETURNS int
DETERMINISTIC
begin
return arg1 - arg2;
end | utf8mb4 | utf8mb4_0900_ai_ci | utf8mb4_0900_ai_ci |
+----------+-----------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
1 row in set (0.00 sec)
関数情報は、information_schemaデータベースのルーチンテーブルに保存されます。
select * from information_schema.routines where routine_name = 'sub';
+---------------+-----------------+----------------+--------------+--------------+-----------+--------------------------+------------------------+-------------------+---------------+--------------------+--------------------+----------------+----------------+--------------+-------------------------------+---------------+-------------------+-----------------+------------------+-----------------+----------+---------------+---------------------+---------------------+-----------------------------------------------------------------------------------------------------------------------+-----------------+----------------+----------------------+----------------------+--------------------+
| SPECIFIC_NAME | ROUTINE_CATALOG | ROUTINE_SCHEMA | ROUTINE_NAME | ROUTINE_TYPE | DATA_TYPE | CHARACTER_MAXIMUM_LENGTH | CHARACTER_OCTET_LENGTH | NUMERIC_PRECISION | NUMERIC_SCALE | DATETIME_PRECISION | CHARACTER_SET_NAME | COLLATION_NAME | DTD_IDENTIFIER | ROUTINE_BODY | ROUTINE_DEFINITION | EXTERNAL_NAME | EXTERNAL_LANGUAGE | PARAMETER_STYLE | IS_DETERMINISTIC | SQL_DATA_ACCESS | SQL_PATH | SECURITY_TYPE | CREATED | LAST_ALTERED | SQL_MODE | ROUTINE_COMMENT | DEFINER | CHARACTER_SET_CLIENT | COLLATION_CONNECTION | DATABASE_COLLATION |
+---------------+-----------------+----------------+--------------+--------------+-----------+--------------------------+------------------------+-------------------+---------------+--------------------+--------------------+----------------+----------------+--------------+-------------------------------+---------------+-------------------+-----------------+------------------+-----------------+----------+---------------+---------------------+---------------------+-----------------------------------------------------------------------------------------------------------------------+-----------------+----------------+----------------------+----------------------+--------------------+
| sub | def | testt | sub | FUNCTION | int | NULL | NULL | 10 | 0 | NULL | NULL | NULL | int | SQL | begin
return arg1 - arg2;
end | NULL | SQL | SQL | YES | CONTAINS SQL | NULL | DEFINER | 2021-10-21 17:24:39 | 2021-10-21 17:24:39 | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION | | root@localhost | utf8mb4 | utf8mb4_0900_ai_ci | utf8mb4_0900_ai_ci |
+---------------+-----------------+----------------+--------------+--------------+-----------+--------------------------+------------------------+-------------------+---------------+--------------------+--------------------+----------------+----------------+--------------+-------------------------------+---------------+-------------------+-----------------+------------------+-----------------+----------+---------------+---------------------+---------------------+-----------------------------------------------------------------------------------------------------------------------+-----------------+----------------+----------------------+----------------------+--------------------+
1 row in set (0.00 sec)
カスタム関数の削除
drop function func_name;
カスタム関数を変更する
alter function func_name[characteristic ...];
characteristic: {
COMMENT 'string'
| LANGUAGE SQL
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
}
# 解释在“创建自定义函数”
ストアドプロシージャ
ストアド プロシージャは、複雑なプログラムをデータベースに保存し、外部プログラムから呼び出せるようにするデータベース オブジェクトです。ストアド プロシージャは、特定の機能を完了するための SQL ステートメントのセットです。ストアド プロシージャはコンパイルされ、作成され、データベースに保存されます。ユーザーは、ストアド プロシージャの名前を指定し、パラメータ (必要に応じて) を指定することで、ストアド プロシージャを呼び出して実行できます。
- アドバンテージ
- ストアド プロシージャは、複雑なビジネス ロジックをカプセル化して非表示にすることができます。
- ストアド プロシージャは値を返し、パラメータを受け入れることができます。
- ストアド プロシージャは、ルックアップ テーブル、データ テーブル、またはユーザー定義関数とは異なり、サブルーチンであるため、SELECT 命令を使用して実行できません。
- ストアド プロシージャは、データ検証、ビジネス ロジックの適用などに使用できます。
- 欠点がある
- サポートされているプログラミング言語が異なるため、ストアド プロシージャは特定のデータベース用にカスタマイズされることがよくあります。他のメーカーのデータベース システムに切り替える場合は、元のストアド プロシージャを書き直す必要があります。
- パフォーマンスのチューニングとストアド プロシージャの作成は、さまざまなデータベース システムによって制限されます。
——ルーキーチュートリアル
ストアド プロシージャを作成する
CREATE
[DEFINER = user]
PROCEDURE proc_name ([proc_parameter[,...]])
[characteristic ...] routine_body
proc_parameter:
[ IN | OUT | INOUT ] param_name type
characteristic: { # 同“创建自定义函数”
COMMENT 'string'
| LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
}
routine_body:
存储过程体,这部分以begin开始,end结束。当只有一个SQL语句时可省略begin...end
ストアド プロシージャを呼び出す
CALL proc_name([parameter[,...]])
CALL proc_name[()]
例:
# 存在表
desc people;
+-------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | char(10) | NO | | NULL | |
| age | int | NO | | NULL | |
| sex | enum('f','m') | YES | | NULL | |
| sar | float | YES | | NULL | |
+-------+---------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
# 创建一个通过id获取people的存储过程
delimiter //
create procedure get_people_by_id(in p_id int)
reads sql data
begin
select * from people where id = p_id;
end //
delimiter ;
# 使用存储过程
call get_people_by_id(3);
+----+--------+-----+------+--------+
| id | name | age | sex | sar |
+----+--------+-----+------+--------+
| 3 | 嘎子 | 18 | m | 5400.4 |
+----+--------+-----+------+--------+
1 row in set (0.00 sec)
ストアドプロシージャを削除する
DROP PROCEDURE [IF EXISTS] proc_name;
ストアド プロシージャを変更する
ALTER PROCEDURE proc_name [characteristic ...]
characteristic: { # 含义同“创建自定义函数”小节所讲
COMMENT 'string'
| LANGUAGE SQL
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
}
関数 VS ストアド プロシージャ
- 類似性
- どちらも再利用可能で、開発者の作業負荷を軽減できます。
- どちらもデータのセキュリティ アクセス制御を強化し、特定のデータベース ユーザーのみに特定の関数またはストアド プロシージャの実行権限を設定できます。
- 違い
- 関数は戻り値を 1 つだけ持つ必要があり、戻り値は文字列または数値データ型として指定する必要があります。ストアド プロシージャは戻り値を 1 つだけ持つことも、戻り値を持たないことも、複数の戻り値を持つこともできるため、戻り値は out を使用する必要があります。または inout パラメータ定義
- 関数本体では、select...into ステートメントを使用して変数に値を割り当てることができますが、select を使用して結果セットを返すことはできません。ストアド プロシージャにはこの点に関する制限はありません
- 関数は SQL ステートメントまたは MySQL 式に直接埋め込むことができます。ストアド プロシージャは通常、個別に呼び出す必要があり、呼び出すときにキーワード call が必要です。
- 関数内の関数本体には多くの制限があります。たとえば、明示的または暗黙的にトランザクションを開始、開始、または終了するステートメントは関数本体内で使用できません。前処理された SQL ステートメントは使用できません。ストアド プロシージャに対する制限は比較的少ないです。 、基本的にすべての SQL ステートメントまたは MySQL コマンドをストアド プロシージャで使用できます。
エラー ERROR 1418 (HY000)
カスタム関数またはストアド プロシージャを作成し、このエラーが報告された場合は、エラー メッセージに従って変更してください。
- DETERMINISTIC、NO SQL、または READS SQL DATA を関数に追加します
- 変数 log_bin_trust_function_creators = 1 を設定します。
ここでは方法 1 を使用しています。
ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)