1. 程式人生 > >MySql基礎教程二(檢視,儲存過程,遊標,觸發器,事務,許可權,資料型別)

MySql基礎教程二(檢視,儲存過程,遊標,觸發器,事務,許可權,資料型別)

檢視

檢視是虛擬的表。與包含資料的表不一樣,檢視只包含使用時動態檢索資料的查詢。比如下面的語句:

select cust_name, cust_contact from customers, orders, orderitems 
where customers.cust_id=orders.cust_id and 
orders.order_num=orderitems.order_num and
orderitems.prod_id='TNT2';
  • 1
  • 2
  • 3
  • 4

如果使用檢視,可以將整個查詢包裝成一個名為productcustomers的虛擬表,則採用下面的查詢即可得到相同的結果:

select cust_name, cust_contact from
productcustomers where prod_id='TNT2';
  • 1

這就是檢視的作用,productcustomers是一個檢視,作為檢視,它不包含表中應該有的任何資料,它包含的是一個sql查詢。建立上述檢視的方法:

create view productcustomers as
select cust_name, cust_contact, prod_id from customers, orders, orderitems
where customers.cust_id=orders.cust_id and orderitems.order_num=orders.order_num;
  • 1
  • 2
  • 3

在檢視建立之後,可以用與表基本相同的方式利用它們。可以對檢視進行select操作,過濾和排序操作,將檢視聯接到其他檢視或表,甚至能新增和更新資料,但是更新一個檢視將更新其基表,儘量將檢視用於檢索,而不是更新
使用show create view viewname; 來檢視檢視;用drop刪除檢視,其語法為drop view viewname;。更新檢視時,可以先用drop,再用create,也可以使用create or replace view

檢視的好處:
1,重用sql語句;
2,簡化複雜的sql操作。在編寫查詢後,可以方便的重用它而不必知道它的基本查詢細節;
3,使用表的組成部分而不是整個表;
4,保護資料。可以給使用者授予表的特定部分的訪問許可權而不是整個表的訪問許可權;
5,更改資料格式和表示,檢視可返回與底層表的表示和格式不同的資料;

儲存過程

很多時候,一個完整的操作需要多條語句才能完成,儲存過程就是為以後的使用而儲存的一條或多條mysql語句的集合。並且執行速度快,可將其視為批檔案、函式。

DELIMITER $
CREATE PROCEDURE ordertotal(
    IN onumber INT,
    IN taxable BOOLEAN,
    OUT ototal DECIMAL(8,2)
) COMMENT 'Obtain order total'
BEGIN
    -- Declare variable.
    DECLARE total DECIMAL(8,2);
    DECLARE taxrate INT DEFAULT 6;

    SELECT sum(item_price*quantity)
    FROM orderitems
    WHERE order_num = onumber
    INTO ototal;

    -- Is this taxable?
    IF taxable THEN
        SELECT total+(total/100*taxrate) INTO total;
    END IF;
    SELECT total INTO ototal;
END$
DELIMITER ;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

1,關鍵字out表明相應的引數用來從儲存過程中傳出一個值。mysql支援in(傳遞給儲存過程)和out(從儲存過程中傳出)和inout(傳入和傳出)。布林值0表示假,非零表示真。
2,呼叫該儲存過程的語句是:call ordertotal(20005,0,@total); 所有的變數都必須以@開始,在呼叫時,並不顯示任何資料,要想顯示結果,則select @total;
3,儲存過程在建立之後,被儲存在伺服器上以供使用,直到被刪除。刪除儲存過程的命令如下:drop procedure ordertotal;
4,使用show create procedure name檢視儲存過程。
5,DELIMITER $表示臨時修改分割符,因為儲存過程中用到了;分號。

遊標

使用簡單的select語句,沒有辦法得到第一行、下一行或前10行,也不存在每次一行的處理所有行的簡單方法,有時,需要在檢索出來的行中前進或後退一行或多行,這時就需要使用遊標。
遊標是一個儲存在mysql伺服器上的資料庫查詢,它不是一條select語句,而是被該語句檢索出來的結果集。在儲存了遊標之後,應用程式可以根據需要滾動或瀏覽其中的資料。mysql遊標只能用於儲存過程,儲存過程處理完成後,遊標就消失。

CREATE PROCEDURE processorders()
BEGIN
    -- declare local variables
    DECLARE done BOOLEAN DEFAULT 0;
    DECLARE o INT;
    DECLARE t DECIMAL(8,2);

    -- declare the cursor
    DECLARE ordernumbers CURSOR
    FOR
    SELECT order_num FROM orders;

    -- declare continue handler
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;

    -- createa table to store the results
    CREATE TABLE IF NOT EXISTS ordertotals(order_num INT,
    total DECIMAL(8,2));

    --open the cursor
    OPEN ordernumbers;

    -- loop through all rows
    REPEAT
        -- get order number
        FETCH ordernumbers INTO o;
        -- get the total for this order
        CALL ordertotal(o, 1, t);
        -- insert order and total into ordertotals
        INSERT INTO ordertotals(order_num, total) 
        VALUES(o, t);
    -- end of loop
    UNTIL done END REPEAT;
    --close the cursor
    CLOSE ordernumbers;
END;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

1,在使用遊標之前,必須DECLARE宣告定義它。這個過程實際上沒有檢索資料,它只是定義要使用的select語句。
2,一旦宣告之後,必須OPEN開啟遊標以供使用。這個過程,會執行前面定義的select語句,並存儲檢索出的資料以供瀏覽和滾動。
3,遊標在開啟後,可以使用FETCH語句,分別訪問它的每一行,FETCH還將移動遊標中的內部行指標,使下一條FETCH語句檢索下一行。所以在上例中,FETCH ordernumbers INTO o;表示將檢索當前行的order_num到一個名為o的區域性宣告的變數中。FETCH在REPEAT中,它會反覆執行,直到done為真。done為真的條件是:
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1; 這條語句定義了一個控制代碼HANDLER,它在條件出現時被執行,也就是當sqlstate ‘02000’ 出現時,set done = 1。 sqlstate ‘02000’ 表示未找到行,當repeat沒有更多的行而不能繼續迴圈時,這個條件就會出現。
注意:用declare定義的區域性變數必須在定義任意遊標或控制代碼之前,而控制代碼必須在遊標之後定義。
4,在結束遊標使用時,必須關閉遊標

觸發器

觸發器是MySQL響應以下任意語句而自動執行的一條MySQL語句(或位於BEGIN和END語句之間的一組語句):DELETE;INSERT;UPDATE。其他的MySQL語句不支援觸發器。只有表才支援觸發器,檢視不支援

建立觸發器需要給出4條資訊:
1,唯一的觸發器名;
2,觸發器關聯的表;
3,觸發器應該響應的活動(DELETE、INSERT或UPDATE)
4,觸發器何時執行(處理前還是後,前是BEFORE 後是AFTER)

觸發器按每個表每個事件每次地定義,每個表每個事件每次只允許定義一個觸發器,因此,每個表最多定義6個觸發器(每條INSERT UPDATE 和DELETE的之前和之後)。單個觸發器不能與多個事件或多個表關聯,所以,如果你需要一個對INSERT 和UPDATE儲存執行的觸發器,則應該定義兩個觸發器。

我們建立的資料庫一般都是 InnoDB 資料庫,其上建立的表是事務性表,也就是事務安全的。這時,若SQL語句或觸發器執行失敗,MySQL 會回滾事務,有:
1,如果 BEFORE 觸發器執行失敗,SQL 無法正確執行。
2,SQL 執行失敗時,AFTER 型觸發器不會觸發。
3,AFTER 型別的觸發器執行失敗,SQL 會回滾。

假設系統中有兩個表:
班級表 class(班級號 classID, 班內學生數 stuCount)
學生表 student(學號 stuID, 所屬班級號 classID)
要建立觸發器來使班級表中的班內學生數隨著學生的新增自動更新,程式碼如下:

DELIMITER $
CREATE TRIGGER tri_stuInsert AFTER INSERT ON student 
FOR EACH ROW
BEGIN
    DECLARE c INT;
    SET c = (SELECT stuCount FROM class 
    WHERE classID=NEW.classID);
    UPDATE class SET stuCount = c + 1 
    WHERE classID = NEW.classID;
END$
DELIMITER ;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

NEW 和 OLD用來表示觸發器的所在表中,觸發了觸發器的那一行資料。NEW表示經過處理後的新表,OLD表示處理前的舊錶。
另外,OLD 是隻讀的,不能更新,而 NEW 則可以在觸發器中使用 SET 賦值,這樣不會再次觸發觸發器。
下面例子時使用OLD儲存將要刪除的行到一個存檔表中:

CREATE TRIGGER delete_order BEFORE DELETE ON orders
FOR EACH ROW
BEGIN  
    INSERT INTO archive_orders(order_num, order_date, cust_id)
    VALUES(OLD.order_num, OLD.order_date, OLD.cust_id);
END;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

刪除觸發器:DROP TRIGGER name; 觸發器不能更新或覆蓋,所以修改觸發器只能先刪除再建立。
檢視觸發器:SHOW TRIGGERS [FROM schema_name];

事務

mysql中,並非所有的引擎都支援事務管理,比如常見的引擎myisam和innodb,前者就不支援事務,而後者支援。事務處理是一種機制,用來管理必須成批執行的mysql操作,以保證資料庫不包含不完整的操作結果。利用事務處理,可以保證一組操作不會中途停止,它們或者作為整體執行,或者完全不執行。如果沒有錯誤發生,整組語句提交給資料庫表。如果發生錯誤,則進行回退,已恢復資料庫到某個一直且安全的狀態。
事務處理的關鍵詞有
事務(transaction):指一組sql語句;
回退(rollback):撤銷指定sql語句的過程;
提交(commit):將未儲存的sql語句結果寫入資料庫表中;
保留點(savepoint):事務處理中設定的臨時佔位符,可以對他進行回退,而不是回退整個事務。

select * from ordertotals;
start transaction;
delete from ordertotals;
select * from ordertotals;
rollback;
select * from ordertotals;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

事務的開始:start transaction;rollback;命令回退。事務處理用來管理insert、update和delete語句,不能回退select(無意義),create和drop操作。

一般的mysql語句都是直接對資料庫表執行和編寫的,這就是所謂的隱含提交,也就是提交操作是自動進行的。但是,在事務處理中,必須使用commit語句進行明確的提交:

start transaction;
delete from orderitems where order_num = 20010;
delete from orders where order_num = 20010;
commit;
  • 1
  • 2
  • 3
  • 4

事務中的語句全部成功時,commit才會成功,如果上邊第一條delete起作用,但第二條失敗,則commit不會成功。當commit或rollback語句執行後,事務會自動關閉

對於複雜的事務處理,可能需要部分提交或回退。為了支援回退部分事務處理,必須能在事務處理塊中合適的位置放置佔位符(保留點)。如果需要回退,可以回退到某個佔位符。使用savepoint語句設定保留點: savepoint delete1;,使用rollback回退到保留點:rollback to delete1;。保留點在事務處理完成(執行commit或rollback)之後自動釋放。

許可權

MySQL使用者賬號和資訊儲存在名為mysql的資料庫中,在其中的user表記錄了使用者資訊:

USE mysql;
SELECT user FROM user;
  • 1
  • 2

1,接下來我們建立一個新使用者賬號,使用CREATE USER語句:CREATE USER gq IDENTIFIED BY '123123';
2,重新命名一個使用者賬號,使用RENAME USER語句:RENAME USER gq TO gq2;
3,為了刪除使用者賬號,使用DROP USER語句:DROP USER gq;
4,新建立的使用者沒有訪問許可權,它們只能登陸伺服器,但不能看到資料,也不能執行任何資料庫操作。檢視使用者賬號的許可權,使用:SHOW GRANTS FOR gq;
5,授權GRANT SELECT,INSERT ON test.* TO gq;上述語句允許使用者gq在test .*(test資料庫的所有表)上使用SELECT和INSERT。如果是所有許可權用ALL
6,撤銷許可權使用revoke語句:REVOKE SELECT ON test.* FROM gq;
7,修改使用者密碼mysqladmin -u 使用者名稱 -p password 新密碼; 輸入這個命令後,需要輸入使用者名稱的原密碼。之後,再FLUSH PRIVILEGES;即可生效。
另一種方法是: SET PASSWORD FOR gq = Password('[email protected]$$wOrd'); 這是以root使用者的身份給用gq改密碼,如果使用者gq自己改自己,就去掉FOR gq
還有一種方法是更改本節開頭說的User表。

