MySQLの基礎(03):システムおよびカスタム関数は、トリガーが詳細なことをまとめます

この記事の出所:GitHubにはこちらをクリック・ || GitEEは・こちらをクリック

まず、システム機能パッケージ

MySQLは持っている多くの組み込み関数は、迅速いくつかを開発するビジネスニーズを解決することができ、おそらく、プロセス制御機能、数値関数、文字列関数、日付と時刻関数、集約関数などを含みます。関数は、一般的にこれらの分類に使用される以下のリスト。

図1に示すように、制御フロー関数

  • ケース...とき

戻り値は、決意アナログIF-ELSEプログラミングの値。

-- DEMO 01
SELECT CASE DATE_FORMAT(NOW(),'%Y-%m-%d') 
    WHEN '2019-12-29' THEN 'today' 
    WHEN '2019-12-28' THEN 'yesterday' 
    WHEN '2019-12-30' THEN 'tommor' 
    ELSE 'Unknow' END;
-- DEMO 02
SELECT (CASE WHEN 1>0 THEN 'true' ELSE 'false' END) AS result;
  • もし(expr1と、expr2に、expr3は)

式expr1がTRUEである場合、IF()はexpr2の値を返し、そうでない場合、戻り値はexpr3がありました。

SELECT IF(1>2,'1>2','1<2') AS result ; 
SELECT IF(1<2,'yes ','no') AS result ;
SELECT IF(STRCMP('test','test'),'no','yes');
  • IFNULL(expr1と、expr2に)

式expr1がNULL、expr1との戻り値でない場合は、そうでない場合はexpr2の値を返します。

SELECT IFNULL(NULL,'cicada');
SELECT IFNULL(1/1,'no');

2、一般的な文字列関数

  • CHAR_LENGTH()

文字列の長さの値を返します。

SELECT CHAR_LENGTH(' c i c ') ;-- 包含空格
SELECT LENGTH(' S q l ') ;
  • CONCAT(STR1 ...)

モザイク直列ストリング。

SELECT CONCAT('My', 'S', 'ql');
SELECT CONCAT('My', NULL, 'QL'); -- 包含Null 则返回Null
SELECT CONCAT("%", "Java", "%"); -- mybatis中拼接模糊查询
  • ELT(N、STR1、STR2、...)

N = 1の場合はN = 2で、値はSTR2を返された場合、値は、STR1に戻され、そしてように、ページを返すように状態を変換するために使用することができます。

SELECT ELT(1,'提交','审核中','规则通过') ;
SELECT ELT(2,'提交','审核中','规则通过') ;
  • FORMAT(X、D)

数値型のフォーマット。

SELECT FORMAT(3.1455,2) ; -- 四舍五入保留两位
SELECT TRUNCATE(3.1455,2) ; -- 直接截取两位
  • TRIM(文字列)

空の文字列スペース。

SELECT LTRIM('  hel l o ') ;-- 清空左边
SELECT RTRIM('  hel l o ') ;-- 清空右边
SELECT TRIM('  hel l o ') ; -- 清空两边
SELECT REPLACE('M y S Q L',' ','') ; -- 替换掉全部空格

図3に示すように、数値関数

  • FLOOR(X)

戻り値Xよりも大きくない最大の整数値を、。

SELECT FLOOR(1.23); -- 1
SELECT FLOOR(-1.23); -- -2
  • MOD(N、M)

モード動作。戻るM Nを添加した後、残ります。

SELECT MOD(29,9); -- 2
SELECT 29 MOD 9; -- 2
  • RAND()RAND(N)

0と1の間の範囲内のランダムな浮動小数点値を返します。あなたは整数パラメータNを指定した場合、それは繰り返しシーケンスを生成するためのシード値として使用されます。

SELECT RAND(); -- 0.923
SELECT RAND(20) = RAND(20) ; -- TRUE

4、日付と時刻関数

  • ADDDATE(日付、INTERVAL exprの型)

指定日に行われた操作の種類を指定します。

SELECT DATE_ADD('2019-12-29', INTERVAL 3 DAY); -- 2020-01-01
  • CURDATE()

従属文字列または数値の文脈で使用される機能に応じて値によって現在の日付「YYYY-MM-DD」または戻り形式YYYYMMDDフォーマット、。

SELECT CURDATE(); -- '2019-12-29' 字符串
SELECT CURDATE() + 0; -- 20180725 数字
  • DATE(expr)は

日付や日時の式exprの日付部分を抽出します。

SELECT DATE('2019-12-31 01:02:03'); -- '2019-12-31'
SELECT DATE('2019-12-31 01:02:03')+0; -- 20191231
  • DATE_FORMAT(日付、形式)

日付値は書式文字列に従ってフォーマット。

SELECT DATE_FORMAT(NOW(), '%Y-%m-%d'); -- 2019-12-29
SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日'); -- 2019年12月29日

図5に示すように、集約関数

