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