MySql資料型別

數值型:

整形:
這裡寫圖片描述
上面定義的都是有符號的,當然了,也可以加上unsigned關鍵字,定義成無符號的型別,那麼對應的取值範圍就要翻翻了,比如:tinyint unsigned的取值範圍為0~255。
浮點型:
這裡寫圖片描述
特別注意浮點型會出現截斷問題,對於float(5, 3)型別:
1,插入123.45678,最後查詢得到的結果為99.999;
2,插入123.456,最後查詢結果為99.999;
3,插入12.34567,最後查詢結果為12.346;

字串型

這裡寫圖片描述
1,char和varchar最大的區別就在於char不管實際value都會佔用n個字元的空間,而varchar只會佔用實際字元應該佔用的空間+1。
2,超過char和varchar的設定的n後,字串會被截斷。
3,char在儲存的時候會截斷尾部的空格,varchar和text不會。
4,mysql處理定長比處理變長快很多,而且不能對變長索引。
5,varchar會使用1-3個位元組來儲存長度,text不會。

日期時間型別

這裡寫圖片描述

二進位制型別

二進位制型別可儲存任意資料,如影象、多媒體、文件。
這裡寫圖片描述

相關推薦

MySql基礎教程檢視儲存過程遊標觸發器事務許可權資料型別

檢視 檢視是虛擬的表。與包含資料的表不一樣,檢視只包含使用時動態檢索資料的查詢。比如下面的語句: select cust_name, cust_contact from customers, orders, orderitems where customers.cust_id=orders.cust_i

MySQL資料庫基礎知識五檢視儲存程式

使用檢視 檢視是一個虛表,它是在表或其他檢視的基礎上,使用SELECT語句來定義的。 建立檢視: create view view_name as select last_name,first_name from president;//建立虛表view_name,表為

【轉】MySQL資料庫 外來鍵、檢視儲存過程觸發器的優缺點

https://www.yiibai.com/mysql/introduction-sql-views.html 檢視 使用資料庫檢視的優點 資料庫檢視允許簡化複雜查詢:資料庫檢視由與許多基礎表相關聯的SQL語句定義。 您可以使用資料庫檢視來隱藏終端使用者和外部應用

mysql 神器 if 語句儲存過程遊標

BEGIN declare key_list varchar(255) default '';  declare mykey varchar(255) default '';  declare int_flag int default 0;  declare done int

mysql小白之旅——進階篇2——儲存過程、事件、觸發器事務、分散式事務

14.儲存過程的寫法 1)定義條件和處理 --CONDITION --HANDLER 2)游標 CURSOR --DECLARE --OPEN --FETCH --CLOSE 3)流程控制 --IF語句 --CASE語句 --LOOP語句 --LEAVE語句  相當於br

關於plsql的總結儲存過程遊標觸發器

1.什麼是plsql?         PL/SQL Developer是一個整合開發環境,專門開發面向Oracle資料庫的應用。PL/SQL也是一種程式語言,叫做過程化SQL語言(Procedural Language/SQ

表、檢視儲存過程、函式、觸發器、事件

儲存過程(Stored Procedure)是一組為了完成特定功能的SQL語句集,經編譯後儲存在資料庫中。使用者通過指定儲存過程的名字並給出引數(如果該儲存過程帶有引數)來執行它。儲存過程是資料庫中的一個重要物件,任何一個設計良好的資料庫應用程式都應該用到儲存過程。函式l過程不必返回值l函式必須返回值l過程可

檢視儲存過程和函式以及觸發器

一、檢視1.檢視的定義檢視是一種虛擬存在的表,它本身在資料庫中並不存在,而是在我們出於某種目的想要去使用檢視的時候,使用我們資料庫中已經存在的表的行和列資料來自定義的一種動態生成的,便於檢索的安全的資料獨立的一種虛擬表。2.優點①簡單。檢視是一種已經經過過濾篩選之後的符合條件

MySQL檢視儲存過程觸發器

一:檢視 什麼是檢視? 檢視(View)是一種虛擬存在的表,對於使用檢視的使用者來說基本上是透明的。檢視並 不在資料庫中實際存在,行和列資料來自定義檢視的查詢中使用的表,並且是在使用檢視時 動態生成的 檢視的優點? 簡單:使用檢視的使用者完全不需要關心後面對應的表的

Mysql基礎教程-Mysql的字符集檢視與修改

Show variables like “%char%”修改mysql的字符集----資料庫級1)臨時的修改Set global character-set_server=utf82)永久修改Alter database commany set utf8 collate utf8_general_ci; -

