SQL(七) - 事务、索引、视图
事務(Transaction)
3.1、什么是事務?
一個事務是一個完整的業務邏輯單元,不可再分。
比如:銀行賬戶轉賬,從A賬戶向B賬戶轉賬10000.需要執行兩條update語句:
update t_act set balance = balance - 10000 where actno = ‘act-001’;
update t_act set balance = balance + 10000 where actno = ‘act-002’;
以上兩條DML語句必須同時成功,或者同時失敗,不允許出現一條成功,一條失敗。
要想保證以上的兩條DML語句同時成功或者同時失敗,那么就需要使用數據庫的“事務機制”。
3.2、和事務相關的語句只有:DML語句。(insert delete update)
為什么?因為它們這三個語句都是和數據庫表當中的“數據”相關的。
事務的存在是為了保證數據的完整性,安全性。
3.3、假設所有的業務都能使用1條DML語句搞定,還需要事務機制嗎?
不需要事務。
但實際情況不是這樣的,通常一個“事兒(事務【業務】)”需要多條DML語句共同聯合完成。
3.4、事務的特性?
事務包括四大特性:ACID
- A: 原子性:事務是最小的工作單元,不可再分。
- C: 一致性:事務必須保證多條DML語句同時成功或者同時失敗。
- I:隔離性:事務A與事務B之間具有隔離。
- D:持久性:持久性說的是最終數據必須持久化到硬盤文件中,事務才算成功的結束。
事務中存在一些概念:
當執行DML語句是其實就是開啟一個事務
關于事務的回滾需要注意:只能回滾insert、delete和update語句,不能回滾select(回滾select沒有任何意義),對于create、drop、alter這些無法回滾.
事務只對DML有效果。
注意:rollback,或者commit后事務就結束了。回滾就是回到上一次提交的位置
關于事務之間的隔離性
事務隔離性存在隔離級別,理論上隔離級別包括4個:
第一級別:讀未提交(read uncommitted)
- 對方事務還沒有提交,我們當前事務可以讀取到對方未提交的數據。
- 讀未提交存在臟讀(Dirty Read)現象:表示讀到了臟的數據。
第二級別:讀已提交(read committed)
- 對方事務提交之后的數據我方可以讀取到。
- 這種隔離級別解決了: 臟讀現象沒有了
- 讀已提交存在的問題是:不可重復讀。
第三級別:可重復讀(repeatable read)
- 這種隔離級別解決了:不可重復讀問題。
- 這種隔離級別存在的問題是:讀取到的數據是幻象。
第四級別:序列化讀/串行化讀(serializable)
-
解決了所有問題。
-
效率低。需要事務排隊。
oracle數據庫默認的隔離級別是:讀已提交。mysql數據庫默認的隔離級別是:可重復讀。
索引
4.1、什么是索引?有什么用?
索引就相當于一本書的目錄,通過目錄可以快速的找到對應的資源。
在數據庫方面,查詢一張表的時候有兩種檢索方式:
第一種方式:全表掃描
第二種方式:根據索引檢索(效率很高)
4.5、查看sql語句的行計劃:
mysql> explain select ename,sal from emp where sal = 5000;給薪資sal字段添加索引:
create index emp_sal_index on emp(sal);重新查看sql語句的行計劃
explain select ename,sal from emp where sal = 5000;
刪除剛才創建的索引:
4.6、索引底層采用的數據結構是:B Tree
4.7、索引的實現原理?
-
通過B Tree縮小掃描范圍,底層索引進行了排序,分區,索引會攜帶數據在表中的“物理地址”,
-
最終通過索引檢索到數據之后,獲取到關聯的物理地址,通過物理地址定位表中的數據,效率是最高的。
select ename from emp where ename = ‘SMITH’;
通過索引轉換為:
select ename from emp where 物理地址 = 0x3;
4.8、索引的分類?
單一索引:給單個字段添加索引
復合索引: 給多個字段聯合起來添加1個索引
主鍵索引:主鍵上會自動添加索引
唯一索引:有unique約束的字段上會自動添加索引
…
4.9、索引什么時候失效?
select ename from emp where ename like '%A%';模糊查詢的時候,第一個通配符使用的是%,這個時候索引是失效的。
視圖(view)
5.1、什么是視圖?站在不同的角度去看到數據。(同一張表的數據,通過不同的角度去看待)。5.2、怎么創建視圖?怎么刪除視圖?create view myview as select empno,ename from emp;drop view myview;注意:只有DQL語句才能以視圖對象的方式創建出來。5.3、對視圖進行增刪改查,會影響到原表數據。(通過視圖影響原表數據的,不是直接操作的原表) 可以對視圖進行CRUD操作。5.4、面向視圖操作?mysql> select * from myview;+-------+--------+| empno | ename |+-------+--------+| 7369 | SMITH || 7499 | ALLEN || 7521 | WARD || 7566 | JONES || 7654 | MARTIN || 7698 | BLAKE || 7782 | CLARK || 7788 | SCOTT || 7839 | KING || 7844 | TURNER || 7876 | ADAMS || 7900 | JAMES || 7902 | FORD || 7934 | MILLER |+-------+--------+create table emp_bak as select * from emp;create view myview1 as select empno,ename,sal from emp_bak;update myview1 set ename='hehe',sal=1 where empno = 7369; // 通過視圖修改原表數據。delete from myview1 where empno = 7369; // 通過視圖刪除原表數據。5.5、視圖的作用?視圖可以隱藏表的實現細節。保密級別較高的系統,數據庫只對外提供相關的視圖,java程序員只對視圖對象進行CRUD。DBA命令
常用的命令DNA命令有:
新建用戶
授權
回收權限
數據導入導出(主要介紹)
6.1、將數據庫當中的數據導出
在windows的dos命令窗口中執行:(導出整個庫)
mysqldump bjpowernode>D:\bjpowernode.sql -uroot -p333
6.2、導入數據
create database bjpowernode;
use bjpowernode;
source D:\bjpowernode.sql
數據庫設計三范式(重點內容,面試經常問)
7.1、什么是設計范式?
設計表的依據。按照這個三范式設計的表不會出現數據冗余。
7.2、三范式都是哪些?第一范式:任何一張表都應該有主鍵,并且每一個字段原子性不可再分。第二范式:建立在第一范式的基礎之上,所有非主鍵字段完全依賴主鍵,不能產生部分依賴。多對多?三張表,關系表兩個外鍵。t_student學生表sno(pk) sname-------------------1 張三2 李四3 王五t_teacher 講師表tno(pk) tname---------------------1 王老師2 張老師3 李老師t_student_teacher_relation 學生講師關系表id(pk) sno(fk) tno(fk)----------------------------------1 1 32 1 13 2 24 2 35 3 16 3 3第三范式:建立在第二范式的基礎之上,所有非主鍵字段直接依賴主鍵,不能產生傳遞依賴。一對多?兩張表,多的表加外鍵。班級t_classcno(pk) cname--------------------------1 班級12 班級2學生t_studentsno(pk) sname classno(fk)---------------------------------------------101 張1 1102 張2 1103 張3 2104 張4 2105 張5 2提醒:在實際的開發中,以滿足客戶的需求為主,有的時候會拿冗余換執行速度。7.3、一對一怎么設計?一對一設計有兩種方案:主鍵共享t_user_login 用戶登錄表id(pk) username password--------------------------------------1 zs 1232 ls 456t_user_detail 用戶詳細信息表id(pk+fk) realname tel ....------------------------------------------------1 張三 11111111112 李四 1111415621一對一設計有兩種方案:外鍵唯一。t_user_login 用戶登錄表id(pk) username password--------------------------------------1 zs 1232 ls 456t_user_detail 用戶詳細信息表id(pk) realname tel userid(fk+unique)....-----------------------------------------------------------1 張三 1111111111 22 李四 1111415621 1總結
以上是生活随笔為你收集整理的SQL(七) - 事务、索引、视图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 猪肝汤的功效与作用、禁忌和食用方法
- 下一篇: BZOJ.3052.[WC2013]糖果