資料庫檢視事務基礎
資料庫-檢視,事務
– 什麼是檢視? – 通俗的講,檢視就是一條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=
– 解決資料庫發生改變 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方式
-- 遠端登入(謹慎使用)