1.視圖
2.觸發器***
在某個時間發生了某個事件時 會自動觸發一段sql語句
3.事務*****
4.存儲過程*****
5.函數
6.備份與恢復***
mysqldump -u -p (庫名 [表名] | --all--databases --databases 庫名1 庫名2) > 文件路徑
恢復
1.mysql -u -p < 文件路徑
2.source 文件路徑
7.流程控制
----------------
1. 視圖
視圖是一個虛擬表(非真實存在),其本質是【根據SQL語句獲取動態的數據集,併爲其命名】,
用戶使用時只需使用【名稱】便可獲取結果集,能夠將該結果集當作表來使用。
使用視圖咱們能夠把查詢過程當中的臨時表摘出來,用視圖去實現,
這樣之後再想操做該臨時表的數據時就無需重寫複雜的sql了,直接去視圖中查找便可,
但視圖有明顯地效率問題,而且視圖是存放在數據庫中的,若是咱們程序中使用的sql過度依賴數據庫中的視圖,
即強耦合,那就意味着擴展sql極爲不便,所以並不推薦使用
100個SQL:
88: v1
select .. from v1
select asd from v1
某個查詢語句設置別名,往後方便使用
- 建立
create view 視圖名稱 as SQL
PS: 虛擬
- 修改
alter view 視圖名稱 as SQL
- 刪除
drop view 視圖名稱;
2. 觸發器
當對某張表作:增刪改操做時,可使用觸發器自定義關聯行爲
insert into tb (....)
-- delimiter //
-- create trigger t1 BEFORE INSERT on student for EACH ROW
-- BEGIN
-- INSERT into teacher(tname) values(NEW.sname);
-- INSERT into teacher(tname) values(NEW.sname);
-- INSERT into teacher(tname) values(NEW.sname);
-- INSERT into teacher(tname) values(NEW.sname);
-- END //
-- delimiter ;
--
-- insert into student(gender,class_id,sname) values('女',1,'陳濤'),('女',1,'張根');
-- NEW,代指新數據
-- OLD,代指老數據
3.事務*****
是邏輯上的一組sql語句 他們要麼都成功 要麼都失敗 從此只要執行sql就會有事務 使用事務 start transaction; --開啓事物,在這條語句以後的sql將處在同一事務,並不會當即修改數據庫 commit;--提交事務,讓這個事物中的sql當即執行數據的操做, rollback;--回滾事務,取消這個事物,這個事物不會對數據庫中的數據產生任何影響 四個特性 原子性:事務是一組不可分割的單位,要麼同時成功,要麼同時不成功 一致性: 事物先後的數據完整性應該保持一致 隔離性:多個用戶併發訪問數據時,一個用戶的事物不能被其它用戶的事務所幹擾,多個併發事務之間數據要相互隔離 持久性:一個事物一旦被提交,它對數據的改變就是永久性的,接下來即便數據庫發生故障也不該該對其有任何影響 四個隔離級別 讀未提交:read uncommitted --不作任何隔離,可能髒讀,幻讀 讀已提交:read committed----能夠防止髒讀,不能防止不可重複讀,和幻讀, 可重複讀:Repeatable read --能夠防止髒讀,不可重複讀,不能防止幻讀 序列化執行(串行):Serializable--數據庫運行在串行化實現,全部問題都沒有,就是性能低 修改隔離級別: select @@tx_isolation;--查詢當前級別 set[session|global] transaction isolation level .... ;修改級別 實例: set global transaction isolation level Repeatable read ; pymysql事務測試 import pymysql conn = pymysql.connect( user="root", password="root", database="day48", charset="utf8" ) cursor = conn.cursor(pymysql.cursors.DictCursor) # cursor.execute("delete from account where id =1") # conn.commit() sql = "update account set money = money - 100 where id = 2" sq2 = "update account set moneys = money + 100 where id = 3" try: cursor.execute(sql) cursor.execute(sq2) conn.commit() print("提交了!") except: print("回滾了!") conn.rollback() # 把你須要放在同一事務的sql執行 放在try中 最後加上commit # 若是捕獲到異常則執行rollback4. 函數 def f1(a1,a2): return a1 + a2 f1() bin() 內置函數: 執行函數 select CURDATE(); blog id title ctime 1 asdf 2019-11 2 asdf 2019-11 3 asdf 2019-10 4 asdf 2019-10 select ctime,count(1) from blog group ctime select DATE_FORMAT(ctime, "%Y-%m"),count(1) from blog group DATE_FORMAT(ctime, "%Y-%m") 2019-11 2 2019-10 2 自定義函數(有返回值): delimiter \\ create function f1( i1 int, i2 int) returns int BEGIN declare num int default 0; set num = i1 + i2; return(num); END \\ delimiter ; SELECT f1(1,100); 4. 存儲過程 保存在MySQL上的一個別名 => 一坨SQL語句 別名() 用於替代程序員寫SQL語句 方式一: MySQL: 存儲過程 程序:調用存儲過程 方式二: MySQL:。。 程序:SQL語句 方式三: MySQL:。。 程序:類和對象(SQL語句) 是一堆sql語句的集合,至關於一個py的函數 優勢: 應用程序開發者,工做量下降, 提升程序的執行效率 由於網絡io減小了 缺點:學習成本高,擴展性 維護性差 部門間溝通成本pymysql調用存儲過程 import pymysql conn = pymysql.connect( user="root", password="root", database="day48", charset="utf8" ) cursor = conn.cursor(pymysql.cursors.DictCursor) cursor.callproc("p1",(2,5,1)) #pymysql 會給參數全都建立對應的變量 # 命名方式 @_p1_0 @_p1_1 @_p1_2 print(cursor.fetchall()) # 若是過程當中包含多個查詢語句 獲得的是第一條查詢語句的結果 cursor.execute("select @_p1_2") print(cursor.fetchone()) 1. 簡單 create procedure p1() BEGIN select * from student; INSERT into teacher(tname) values("ct"); END call p1() cursor.callproc('p1') 2. 傳參數(in,out,inout) delimiter // create procedure p2( in n1 int, in n2 int ) BEGIN select * from student where sid > n1; END // delimiter ; call p2(12,2) cursor.callproc('p2',(12,2)) 3. 參數 out delimiter // create procedure p3( in n1 int, inout n2 int ) BEGIN set n2 = 123123; select * from student where sid > n1; END // delimiter ; set @v1 = 10; call p2(12,@v1) select @v1; set @_p3_0 = 12 ser @_p3_1 = 2 call p3(@_p3_0,@_p3_1) select @_p3_0,@_p3_1 cursor.callproc('p3',(12,2)) r1 = cursor.fetchall() print(r1) cursor.execute('select @_p3_0,@_p3_1') r2 = cursor.fetchall() print(r2) =======> 特殊 a. 可傳參: in out inout b. pymysql cursor.callproc('p3',(12,2)) r1 = cursor.fetchall() print(r1) cursor.execute('select @_p3_0,@_p3_1') r2 = cursor.fetchall() print(r2) 爲何有結果集又有out僞造的返回值? delimiter // create procedure p3( in n1 int, out n2 int 用於標識存儲過程的執行結果 1,2 ) BEGIN insert into vv(..) insert into vv(..) insert into vv(..) insert into vv(..) insert into vv(..) insert into vv(..) END // delimiter ; 5. 遊標 delimiter // create procedure p6() begin declare row_id int; -- 自定義變量1 declare row_num int; -- 自定義變量2 declare done INT DEFAULT FALSE; declare temp int; declare my_cursor CURSOR FOR select id,num from A; declare CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; open my_cursor; xxoo: LOOP fetch my_cursor into row_id,row_num; if done then leave xxoo; END IF; set temp = row_id + row_num; insert into B(number) values(temp); end loop xxoo; close my_cursor; end // delimter ; 6. 動態執行SQL(防SQL注入) delimiter // create procedure p7( in tpl varchar(255), in arg int ) begin 1. 預檢測某個東西 SQL語句合法性 2. SQL =格式化 tpl + arg 3. 執行SQL語句 set @xo = arg; PREPARE xxx FROM 'select * from student where sid > ?'; EXECUTE xxx USING @xo; DEALLOCATE prepare prod; end // delimter ; call p7("select * from tb where id > ?",9) ===> delimiter \\ CREATE PROCEDURE p8 ( in nid int ) BEGIN set @nid = nid; PREPARE prod FROM 'select * from student where sid > ?'; EXECUTE prod USING @nid; DEALLOCATE prepare prod; END\\ delimiter ;