mysql 檢視事務儲存過程觸發器

一 檢視 檢視是一個虛擬表(非真實存在),是跑到記憶體中的表,真實表是硬碟上的表。使用檢視我們可以把查詢過程中的臨時表摘出來,儲存下來,用檢視去實現,這樣以後再想操作該臨時表的資料時就無需重寫複雜的sql了,直接去檢視中查詢即可,但檢視有明顯地效率問題,並且檢視是存放在資料庫中的,如果我們程式中使用的sql

MYSQL基礎上機練習題 資料插入、修改、刪除

一、實驗目的: 資料插入、修改、刪除 資料表的複製 欄位分列 二、實驗內容: 對上一章所展示的表進行資料輸入、修改、刪除 上一章各表的欄位屬性 以下為Employees,Departments,Salary表中的內容 Employees表

MYSQL基礎上機練習題資料指定列查詢、條件查詢、查詢結果排序、聚集函式查詢、分組統計查詢

實驗目標:1.掌握指定列或全部列查詢2.掌握按條件查詢3.掌握對查詢結果排序4.掌握使用聚集函式的查詢5.掌握分組統計查詢一、請完成書中實驗7.1,並完成以下問題。1.查詢所有學生的姓名及其出生年份回答以下問題:SQL語句請截圖① 觀察查詢的資料,若年齡不為空是否能求出出生年

Mysql觸發器檢視儲存過程詳解例項

/*觸發器trigger*/觸發器的概念:監視某種情況並出發某種操作例如:一個電子商城商品表goods簡稱g:主鍵   商品名    庫存    1      電腦      282      手錶      120訂單表o:訂單主鍵    訂單外來鍵    購買數量1   

MySQL定時任務event儲存過程定時刪除指定時間前90天指定表的資料

<span style="font-family: 'Microsoft YaHei'; font-size: 14px;">MySQL定時任務event</span> 由

檢視Oracle當前使用者下的資訊使用者檢視索引表空間同義詞儲存過程函式約束條件

、表空間   SQL>select username,default_tablespace from user_users;   檢視當前使用者的角色   SQL>select * from user_role_privs;   檢視當前使用者的系統許

MySQL基礎學習

efault 大於 con cnblogs 修改表 語句 lec affect color 一,數據庫操作   主鍵     主鍵是索引的一種,並且是唯一性索引,且必須定義為primary key。一個表只有一個主鍵,主鍵可以由多列組成。     聲明主鍵的關鍵字為:pri

win10環境下VTK7.1的編譯和Qt調用VTK的詳細教程VS2013編譯支持Qt的VTK庫

span ble 導致 解決方法 log 發現 ear files 沒有 本文主要用於編譯支持Qt的VTK庫,重點在於編譯VTK庫,供Qt調用。 第1步:新建一個文件夾:vtkDir 第2步:在該文件夾下新建兩個文件夾vtk_bin、vtk_src 第3步:將下載好的V

給初學者的RxJava2.0教程()

pos 添加 tex 工作 -i com ava gis ket 前言 上一節教程講解了最基本的RxJava2的使用, 在本節中, 我們將學習RxJava強大的線程控制. 正題 還是以之前的例子, 兩根水管: RxJava 正常情況下, 上遊和下遊是工作在同一個

《Python基礎教程第2版修訂版中要註意的地方

這樣的 raw 趨勢 lin 無效 很多 學習 現在 教材 想必現在大家學習Python都會用3.0及以上的版本了,雖然2.X的版本依然很多,但是這兩年隨著部分開源項目不再支持2.X版本,3.X已經成為趨勢。 正是在這樣的大背景下,我最近用這本《Python基礎教程》做教材