MySQL:視圖,觸發器,存儲過程詳解

一、視圖

視圖是查詢命令結果構成的一個虛擬表(非真實存在),其本質是【根據SQL語句獲取動態的數據集,併為其命名】,用戶使用時只需使用【名稱】即可獲取結果集合,並可以當作表來查詢使用。

1、創建視圖

--格式:CREATE VIEW 視圖名稱 AS SQL語句
CREATE VIEW v1 AS
SELET nid,
name
FROM
A
WHERE
nid > 4

2、刪除視圖

--格式:DROP VIEW 視圖名稱
DROP VIEW v1

3、修改視圖

-- 格式:ALTER VIEW 視圖名稱 AS SQL語句
ALTER VIEW v1 AS
SELET A.nid,
B. NAME
FROM
A
LEFT JOIN B ON A.id = B.nid
LEFT JOIN C ON A.id = C.nid
WHERE
A.id > 2

AND C.nid < 5

4、使用視圖

視圖的使用和普通表一樣,由於視圖是虛擬表,所以無法對其真實表進行創建、更新和刪除操作,僅做查詢用。

select * from v1

二、觸發器

對某個表進行【增/刪/改】操作的前後觸發一些操作即為觸發器,如果希望觸發增刪改的行為之前或之後做操作時,可以使用觸發器,觸發器用於自定義用戶對錶的行進行【增/刪/改】前後的行為。

1、基本語法

# 插入前
CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW
BEGIN
...
END
# 插入後
CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON tb1 FOR EACH ROW
BEGIN
...
END
# 刪除前
CREATE TRIGGER tri_before_delete_tb1 BEFORE DELETE ON tb1 FOR EACH ROW
BEGIN

...
END
# 刪除後
CREATE TRIGGER tri_after_delete_tb1 AFTER DELETE ON tb1 FOR EACH ROW
BEGIN
...
END
# 更新前
CREATE TRIGGER tri_before_update_tb1 BEFORE UPDATE ON tb1 FOR EACH ROW
BEGIN
...
END
# 更新後
CREATE TRIGGER tri_after_update_tb1 AFTER UPDATE ON tb1 FOR EACH ROW
BEGIN
...
END

2、創建觸發器

創建觸發器基本語法是以下code:

但有一點要注意,觸發器內關鍵字NEW表示即將插入的數據行,OLD表示即將刪除的數據行。

# 插入前觸發器
delimiter //
CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW
BEGIN
IF NEW. NAME == 'nick' THEN
INSERT INTO tb2 (NAME)
VALUES
('aa')
END
END//
delimiter ;
# 插入後觸發器
delimiter //
CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON tb1 FOR EACH ROW
BEGIN
IF NEW. num = 666 THEN

INSERT INTO tb2 (NAME)
VALUES
('666'),
('666') ;
ELSEIF NEW. num = 555 THEN
INSERT INTO tb2 (NAME)
VALUES
('555'),
('555') ;
END IF;
END//
delimiter ;

3、刪除觸發器

DROP TRIGGER tri_after_insert_tb1;

4、使用觸發器

觸發器是由於對錶的增、刪、改操作時被動執行的

insert into tb1(num) values(666)

三、存儲過程

存儲過程是一個SQL語句集合,類似函數,需要主動調用。

1、創建存儲過程

# 無參數存儲過程
# 創建存儲過程

delimiter //
create procedure p1()
BEGIN
select * from t1;
END//
delimiter ;
# 執行存儲過程
call p1()

都說了類似函數,那必須得可以接收參數,且參數有三類:

  • in 僅用於傳入參數用
  • out 僅用於返回值用
  • inout 既可以傳入又可以當作返回值
# 有參數存儲過程
# 創建存儲過程
delimiter \\ # 結尾分號改為\\
create procedure p1(
in i1 int,
in i2 int,
inout i3 int,
out r1 int
)
BEGIN
DECLARE temp1 int; # 創建申明局部變量
DECLARE temp2 int default 0;
set temp1 = 1;
set r1 = i1 + i2 + temp1 + temp2;
set i3 = i3 + 100;
end\\
delimiter ;
# 執行存儲過程
DECLARE @t1 INT default 3;
DECLARE @t2 INT;
CALL p1 (1, 2 ,@t1, @t2);

SELECT @t1,@t2;

2、刪除存儲過程

drop procedure proc_name;

3、執行存儲過程

執行為函數名加括號;

DECLARE代表創建一個局部變量

# 無參數
call proc_name()
# 有參數,全in
call proc_name(1,2)
# 有參數,有in,out,inout
DECLARE @t1 INT;
DECLARE @t2 INT default 3;
call proc_name(1,2,@t1,@t2)

代碼實例:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 執行存儲過程
cursor.callproc('p1', args=(1, 22, 3, 4))
# 獲取執行完存儲的參數
cursor.execute("select @_p1_0,@_p1_1,@_p1_2,@_p1_3")
result = cursor.fetchall()
conn.commit()
cursor.close()
conn.close()

print(result)


分享到:


相關文章: