標籤:style 虛擬 weight 127.0.0.1 for 聲明變數 動態 out .exe
視圖
視圖是虛擬表,使用者只有在使用視圖時,才會根據sql語句去擷取資料集。
視圖可以直接當做資料表來使用,但不是真正意義的表。
視圖只能在查詢時用,無法對真實的表進行增刪改操作。
1.建立視圖
格式:
CREATE VIEW 視圖名稱 AS SQL語句
2.修改視圖
格式:
ALTER VIEW 視圖名稱 AS SQL語句
3.刪除視圖
格式:
DROP VIEW 視圖名稱
4.使用視圖
SELECT * FROM 視圖名稱
預存程序
預存程序相當於程式語言中的函數,可以傳入參數,也可以有傳回值。當使用者主動調用預存程序時,預存程序中定義的sql語句將按照邏輯執行。
1.建立預存程序
預存程序可接收的參數有三類:
in:用於傳入參數
out:用於傳回值
inout:既可以傳入參數又可以傳回值
無參數預存程序:
1 -- 建立預存程序 2 3 delimiter // # delimiter用於修改SQL語句預設終止符 4 create procedure p1() 5 BEGIN 6 select * from t1; 7 END// 8 delimiter ; # 將SQL語句終止符改回預設 9 10 11 12 -- 執行預存程序13 14 call p1() # 調用預存程序
帶參數預存程序:
1 -- 建立預存程序 2 delimiter \ 3 create procedure p1( 4 in i1 int, # i1,i2用於接收傳入的參數 5 in i2 int, 6 inout i3 int, 7 out r1 int # r1傳入任何值,預設都為null 8 ) 9 BEGIN10 DECLARE temp1 int; # declare聲明變數類型11 DECLARE temp2 int default 0; # 聲明變數類型,並賦予預設值12 13 set temp1 = 1;14 15 set r1 = i1 + i2 + temp1 + temp2;16 17 set i3 = i3 + 100;18 19 end\20 delimiter ;21 22 -- 執行預存程序23 set @t1 =4;24 set @t2 = 0;25 CALL p1 (1, 2 ,@t1, @t2); 26 SELECT @t1,@t2;
2.刪除預存程序
DROP PROCEDURE 預存程序名稱
3.執行預存程序
1 -- 無參數 2 call proc_name() 3 4 -- 有參數,全in 5 call proc_name(1,2) 6 7 -- 有參數,有in,out,inout 8 set @t1=0; 9 set @t2=3;10 call proc_name(1,2,@t1,@t2)
4.pymysql執行預存程序
import pymysqlconn = pymysql.connect(host=‘127.0.0.1‘, port=3306, user=‘root‘, passwd=‘123‘, db=‘t1‘,charset=‘utf8‘)cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)# 執行預存程序cursor.callproc(‘p1‘, args=(1, 22, 3, 4))ret=cursor.fetchall() # 擷取資料集print(ret)# 擷取執行完儲存的參數cursor.execute("select @_p1_0,@_p1_1,@_p1_2,@_p1_3")result = cursor.fetchall() # 擷取執行完預存程序的參數的值conn.commit()cursor.close()conn.close()print(result)觸發器
對某個表進行 增刪改 操作前/操作後,如果希望出發其它行為,可以使用觸發器來完成。
1.建立觸發器
格式:
插入前觸發與插入後觸發:
CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROWBEGIN ...END
CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON tb1 FOR EACH ROWBEGIN ...END
刪除和修改時觸發同上,如:delete on.. , update on..
例如:
NEW表示即將插入的資料行,OLD表示即將刪除的資料行。
delimiter //CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON tb1 FOR EACH ROWBEGIN 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 ;
2.刪除觸發器
DROP 觸發器名稱;
3.使用觸發器
觸發器無法由使用者直接調用,而知由於對錶的【增/刪/改】操作被動引發的。當刪除整個表時,每刪除一條資料,則觸發一次。
insert into tb1(num) values(666)
動態執行sql語句
Mysql(二)