SQL老黄牛
SQL進階
- 事務 transaction
- 特性ACID
- 隔離級別
- 事務處理
- 約束 constaints
- 表關聯 association
- 表的關系分為四種
- 創建表
- 多表聯查 join
- 笛卡爾積
- join
- 多表聯查案例
- 子查詢(嵌套查詢)
- 單行子查詢 =
- 多行子查詢 in
- 索引 index
- 索引分類
- 查看索引
- 創建普通索引
- 創建唯一索引
- 創建復合索引
- 刪除索引
- 為何索引快
- 優點
- 缺點
事務 transaction
數據庫事務(Database Transaction) 是指作為單個邏輯工作單元執行的一系列操作,要么完全地執行,要么完全地不執行
簡單來說:
事務就是將一堆的SQL語句(通常是增刪改)綁定在一起執行,要么都執行成功,要么都執行失敗,即都執行成功才算成功,否則這些SQL語句就會恢復到執行之前的狀態。
特性ACID
- 原子性 Atomicity
一個事務中的所有操作,要么全部成功,要么全部不成功,不會結束在中間某個環節。
事務在執行過程中如果發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。 - 一致性 Consistency
在事務開始之前和事務結束以后,數據庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規則,這包含資料的精確度、串聯性以及后續數據庫可以自發性地完成預定的工作。 - 隔離性 Isolation
數據庫允許多個并發事務同時對其數據進行讀寫和修改的能力,隔離性可以防止多個事務并發執行時由于交叉執行導致數據的不一致。 - 持久性 Durability
事務處理結束后,對數據的修改就是永久的,即便系統故障也不會丟失。
隔離級別
- 讀未提交 Read Uncommitted
安全性最差,可能發生并發數據問題,性能最好 - 讀提交 Read Committed
Oracle默認的隔離級別 - 可重復讀 Repeatable Read
MySQL默認的隔離級別,安全性較好,性能一般 - 串行化 Serializable
表級鎖,讀寫都加鎖,效率低下,安全性高,不能并發在
事務處理
- 在MySQL 中只有使用了 innodb 數據庫引擎的數據庫或表 才支持事務
- 事務處理可以用來維護數據的完整性,保證成批的SQL 語句要么全部執行,要么全部不執行
- 事務用來管理 insert、update、delete 語句,因為這些操作才會破壞數據,select 語句是不會的
- MySQL 默認數據庫的事務是開啟的,執行SQL后自動提價
- MySQL的事務也可以改成手動提交,那就有兩個步驟:
先開啟,寫完SQL 后,再手動提價。
開啟事務
start transaction; begin;結束事務
commit; -- 提交事務 rollback; -- 回滾事務約束 constaints
- 非空約束 not null
- 唯一約束 unique
- 主鍵約束 primary key
- 外鍵約束 foreign key
- 默認約束 default
- 檢查約束 check
表關聯 association
表的關系分為四種
- 一對一
QQ和QQ郵箱,員工和員工編號 - 一對多
部門和員工,用戶和訂單 - 多對一
員工和部門,訂單和用戶 - 多對多
老師和學生,老師和課程
創建表
- 表都以s結束,標識復數
- 字段多以表的首字母作為開頭,在多表聯查時,方便標識出哪個表的字段
多表聯查 join
笛卡爾積
select * from dept,emp;多表查詢都是先生成笛卡爾積,再進行數據的篩選過濾
join
- 內連接 inner join
- 左外連接 left join
- 右外連接 right join
多表聯查案例
案例: 列出research 部門下的所有員工的信息
select * from emp where deptno=(select deptno from dept where dname="research");使用 inner join 實現上面的案例
select d.dname,e.ename,e.job from emp e inner join dept d on e.deptno = d.deptno where d.dname = "research";select d.dname,e.ename,e.job
from emp e inner join dept d
on e.deptno = d.deptno
where d.dname = “research”;
- inner join 兩邊都對應有記錄的才展示,其他去掉
- left join 左邊表中的數據都出現,右邊沒有數據以null填充
- right join 右邊表中的數據都出現,左邊沒有數據以null填充
子查詢(嵌套查詢)
單行子查詢 =
select * from emp where deptno = (select deptno from emp where ename="tony"); --查詢tony所在的部門的所有人信息多行子查詢 in
select * from emp where job in("經理","員工"); select * from emp where job in(select job from emp where ename="leo");除了leo誰還從事該工作 select * from emp where job in(select distinct job from emp);索引 index
定義
索引是一種排好序的快速查找的數據結構,它幫助數據庫高效的進行數據的檢索。在數據之外,數據庫系統還維護著特定查找算法的數據結構(額外的存儲空間),這些數據結構以某種方式指向數據,這樣就可以在這些數據結構上實現高效的查找算法。這種數據結構就叫做索引。
一般來說索引本身也很大,不可能全部存儲在內存中,因此往往以索引文件的形式存放在磁盤中。目前大多索引都采用BTree樹方式構建。
索引分類
- 單值索引:
一個索引只包括一個列,一個表可以有多個列 - 唯一索引:
索引列的值必須是唯一,但允許有空值;主鍵會自動創建唯一索引 - 復合索引:
一個索引同時包含多列
查看索引
主鍵會自動創建索引
show index from dept創建普通索引
create index loc_index on dept(loc); alter table dept add index loc_index(loc);創建唯一索引
create unique index loc_unique_index on dept(loc); alter table dept add unique index loc_unique_index(loc);創建復合索引
create index emp_composite_index on emp(empno,ename); alter table emp add index emp_composite_index(empno,ename);刪除索引
alter table dept drop index loc_index為何索引快
首先,索引表是排序了,可以類似二分查找,非常有效的提高了查詢的速度。
先找到事先排序好的索引表中檢索查詢,找到其主鍵后,就直接定位到記錄所在位置,然后直接返回這條數據。
- 排序、tree結構、類似二分查找
- 索引表小
優點
- 索引是數據庫優化
- 表的主鍵會默認自動創建索引
- 每個字段都可以被索引
- 大量降低數據庫的IO磁盤讀寫成本,極大提高了檢索速度
- 索引事先對數據庫進行了排序,大大提高了查詢效率
缺點
- 索引本身也是一張表,該表保存了主鍵與索引字段,并指向實體表的記錄,所以索引列也要占用空間
- 索引表中的內容,在業務表中都有,數據是重復的,空間是浪費的
- 雖然索引大大提高了查詢的速度,但對數據的增、刪、改的操作需要更新索引表信息,如果數據量非常巨大,更新效率就很慢,因為更新表時,MySQL不僅要保存數據,也要保存一下索引文件
- 隨著業務的不斷變化,之前建立的索引可能不能滿足查詢需求,需要消耗我們的時間去更新索引
總結
- 上一篇: draw.io二次开发改造过程
- 下一篇: Symbol的基本使用