日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

mysql-视图、触发器、事务、存储过程、流程控制

發(fā)布時(shí)間:2025/7/25 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql-视图、触发器、事务、存储过程、流程控制 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

  • 視圖
  • 觸發(fā)器
  • 事務(wù)
  • 存儲(chǔ)過程
  • 流程控制
  • 一、視圖

    視圖是由查詢結(jié)果構(gòu)成的一張?zhí)摂M表,和真實(shí)的表一樣,帶有名稱的列和行數(shù)據(jù)

    強(qiáng)調(diào):視圖是永久存儲(chǔ)的,但是視圖存儲(chǔ)的不是數(shù)據(jù),只是一條sql語句

    視圖的特點(diǎn):

  • 視圖的列可以來自不同的表,是表的抽象和邏輯意義上建立的新關(guān)系。?
  • 視圖是由基本表(實(shí)表)產(chǎn)生的表(虛表)。
  • 視圖的建立和刪除不影響基本表。?
  • 對視圖內(nèi)容的更新(添加、刪除和修改)直接影響基本表。?
  • 當(dāng)視圖來自多個(gè)基本表時(shí),不允許添加和刪除數(shù)據(jù)。
  • 優(yōu)點(diǎn):

  • 可以簡化查詢(多表查詢轉(zhuǎn)換為直接通過視圖查詢)
  • 可以進(jìn)行權(quán)限控制(把表的權(quán)限封閉,開發(fā)對應(yīng)的視圖權(quán)限)
  • (一)、創(chuàng)建視圖

    create view 視圖名稱 as sql 查詢語句 例子:CREATE view test_view as SELECT * from test;

    (二)、查詢視圖

    select * from 視圖名 [where 條件]

    (三)、修改視圖

    alter view 視圖名稱 AS SQL語句; 例子:ALTER view test_view as SELECT * from test_view WHERE salary>10000

    (四)、刪除視圖

    drop view 視圖名稱; 例子:drop view test_view

    二、觸發(fā)器

    觸發(fā)器可以監(jiān)視用戶對表的增、刪、改操作,并觸發(fā)某種操作(沒有查),自動(dòng)執(zhí)行,無法直接調(diào)用。

    創(chuàng)建觸發(fā)器語法的四要素:

      1.監(jiān)視地點(diǎn)(table)

      2.監(jiān)視事件(insert/update/delete)

      3.觸發(fā)時(shí)間(before/after)

      4.觸發(fā)事件(insert/update/delete)

    (一)、創(chuàng)建觸發(fā)器

    # 插入前 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 語法 #準(zhǔn)備表 CREATE TABLE cmd (id INT PRIMARY KEY auto_increment,USER CHAR (32),priv CHAR (10),cmd CHAR (64),sub_time datetime, #提交時(shí)間success enum ('yes', 'no') #0代表執(zhí)行失敗 );CREATE TABLE errlog (id INT PRIMARY KEY auto_increment,err_cmd CHAR (64),err_time datetime );#創(chuàng)建觸發(fā)器 delimiter // CREATE TRIGGER tri_after_insert_cmd AFTER INSERT ON cmd FOR EACH ROW BEGINIF NEW.success = 'no' THEN #等值判斷只有一個(gè)等號INSERT INTO errlog(err_cmd, err_time) VALUES(NEW.cmd, NEW.sub_time) ; #必須加分號END IF ; #必須加分號 END// delimiter ;#往表cmd中插入記錄,觸發(fā)觸發(fā)器,根據(jù)IF的條件決定是否插入錯(cuò)誤日志 INSERT INTO cmd (USER,priv,cmd,sub_time,success ) VALUES('A','0755','ls -l /etc',NOW(),'yes'),('A','0755','cat /etc/passwd',NOW(),'no'),('A','0755','useradd xxx',NOW(),'no'),('A','0755','ps aux',NOW(),'yes');#查詢錯(cuò)誤日志,發(fā)現(xiàn)有兩條 mysql> select * from errlog; +----+-----------------+---------------------+ | id | err_cmd | err_time | +----+-----------------+---------------------+ | 1 | cat /etc/passwd | 2018-09-18 20:18:48 | | 2 | useradd xxx | 2018-09-18 20:18:48 | +----+-----------------+---------------------+ 2 rows in set (0.00 sec) 案例

    強(qiáng)調(diào):NEW表示即將插入的數(shù)據(jù)行,OLD表示即將刪除的數(shù)據(jù)行

    (二)、查看觸發(fā)器

    show triggers

    (三)、刪除觸發(fā)器

    drop trigger 觸發(fā)器的名稱

    三、事務(wù)

    事務(wù)用于將某些操作的多個(gè)SQL作為原子性操作,意思就是,事務(wù)是一組sql語句集合。

    一旦有某一個(gè)出現(xiàn)錯(cuò)誤,即可回滾到原來的狀態(tài),從而保證數(shù)據(jù)庫數(shù)據(jù)完整性。在事務(wù)內(nèi)的語句, 要么全部執(zhí)行成功, 要么全部執(zhí)行失敗。

    (一)、事務(wù)的特性

    事務(wù)具有以下四個(gè)特性(ACID)

      1.原子性:事務(wù)是一個(gè)整體,不可分割,包含在其中的sql操作要么全部成功,要么全部失敗回滾,不可能只執(zhí)行其中一部分操作。

      2.一致性:當(dāng)事務(wù)執(zhí)行后 所有的數(shù)據(jù)都是完整的(外鍵約束 非空約束)。

      3.持久性:一旦事務(wù)提交,數(shù)據(jù)永久保存在數(shù)據(jù)庫中

      4.隔離性:事務(wù)之間相互隔離,一個(gè)事務(wù)的執(zhí)行不影響其他事務(wù)的執(zhí)行

    SQL標(biāo)準(zhǔn)定義了4類隔離級別,包括了一些具體規(guī)則,用來限定事務(wù)內(nèi)外的哪些改變是可見的,哪些是不可見的。低級別的隔離級一般支持更高的并發(fā)處理,并擁有更低的系統(tǒng)開銷。

    (二)、事務(wù)的隔離級別

      1.READ UNCOMMITED(未提交讀):所有事務(wù)都可以看到其他未提交事務(wù)的執(zhí)行結(jié)果。很少用于實(shí)際應(yīng)用,因?yàn)樗男阅懿槐绕渌墑e好多少

      2.READ COMMITED(提交讀):大部分?jǐn)?shù)據(jù)庫默認(rèn)級別,不包括mysql。一個(gè)事務(wù)從開始到提交之前, 所做的任何修改對其他事務(wù)都是不可見的。

      3.REPEATABLE READ(可重復(fù)讀):mysql默認(rèn)級別,解決了臟讀的問題. 該級別保證了在同一個(gè)事務(wù)中多次讀取同樣記錄的結(jié)果時(shí)一致的. 無法解決幻讀問題

      4.SERIALIZABLE(可串行化):是最高的隔離級別,強(qiáng)制事務(wù)排序,使之不可能相互沖突,從而解決幻讀問題

    臟讀:?一個(gè)事物 讀到了 另一個(gè)事務(wù)未提交的數(shù)據(jù) 查詢 之前要保證 所有的更新都已經(jīng)完成。

    不可重復(fù)讀:在一個(gè)事務(wù)的兩次查詢之中數(shù)據(jù)不一致,這可能是兩次查詢過程中間插入了一個(gè)事務(wù)更新的原有的數(shù)據(jù)。

    幻讀:指的是當(dāng)某個(gè)事務(wù)在讀取某個(gè)范圍內(nèi)的記錄時(shí), 另外一個(gè)事務(wù)又在該范圍內(nèi)插入了新的記錄, 當(dāng)之前的事務(wù)再次讀取該范圍的記錄時(shí), 會(huì)產(chǎn)生幻行(Phantom Row).

    ?(三)、事務(wù)操作

    start transaction; 開啟一個(gè)事物 commit 提交事物 rollback 回滾事務(wù)

    注:mysql默認(rèn)開啟自動(dòng)提交事務(wù),pymysql默認(rèn)是不自動(dòng)提交,需手動(dòng)commit

    四、存儲(chǔ)過程

    存儲(chǔ)過程包含了一系列可執(zhí)行的sql語句的集合,類似于函數(shù)(方法)。

    使用存儲(chǔ)過程的優(yōu)點(diǎn):

    #1. 用于替代程序?qū)懙腟QL語句,實(shí)現(xiàn)程序與sql解耦#2. 基于網(wǎng)絡(luò)傳輸,傳別名的數(shù)據(jù)量小,而直接傳sql數(shù)據(jù)量大

    缺點(diǎn):不方便擴(kuò)展

    (一)、使用存儲(chǔ)過程

    創(chuàng)建語法:create procedure 過程的名稱 ({in,out,inout} 數(shù)據(jù)類型 參數(shù)名稱)begin具體的sql代碼end參數(shù)前面需要指定參數(shù)的作用
    in 表示該參數(shù)用于傳入數(shù)據(jù)out 用于返回?cái)?shù)據(jù)inout 即可傳入 也可返回參數(shù)類型是 mysql中的數(shù)據(jù)類型

    調(diào)用語法:
      call 存儲(chǔ)過程()
    案例:創(chuàng)建一個(gè)存儲(chǔ)過程 作用是將兩個(gè)整數(shù)相加create procedure add_p (in a int,in b int)beginselect a + b;end//調(diào)用 call add_p(1,2)案例:創(chuàng)建一個(gè)存儲(chǔ)過程 作用是將兩個(gè)整數(shù)相加 將結(jié)果保存在變量中定義一個(gè)變量set @su = 100;create procedure add_p2 (in a int,in b int,out su int)beginset su = a + b;end//定義變量 set @su = 100;調(diào)用過程 call add_p2(10,20,@su);注意 在存儲(chǔ)過程中 需要使用分號來結(jié)束一行 但是分號有特殊含義得將原始的結(jié)束符 修改為其他符號delimiter // 結(jié)束符更換為//delimiter; 案列 在存儲(chǔ)過程中 需要使用分號來結(jié)束一行 但是分號有特殊含義 得將原始的結(jié)束符 修改為其他符號delimiter // 結(jié)束符更換為//delimiter; create procedure show_p (in a int)beginif a = 1 thenselect "壹";elseif a = 2 thenselect "貳";elseselect "other";end if;end // 使用存儲(chǔ)過程 完成 輸入 一個(gè) 數(shù)字 1或2 顯示 壹 或 貳

    (二)、刪除存儲(chǔ)過程

    drop procedure proc_name;

    五、流程控制

    (一)、條件語句

    delimiter // CREATE PROCEDURE proc_if () BEGINdeclare i int default 0;if i = 1 THENSELECT 1;ELSEIF i = 2 THENSELECT 2;ELSESELECT 7;END IF;END // delimiter ; if

    (二)、循環(huán)語句

    delimiter // CREATE PROCEDURE proc_while () BEGINDECLARE num INT ;SET num = 0 ;WHILE num < 10 DOSELECTnum ;SET num = num + 1 ;END WHILE ;END // delimiter ; while delimiter // CREATE PROCEDURE proc_repeat () BEGINDECLARE i INT ;SET i = 0 ;repeatselect i;set i = i + 1;until i >= 5end repeat;END // delimiter ; repeat BEGINdeclare i int default 0;loop_label: loopset i=i+1;if i<8 theniterate loop_label;end if;if i>=10 thenleave loop_label;end if;select i;end loop loop_label;END loop

    ?

    轉(zhuǎn)載于:https://www.cnblogs.com/mangM/p/9671363.html

    總結(jié)

    以上是生活随笔為你收集整理的mysql-视图、触发器、事务、存储过程、流程控制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。