1. 程式人生 > >資料庫檢視事務基礎

資料庫檢視事務基礎

資料庫-檢視,事務

– 什麼是檢視? – 通俗的講,檢視就是一條SELECT語句執行後返回的結果集。 – 所以我們在建立檢視的時候,主要的工作就落在建立這條SQL查詢語句上。

– 檢視的特點 – 檢視是對若干張基本表的引用,一張虛表,查詢語句執行的結果, – 不儲存具體的資料(基本表資料發生了改變,檢視也會跟著改變);

– 檢視的最主要的作用 – 如果資料庫因為需求等原因發生了改變,為了保證查詢出來的資料與之前相同, – 則需要在多個地方進行修改,維護起來非常麻煩,這個時候使用檢視就可解決這個問題

– 檢視的定義方式 create view 檢視名稱(一般使用v開頭) as select語句;

– 查出學生的id,姓名,年齡,性別 和 學生的 班級 select s.id,s.name,s.age,s.gender,c.name as cls_name from students as s inner join classes as c on s.cls_id=c.id;

– 建立上述結果的檢視( v_students ) create view v_students as select s.id,s.name,s.age,s.gender,c.name as cls_name from students as s inner join classes as c on s.cls_id=

c.id;

– 解決資料庫發生改變 python程式也需要改變的問題

– 刪除檢視 – drop view ; drop view xxx; – 注意 – 檢視只能進行搜尋

– 檢視作用總結

– 1 提高了重用性,就像一個函式 – 2 對資料庫重構,卻不影響已經編寫好的程式執行 – 3 提高了安全效能,可以對不同的使用者 – 4 讓資料更加清

– 檢視最主要解決的問題 – 程式對資料庫操作,一旦資料庫發生變化,程式需要修改,這時如果使用檢視就可以解決這個問題

– 事物(ACID)

-- 原子性 一致性
	第一步 開啟 終端1 終端2
	第二步 終端1 開啟事物 begin
		   終端1 update 表名 set 欄位="xxx" where ...;
		   終端1 select * from 表名;  發現數據改變
	第三步 終端2 select * from 表名;  
		   發現數據其實並沒有改變 其實這個時候對資料的相關操作資訊存在快取中,
		   當commit之後,這些操作才會一次性的完成
	第四步 終端1 commit 資料數資料真的改變
		   終端2 select * from 表名,資料改變了
		
-- 隔離性
	第一步 開啟 終端1 終端2
	第二步 終端1 開啟事物 begin
		   終端1 update 表名 set 欄位="xxx" where ...;
	第三步 終端2 update 表名 set 欄位="yyy" where ...;
		   發現 處於阻塞狀態 
	第四步 終端1 commit
		   終端2 阻塞狀態解除 資料修改成 yyy
		   
-- 回滾(rollback)
	第一步 開啟 終端1 begin
	第二步 終端1 update 表名 set 欄位="xxx" where ...;
	第三步 rollback 資料返回最開始的原始值



-- 永續性
	-- 一旦事務提交,則其所做的修改會永久儲存到資料庫
	
-- 注意 
	-- innodb能使用事物
	-- 使用python操作資料庫的時候 預設開啟事物的 
	-- 但是python對資料庫進行增刪改的時候 需要手動commit
	
	-- 使用終端操作資料庫(也就是mysql的客戶端)的時候 也是預設開始事物的
	-- 只是在回車確認操作的時候 終端會預設的commit 所以我們不需要commit

– 事物最主要解決的問題 – 某些事情需要一次性完成 中途不允許出現中斷 例如銀行取錢 事物可以解決這種問題

– 索引 – 注意 – 要注意的是,建立太多的索引將會影響更新和插入的速度,因為它需要同樣更新每個索引檔案。 – 對於一個經常需要更新和插入的表格,就沒有必要為一個很少使用的where字句單獨建立索引了, – 對於比較小的表,排序的開銷不會很大,也沒有必要建立另外的索引。

-- 建立索引會佔用磁碟空間

– 索引最主要解決的問題 – 當資料非常龐大時,並且這些資料不需要經常修改,為了加快查詢速度,我們會使用索引

– 許可權管理(瞭解) 對使用者的管理

-- 檢視有哪些賬戶
	1 使用root賬戶登入
	2 使用mysql資料庫
	3 使用者的資訊存放在 user 表中 
		-- select host,user,authentication_string from user;
			Host表示允許訪問的主機
			User表示使用者名稱
			authentication_string表示密碼,為加密後的值
		select host,user,authentication_string from user;
			
-- 建立賬戶、授權 
	
	-- 案例一
	1 使用root賬戶登入
	
	2 建立賬戶並授予所有許可權(部分許可權)
	-- grant 許可權列表 on 資料庫 to '使用者名稱'@'訪問主機' identified by '密碼';(語法格式)
	grant select on jing_dong.* to "laoli"@"localhost" identified by "123";
		
		-- 注意
		-- 1 訪問主機通常使用 百分號% 表示此賬戶可以使用任何ip的主機登入訪問此資料庫
		-- 2 訪問主機可以設定成 localhost 或具體的ip,表示只允許本機或特定主機訪問
		
	-- 檢視使用者有哪些許可權
	-- show grants for 使用者@訪問主機;
	show grants for [email protected];
		
	3 退出root的登入 使用laowang賬戶登入
	-- 使用查詢操作是可以的
	
	-- 使用其他操作是不可以的
		
		
	
	-- 案例二
	1 使用root賬戶登入
	
	2 建立賬戶並授予所有許可權(所有許可權)
		grant all privileges on jing_dong.* to "laoli"@"%" identified by "12345678"
		-- 注意 訪問連結設定成 % 十分危險 不要使用
		
		
	
	
	
-- 修改許可權
	1 使用root賬戶登入
	
	2 修改使用者許可權
	-- grant 許可權名稱 on 資料庫 to 賬戶@主機 with grant option;(語法格式)
	例:grant select,insert on jing_dong.* to [email protected] where grant option;
	
	3 重新整理許可權
		flush privileges;
		
-- 修改密碼
	1 使用root賬戶登入
	
	2 選擇mysql資料庫
	
	3 使用password()函式進行密碼加密 對user表進行修改
	-- update user set authentication_string=password('新密碼') where user='使用者名稱';(語法格式)
	
	例:update user set authentication_string=password('123') where user='laowang';
	
	
-- 刪除使用者
	1 使用root賬戶登入
	
	2 刪除使用者
		第一種方式  drop user '使用者名稱'@'主機';(語法格式)  解除安裝
		
					例:drop user 'laowang'@'localhost';
					
		第二種方式	delete from user where user='使用者名稱';(語法格式)  手動刪除
		
					例:delete from user where user='laowang';
					
					-- 操作結束之後需要重新整理許可權
					flush privileges
					
	-- 推薦使用語法1刪除使用者, 如果使用語法1刪除失敗,採用語法2方式


-- 遠端登入(謹慎使用)