AVG([distinct] expr)  求平均值
COUNT({*|[distinct] } expr)  统计行的数量
MAX([distinct] expr)  求最大值
MIN([distinct] expr)  求最小值
SUM([distinct] expr)  求累加和

第二に、カスタム関数

1、概念の紹介

関数の店舗SQL文のシリーズは、これらのステートメントは、関数を呼び出した後に実行されます。だから、この関数は、繰り返し文を減らすことができます。フォーカス関数の戻り値、およびトリガーは、実装プロセスに焦点を当て、いくつかのステートメントを実行することはできません。だから、関数のセットは、単純なSQL文ではありません。

2、使用

create function 函数名([参数列表]) returns 数据类型
begin
 sql语句;
 return 值;
end;

フォーマットパラメータリストは次のとおりです。変数名データ型。

  • いいえ、参照ケースません
CREATE FUNCTION mysum1 () RETURNS INT RETURN (2+3)*2;
SELECT mysum1 () ;
  • 関数のパラメータがあります。

表结构

CREATE TABLE t01_user (
    id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY  COMMENT '主键ID',
  user_name varchar(20) DEFAULT NULL COMMENT '用户名称'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '用户表';

函数用法

create function get_name(p_id INT) returns VARCHAR(20)
begin 
    declare userName varchar(20);
    select user_name from t01_user where id=p_id into userName;
    return userName;
end;

SELECT get_name(1) ;

3、機能ビュー

show create function get_name ;

4、削除機能

drop function get_name ;

5、機能ノート

MySQLは、マルチスレッド環境なので、必ず関数はスレッドセーフであることを確認してください。機能は、それは、MySQL Cluster環境をコンパイルするために同期させる必要がある、サーバー環境でコールするためには、事前にコンパイルされます。

第三に、フリップフロップ

1、トリガの概要

トリガーは、呼び出しに使用CALLへのストアドプロシージャことを除いて、特別なストアドプロシージャですが、トリガーは、CALLを使用する必要はありません。手動でする必要ませ限り、事前に定義されたイベントが発生した場合、それは自動的にトリガ呼び出しのMYSQLになるように、起動しません。

2、トリガーを作成

触发器语法

CREATE TRIGGER trigger_name trigger_time trigger_event 
ON tbl_name FOR EACH ROW trigger_stmt
  • TRIGGER_NAME:名前トリガー;
  • trigger_time:トリガー時間アクション。
  • ます。trigger_event:トリガーを起動させる文のタイプ。
  • tbl_name内:トリガー・アクションは、非一時テーブルを示唆しています。
  • trigger_stmt:プログラムの実行の文をトリガします。

表数据同步

ときにユーザテーブルt01_userデータをに同時に書き込まれt02_back、テーブルに書き込まれたデータのコピー。

-- 用户备份表
CREATE TABLE t02_back (
    id int(11) NOT NULL PRIMARY KEY COMMENT '主键ID',
  user_name varchar(20) DEFAULT NULL COMMENT '用户名称'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '用户备份';

-- 触发器程序
DROP TRIGGER IF EXISTS user_back_trigger ;
CREATE TRIGGER user_back_trigger AFTER INSERT ON t01_user FOR EACH ROW
BEGIN
    INSERT INTO t02_back (id,user_name)
VALUES (new.id,new.user_name);
END ;

-- 测试案例
INSERT INTO t01_user (user_name) VALUES ('smile'),('mysql') ;
SELECT * FROM t02_back ;

トリガーを確認してください3。

ビュー・トリガーはすでにトリガ、状態、文法情報の定義に存在するデータベースです。あなたは、トリガートリガーテーブルの情報を表示することができます。

SELECT * FROM `information_schema`.`TRIGGERS` 
WHERE `TRIGGER_NAME`='user_back_trigger';

4、トリガーを削除

DROP TRIGGER文は、すでに定義されたトリガMYSQLを削除トリガーの基本的な構文を削除することができます。

DROP TRIGGER [schema_name.]trigger_name

5、フリップフロップの注意事項

  • トリガ・イベント

同じテーブルについて、同じイベントが唯一のINSERTトリガーAFTER t01_user 2つのテーブルを作成するなど、トリガーを作成することができ、それはエラーになります。

  • 効率

トリガーは、アプリケーション側が減少し、通信し、データベースのビジネスロジックの数が、データセットが非常に大きい場合、論理ライントリガに基づいて、効率が低下することができます。

  • 総務問題

トリガ文の実装と実行するかどうか、同じトランザクション内のオリジナルのテーブル、トリガテーブルのストレージエンジンがトランザクションをサポートするかどうかに応じて。

第四に、送信元アドレス

GitHub·地址
https://github.com/cicadasmile/mysql-data-base
GitEE·地址
https://gitee.com/cicadasmile/mysql-data-base

おすすめ

転載: www.cnblogs.com/cicada-smile/p/12122604.html