數據庫---數據控制語言(DCL)
數據控制,其實就是“分配權限”——就涉及到用戶。
則主要就是2個問題:
用戶管理:
權限分配:
有哪些權限。
mysql中的權限
mysql中,權限是系統內定的一些“名詞”(單詞),大約30個,每個權限表示“可以做什麽工作”。
則分配權限就是相當於讓某個用戶可以做哪些工作。
主要權限如下:
mysql中的用戶:mysql中的用戶信息都存儲在系統數據庫mysql的user表中。
創建用戶
語法形式:
create user ‘用戶名’@’允許其登錄的地址’ identified by ‘密碼’;
說明:
1,創建的用戶需同時指定該用戶可以在哪個地址進行登錄。
其中“%”代表“任何地址”。
2,用戶創建之後,自動在mysql的user表中添加了一條記錄,但該用戶還沒有權限。
刪除用戶
drop user ‘用戶名’@’允許其登錄的地址’;
修改用戶密碼
修改自己密碼: set password = password(‘新密碼’);
修改他人密碼(必須有修改權限):
set password for ‘用戶名’@’允許其登錄的地址’ = password(‘新密碼’);
權限分配
增加權限:
grant 權限名1,權限名2, .... on 數據庫名.對象名 to ‘用戶名’@’允許其登錄的地址’ identified by ‘密碼’;
說明:
1權限名就是:’select’, ‘update’, ‘delete’,等等。其中ALL 表示“所有權限”,或all privileges也一樣
2對象名:就是一個數據庫中“裝”的東西,表是最常見的,也可以是視圖,存儲過程,存儲函數等。
其中:*.*
某數據庫名.*表示該數據庫中的所有對象——這個商業上常用。
3,identified by ‘密碼’用於給一個用戶在此時修改密碼,不寫也可以,那就不修改密碼。
4,但同時該語句也可以創建用戶(如果不存在),但此時identified by ‘密碼’必須寫。
刪除權限
revoke 權限名1,權限名2, .... on 數據庫名.對象名 from ‘用戶名’@’允許其登錄的地址’ ;
表示從某個用戶身上“取消”某些權限(也許還保留了其他權限)。
事務控制語言(DTL)
什麽是事務
通常,在此之前,我們說,一條語句使用一個分號(;)來結束,並得到執行。
那麽我們說,這個“一次性執行”的過程,可以稱為“一個事務”。
簡單來說,“一條sql語句,就是一個事務”。
則:
數據庫(自然包括mysql數據庫)中的事務,是指,可以將“多條語句”的執行,當作“一條語句”來看到的一種內部機制。
即:“事務”是一種可以保證“多條語句一次性執行完成”或“一條都不執行”的機制。
事務可以看作是一個“容器”,將多條語句,放入該容器,最後,只要一個命令行,來決定其中的所有語句是否“執行”
事務的特點
原子性:一個事務中的所有語句,應該做到:要麽全做,要麽一個都不做;
一致性:讓數據保持邏輯上的“合理性”,比如:一個商品出庫時,既要讓商品庫中的該商品數量減1,又要讓對應用戶的購物車中的該商品加1;
隔離性:如果多個事務同時並發執行,但每個事務就像各自獨立執行一樣。
持久性:一個事務執行成功,則對數據來說應該是一個明確的硬盤數據更改(而不僅僅是內存中的變化)。
事務模式:就是讓每條執行語句是否當作“一個事務”來看到的設定項。
mysql默認安裝好之後,其事務模式是:一條語句當作一個事務。
事務的基本實現流程:
1,聲明事務開始:start transaction;
2, 設定多條要執行的具體語句,比如:insert, update, delete, select。。。其實就是執行,只是這些執行的語句,並不“生效”——其只是內存狀態下的執行,而不是物理狀態的執行。
3,判斷是否需要執行該些語句: if( 判斷是否有錯誤){ //執行——才針對執行了物理性改變——即生效。 commit; } eslse{ //回滾——不執行任何語句。 rollback; }
判斷是否有錯誤通常分這兩種環境:
1,如果是cmd中,直接觀察是否出錯。
2,如果是php程序中,那就需要使用 mysql_error()函數來判斷是否有錯。
一個事務有多條語句,如果全部正確,則commit,如果有其中任意一條或一條以上發生錯誤,則rollback;
mysql編程
基本語法形式
語句塊模式:
在mysql編程中,begin....end;基本代替了原來編程語句中的{...}語法。
但又有所區別:
一個bigin...end;塊,可以給定一個“標識符”,並且可以使用leave語句來“退出”該語句塊。
基本流程控制語句:
if語句:
case語句:(類似php中的switch)
while循環語句:
mysql中的變量
變量它有一定的使用場景限制(其實包括前面的流程控制語句也這樣):
在通常的執行各種create,insert,delete,update,select等語句的“環境”中,並不使用常規變量,也不能使用流程控制語句。
其實,這些語句只能在編程環境中用——通常的增刪改查,可以稱為命令環境。
常規mysql命令環境,可以執行:增刪改查
編程環境:存儲函數中,存儲過程中,觸發器中。
普通變量的聲明語法:
declare 變量名 變量類型 [default 初始值]
變量的賦值語法:
set 變量名 = 變量值
mysql還有一種變量形式,可以稱為“會話變量”
會話變量的形式為: @變量名;
會話變量無需單獨聲明,而是直接賦值就可以,類似php
會話變量的賦值: set 變量名 = 值;
會話變量可以在普通命令行環境中或編程環境中使用。
綜上所述: 語法1:set 變量名 = 表達式;#此語法中的變量必須先使用declare聲明
語法2:set @變量名 = 表達式; #此方式可以無需declare語法聲明,而是直接賦值,類似php定義變量並賦值。
語法3:select @變量名 := 表達式;#此語句會給該變量賦值,同時還會作為一個select語句輸出“結果集”。
語法4:select 表達式 into @變量名;#此語句雖然看起來是select語句,但其實並不輸出“結果集”,而只是給變量賦值。
總結---兩種變量:
普通變量:不帶@符,直接寫名字,必須先聲明,後使用(賦值之類),只能用於編程環境
會話變量:帶@符,無需聲明,直接使用(先賦值),可以用於2種環境。
存儲函數
調用形式:
跟系統函數的調用形式一樣,直接使用名字,並帶括號,以及根據需要帶實參。
比如:
select 3, now(), f1(); //f1為自定義的存儲函數。
select 3, now(), f2(3, ‘abc’, @v1); //帶3個實參,其中@v1是一個前面賦值了的變量。
刪除:drop function [if exists] 存儲函數名;
存儲過程
存儲過程就是一個沒有返回值數據值的“函數”。
雖然存儲過程不返回單個數據值,但可以“返回”結果集——這裏的返回起始就是select語句的正常結果表現。
定義形式:
其中,
in,out,inout用於修飾一個形參的“數據流向”:
in:只作為外部輸入數據,調用環境傳入存儲過程內部,默認值。
out:只作為輸出數據,即存儲過程傳出到調用環境。
inout:具有雙重。
存儲過程調用形式:
call 存儲過程名(實參1,實參2,.....);
刪除:drop procedure [if exists] 存儲過程名;
觸發器
什麽叫觸發器:
就是mysql中的一種“一觸即發”的機器(機制)。
其實只是預先定義好的一段代碼。該段代碼無需人工調用,而是會在‘預計’好的某個情形下自動執行。
通常就這幾個情形:
對某個數據表的增(或刪或改)之前(或之後)。 //每個表可見只有6種情形。
觸發器內部也跟存儲過程或存儲函數一樣,屬於“編程環境”。
定義形式:
create trigger 觸發器名字 before(或after) insert(或update或delete) on 表名 for each row
begin
要執行的代碼,語句塊,編程環境,但這裏也不能使用select語句。
end;
在觸發器內部,其中有兩個關鍵字具有特定含義和數據獲取作用:
new:代表新插入的一條數據,在insert事件的時候有效。
old:代表舊的一條數據,在update或delete的時候有效。
刪除觸發器: drop trigger 觸發器名
數據庫---數據控制語言(DCL)