1.多表查詢的分類
1.1 內連接
????????在 MySQL 中,內連接(INNER JOIN)返回的是兩個表中滿足連接條件的記錄的交集。這個“交集”不是指整個表,而是指符合連接條件的行組合,也就是A表和B表中滿足我們使用on指定條件的記錄。圖中綠色部分
1.1.1 隱式內連接
? ? ? ? select 字段列表?from 表1 表1別名 , 表2? 表2別名? where 條件;
? ? ? ? 如果我們給表指定了別名,那么就不能使用原表明指定條件,只能使用別名。
1.1.2?顯式內連接
? ? ? ? select 字段列表 from 表1 inner join 表2 on 連接條件;
1.2 左外連接
? ? ? ? 顧名思義,左外連接的結果包含左表中的所有數據,也包括右表中滿足條件的數據,圖中的藍色和綠色部分,右表記錄不足的地方會填充為null
? ? ? ? 語句:select 字段列表 from 表名1 [別名] left? ?[outer]? ?join 表名2 [別名] on 連接條件;
1.3 右連接
? ? ? ? 右外連接的結果和左外連接相反,它包括右表中的所有數據和左表中滿足條件的數據,圖中的綠色和黃色部分,左表中不足的數據也會被填充為null
????????語句:select 字段列表 from 表名1 [別名] right? ?[outer]? ?join 表名2 [別名] on 連接條件;
左外連接和右外連接可以相互轉換,只需要調換表明出現的位置即可:
select 字段列表 from 表名1 [別名] right? ?[outer]? ?join 表名2 [別名] on 連接條件;
和下面的語句相同:
select 字段列表 from 表名2?[別名] left? ?[outer]? ?join 表名1??[別名] on 連接條件;
1.4 自連接
? ? ? ? 自連接就是做連接查詢的表是同一個,此時必須給表取別名區分
select 字段列表 from 表名1 [別名1] right? ?[outer]? ?join 表名1?[別名2] on 連接條件;
自連接可以是內連接,左連接和右連接
1.5 聯合查詢
? ? ? ? 用法:select語句1? ? union? [all]? ? ?select語句2?
添加 all 相當于把兩次查詢的結果直接組合起來,如果有記錄滿足兩個select語句的條件,那么它會出現兩次,如果不添加 all 則會去重,相同的記錄只出現一次。
兩次查詢的字段數和字段類型都必須相同,否則會報錯。
1.6 子查詢
1.6.1 標量子查詢
? ? ? ? 標量子查詢是指子查詢的返回值只有一個值,使用的操作符通常是 = , <> , >, <? ,<=,? >=
1.6.2 列子查詢
如果是查詢任意一人,那么可以any和some,它們的效果是一樣的
1.6.3 行子查詢
1.6.4 表子查詢
? ? ? ? 表子查詢的返回值是多行多列,可以出現在from后,我們可以把他理解成一個虛擬表,我們從這個虛擬表中查詢數據,也可以出現在where后,此時我們使用in查詢滿足條件的記錄
2.事務
2.1 事務簡介
? ? ? ? 事務是一組操作的集合,這組操作必須全部成功或者全部失敗。比如銀行轉賬的步驟:A賬戶扣錢,B賬戶加錢 這兩步操作必須全部成功或者失敗,不能單獨某一步成功或失敗。
2.2 通過@@autocommit實現事務
-- 查詢事務是否自動提交 1:自動提交 0:手動提交
select @@autocommit;-- 設置事務為手動提交
set @@autocommit = 0;update student set name='333' where id=1;delete; -- 模擬程序運行錯誤update student set name='444' where id=2;-- 提交事務,在整體流程完成后
commit;-- 回滾事務,在流程出錯后必須執行!
rollback;
2.3 通過 begin 或 start transaction
start transaction ; -- 也可以是 begin
update student set name='333' where id=1;
delete; -- 模擬程序運行錯誤
update student set name='444' where id=2;-- 提交事務,在整體流程完成后
commit;-- 回滾事務,在流程出錯后必須執行!
rollback;
2.4 事務的四大特性
2.4.1 原子性
? ? ? ? 原子性的意思是事務是不可分割的最小單元,要么全部成功,要么全部失敗
2.4.2 一致性
? ? ? ? 事務完成時,必須使所有的數據保持一致
2.4.3 隔離性
? ? ? ? 數據庫系統提供的隔離機制,保證事務在不受外部并發操作的影響下執行。
2.4.4 持久性
? ? ? ? 事務在提交后,對數據庫的影響是永久的
2.5 并發事務的問題(臟讀,幻讀,不可重復讀)
2.6 事務隔離的級別
read uncommitted的意思是 讀未提交,此時事務可以讀取到另一并發事務未提交的內容,所以會出現臟讀,幻讀,不可重復讀得問題
read committed意思是 讀已提交,顧名思義,只能讀取并發事務已經提交的數據,也就解決了臟讀的問題,但幻讀和不可重復讀問題依舊存在
repeatable read意思是 重復讀 ,在read committed的基礎上解決了不可重復讀的問題,也是mysql默認的事務隔離級別。
serializable意思是串行化的,也就是直接禁止了事務的并發執行,讓事務串行執行,也就解決了所有的問題,但是效率比較低。