ビュー、ストアド プロシージャ、関数、トリガー

MySQL アドバンスト

ビュー

ビューはデータベースに保存され、再利用できます。データはビューには保存されません。

ビューの定義

CREATE VIEW 视图名 AS SELECT 列 1,列 2... FROM 表(查询语句);
ビューを使用する
SELECT * FROM 视图名

ビューの削除
drop view 视图名

CREATE VIEW sel_news AS
SELECT
  n.id,
  n.title,
  t.type_name
FROM
  news n
  LEFT JOIN TYPE t
    ON n.typeid = t.typeid;

-- 使用视图
 SELECT
  *
FROM
  sel_news;

-- 删除视图 
 DROP VIEW sel_news

ストアドプロシージャ

データベースの知識:テールユニットへのデータの格納、SQL言語の使用、データの操作ができる

Java言語をデータベース内で使用して論理処理機能を持たせることもできます。

あらかじめ作成してデータベースに格納しており、利用時に直接呼び出すことができる
メリット:あるロジックの処理過程をデータベースに直接格納しているため、動作が高速になる

短所: データベースへの依存度が高く、移植性が低い

MySQL ストアド プロシージャの定義

> 
>创建存储过程的语法格式
> 
> create procedure 存储过程名([in 变量名 类型,out 参数 2,…]>			 begin
> 
>	 [declare 变量名 类型 [DEFAULT];]
> 
>  存储过程语句块; 
> 
> 
> end;

文法解析:
1. ストアド プロシージャのパラメータは、in、out、inout の 3 つのタイプに分類されます。

2.in は入力パラメータ (デフォルトでは in パラメータ) を表し、パラメータの値が呼び出し側プログラムによって指定される必要があることを示します。

3.out は出力パラメーターを表します。これは、パラメーターの値がストアド プロシージャによって計算された後、out パラメーターの計算結果が呼び出し側プログラムに返されることを意味します。

4. inout は入力パラメータと出力パラメータの両方を表します。つまり、パラメータの値は呼び出し側プログラムによって指定でき、inout パラメータの計算結果は呼び出し側プログラムに返すことができます。

5. ストアド プロシージャ内のステートメントは、begin と end の間に含める必要があります。

6.Declare は変数を宣言するために使用されます。変数にデフォルト値を割り当てるには、default を使用します。ステートメント ブロック内で変数の値を変更するには、set variable=value; を使用します。

例えば:

-- ------------------------------------存储过程--------------------------------------------------------------

DELIMITER $$
-- 创建存储过程
CREATE
    PROCEDURE demo1()
   
   -- 存储过程体
	BEGIN
	-- declare 用来声明变量
	DECLARE v_name VARCHAR(10) DEFAULT '';
	SET v_name = 'jim';
	SELECT v_name; -- 测试输出语句
	END$$
DELIMITER ;

-- 调用存储过程
CALL demo1();



-- 查询新闻类型为1的有几条 演示入参和出参
 DELIMITER $$

CREATE PROCEDURE type_count (IN p_typeid INT, OUT p_count INT) -- 存储过程体
 BEGIN
  SELECT
    COUNT (*) INTO p_count
  FROM
    news
  WHERE typeid = p_typeid;
  SELECT
    p_count;
END $$
DELIMITER;
-- 在一个存储过程中调用另一个存储过程
 CALL type_count (1, @p_count) 
 
 



-- 存储过程中逻辑判断 if  else
DELIMITER $$

CREATE PROCEDURE demo2 (IN p_day INT, OUT p_name VARCHAR (10))
BEGIN
  IF p_day = 0
  THEN SET p_name = "星期天";
  SELECT
    p_name;
  ELSEIF p_day = 1
  THEN
  SET p_name="星期一";
     SELECT p_name; 
  ELSE SET p_name= "无效日期";
  SELECT p_name;
  END IF;
END $$
DELIMITER;

CALL demo2 (0,@p_name);

-- 使用存储过程插入信息
DELIMITER $$
CREATE PROCEDURE save_admin (
  IN p_account VARCHAR (10),
  IN p_password VARCHAR (50),
  OUT p_result VARCHAR (10)
)BEGIN
  DECLARE v_count INT DEFAULT 0;
  SELECT COUNT(*) INTO v_count FROM admin WHERE account = p_account;
  IF v_count=0 THEN
  INSERT INTO admin (account,PASSWORD)VALUES(p_account,p_password);
  SET p_result = '保存成功';
  ELSE
  SET p_result = '账号已存在';
  SELECT p_result;
  END IF;
END $$
-- 测试CALL 
CALL save_admin ('001','123',@p_result)




DELIMITER $$
CREATE PROCEDURE saveUser (
  IN p_account VARCHAR (20),
  IN p_sex CHAR (1),
  OUT res_mark INT)
BEGIN
  DECLARE v_count INT DEFAULT 0;
  
  SELECT COUNT(*) INTO v_count
  FROM
    admin
  WHERE account = p_account;
  IF v_count =0
  THEN
  INSERT INTO admin (account,sex)
  VALUES
    (p_account,p_sex);
  SET res_mark = 0;
  ELSE SET res_mark = 1;
  END IF;  
END $$

-- 测试CALL 
CALL save_admin ('001','123',@res_mark)


関数

関数はストアド プロシージャに似ていますが、関数は主にクエリに使用されます。


create function 函数名([参数列表]) returns 数据类型
begin  DECLARE 变量;

sql 语句;
return;
end;

知らせ:

1. パラメータ リストには、パラメータ名とパラメータ タイプの 2 つの部分が含まれます。
2. 関数本体: return ステートメントが必要です。そうでない場合は、エラーが報告されます
。 3. 関数本体には 1 つの文しかないため、省略できます。 begin end
4. delimter ステートメントを使用して終了マークを設定します。 設定関数にはパラメーターを含めることはできません。 SET GLOBAL log_bin_trust_function_creators=TRUE;

削除機能

DROP FUNCTION 関数名
例:

-- ------------------------------------------函数--------------------------------------------------------

-- 函数  不带参数的
DELIMITER $$

CREATE FUNCTION test() RETURNS INT 
BEGIN DECLARE v_num INT DEFAULT 0;
SELECT
  COUNT(*) INTO v_num
FROM
  admin;
RETURN v_num;
END $$
DELIMITER
-- 测试
SELECT test ();




-- 带参数的
DELIMITER $$

CREATE
    FUNCTION findType(p_type INT) RETURNS VARCHAR(10)
    BEGIN
DECLARE v_type VARCHAR(10) DEFAULT '';
IF p_type = 0 THEN
SET v_type = '超级管理员';
ELSE 
SET v_type = '管理员';
END IF;
RETURN v_type;
    END$$
    

SELECT account,id,findType(TYPE) FROM admin



DELIMITER $$

CREATE
    FUNCTION find_news_type(p_typeid INT) RETURNS VARCHAR(10)
    BEGIN
DECLARE v_type VARCHAR(10) DEFAULT '';
SELECT type_name INTO v_type FROM TYPE WHERE typeid = p_typeid;
RETURN v_type;
    END$$ 

SELECT id,title,find_news_type(typeid) FROM news

引き金

ストアド プロシージャ、関数に似ており、テーブルに関連しており、イベントに少し似ています

テーブルの追加、変更、削除の前後に自動的にトリガーされます。

トリガーには次の特性があります。

1. テーブルとの関連付け

トリガーは、トリガー テーブルと呼ばれる特定のテーブルに定義されます。

2. トリガーを自動的にアクティブにする

テーブル内のデータに対して INSERT、UPDATE、または DELETE 操作を実行するときに、

トリガーは特定のアクションに対して定義され、自動的に実行され、元に戻すことはできません。

3. 直接呼び出すことはできません

ストアド プロシージャとは異なり、トリガーは直接呼び出すことも、パラメーターを渡したり受け取ったりすることもできません。

4. トランザクションの一部として

トリガーとトリガーを起動するステートメントは単一のトランザクションとして扱われ、トリガーから取得できます。

どこでもロールバック。
トリガーを定義するための構文規則:

 CREATE TRIGGER 触发器名称 触发时机 触发事件 
 
ON 表名称 

FOR EACH ROW -- 行级触发

 BEGIN
 
语句 

END;

構文分析:

1. トリガー名: トリガーを識別するために使用され、ユーザーによってカスタマイズされます。

2. トリガータイミング: その値は前後です。

3. トリガーイベント: その値は挿入、更新、削除です

4. テーブル名: トリガーを作成するテーブル名、つまりトリガーが作成されるテーブルを識別します。

5. ステートメント: トリガー プログラム本体です。トリガー プログラムは、開始と終了として begin と end を使用でき、途中に複数のステートメントが含まれます

-- 触发器
-- 在admin表中插入一条数据后自动更新admin_log表
DELIMITER $$

CREATE
    
    TRIGGER save_adminLog AFTER 
    INSERT
    ON admin
    FOR EACH ROW BEGIN
	INSERT INTO admin_log(id,account,oper_time) VALUES(new.id,new.account,NOW());
    END$$

DELIMITER ;

INSERT INTO admin(account,PASSWORD)VALUES('s001','1231');



-- 当admin表和role表的主键分别都是admin_role表的外键约束时,
-- 想要删除admin表或role表中的数据,必须先删除admin_role表中的关联关系
DELIMITER $$

CREATE
    TRIGGER delete_admin_role
     BEFORE
     DELETE
    ON admin
    FOR EACH ROW BEGIN
	DELETE FROM admin_role WHERE adminid= old.id;
    END$$

DELIMITER ;
DELETE FROM admin WHERE id=3

おすすめ

転載: blog.csdn.net/crraxx/article/details/122591250