一、內鏈接:實現A∩Bmysql
select 字段列表 from A表 inner join B表 on 關聯條件 where 等其餘子句;
二、左外鏈接sql
#實現查詢結果是A select 字段列表 from A表 left join B表 on 關聯條件 where 等其餘子句; #實現A - A∩B select 字段列表 from A表 left join B表 on 關聯條件 where 從表關聯字段 is null and 等其餘子句;
三、右外鏈接數據庫
#實現查詢結果是B select 字段列表 from A表 right join B表 on 關聯條件 where 等其餘子句; #實現B - A∩B select 字段列表 from A表 right join B表 on 關聯條件 where 從表關聯字段 is null and 等其餘子句;
四、用union代替全外鏈接併發
#實現查詢結果是A∪B #用左外的A,union 右外的B select 字段列表 from A表 left join B表 on 關聯條件 where 等其餘子句 union select 字段列表 from A表 right join B表 on 關聯條件 where 等其餘子句; #實現A∪B - A∩B 或 (A - A∩B) ∪ (B - A∩B) #使用左外的 (A - A∩B) union 右外的(B - A∩B) select 字段列表 from A表 left join B表 on 關聯條件 where 從表關聯字段 is null and 等其餘子句 union select 字段列表 from A表 right join B表 on 關聯條件
UNION規則函數
UNION中的每一個查詢必須包含相同的列、表達式或彙集函數(不過,各個列不須要以相同的次序列出)。spa
列數據類型必須兼容:類型沒必要徹底相同,但必須是DBMS能夠隱含轉換的類型(例如,不一樣的數值類型或不一樣的日期類型)。code
實際上,UNION在須要組合多個表的數據時也頗有用,即便是有不匹配列名的表,在這種狀況下,能夠將UNION與別名組合,檢索一個結果集。blog
五、自鏈接:同一張表,經過取別名的方式來虛擬成兩張表排序
select 字段列表 from 表名 別名1 inner/left/right join 表名 別名2 on 別名1.關聯字段 = 別名2的關聯字段 where 其餘條件
(1)from:從哪些表中篩選事務
(2)where:從表中篩選的條件
(3)group by:分組依據
(4)having:在統計結果中再次篩選
(5)order by:排序
降序:desc 升序:要麼默認,要麼加asc
雖然ORDER BY子句彷佛只是最後一條SELECT語句的組成部分,但實際上DBMS將用它來排序全部SELECT語句返回的全部結果。
(6)limit:分頁
limit m,n
m = (第幾頁 - 1)*每頁的數量
n = 每頁的數量
可使用GROUP BY子句將表中的數據分紅若干組
在SELECT列表中,全部未包含在分組函數中的列都應該包含在 GROUP BY子句中
包含在 GROUP BY 子句中的列沒必要包含在SELECT 列表中
(1)where是從表中篩選的條件,而having是統計結果中再次篩選
(2)where後面不能加「分組/聚合函數」,而having後面能夠跟分組函數
嵌套在另外一個查詢中的查詢,做爲子查詢的SELECT語句只能查詢單個列。企圖檢索多個列將返回錯誤。
根據位置不一樣,分爲:
(1)where型
①子查詢是單值結果,那麼能夠對其使用(=,>等比較運算符)
②子查詢是多值結果,那麼可對其使用(【not】in(子查詢結果),或 >all(子查詢結果),或>=all(子查詢結果),<all(子查詢結果),<=all(子查詢結果),或 >any(子查詢結果),或>=any(子查詢結果),<any(子查詢結果),<=any(子查詢結果))
(2)from型
必須給子查詢取別名,即臨時表名,表的別名不要加「」和空格
表別名不只能用於WHERE子句,還能夠用於SELECT的列表、ORDER BY子句以及其餘語句部分。
表別名只在查詢執行中使用。與列別名不同,表別名不返回到客戶端。
(3)exists型
保證全部事務都做爲一個工做單元來執行,即便出現了故障,都不能改變這種執行方式。當在一個事務中執行多個操做時,要麼全部的事務都被提交(commit),那麼這些修改就永久地保存下來;要麼數據庫管理系統將放棄所做的全部修改,整個事務回滾(rollback)到最初狀態
事務的ACID屬性:
(1)原子性(Atomicity) 原子性是指事務是一個不可分割的工做單位,事務中的操做要麼都發生,要麼都不發生。
(2)一致性(Consistency) 事務必須使數據庫從一個一致性狀態變換到另一個一致性狀態。
(3)隔離性(Isolation) 事務的隔離性是指一個事務的執行不能被其餘事務干擾,即一個事務內部的操做及使用的數據對併發的其餘事務是隔離的,併發執行的各個事務之間不能互相干擾。
(4)持久性(Durability) 持久性是指一個事務一旦被提交,它對數據庫中數據的改變就是永久性的,接下來的其餘操做和數據庫故障不該該對其有任何影響
mysql默認是自動提交,執行一句就提交一句。
我想要手動提交事務:
接下來全部語句都必須手動提交,
commit; 或 rollback; 或發生異常;
直到我set autocommit=true;或從新鏈接,
不然它以後的語句所有都須要手動提交
(2)start transaction;
在自動提交模式下,單獨針對某一組sql開啓事務
一組sql語句
commit; 或 rollback;
髒讀: 對於兩個事務 T1, T2, T1 讀取了已經被 T2 更新但還沒有被提交的字段。 以後, 若 T2 回滾, T1讀取的內容就是臨時且無效的。
不可重複讀: 對於兩個事務T1, T2, T1 讀取了一個字段, 而後 T2 更新了該字段。 以後, T1再次讀取同一個字段, 值就不一樣了。
幻讀: 對於兩個事務T1, T2, T1 從一個表中讀取了一個字段, 而後 T2 在該表中插入了一些新的行。 以後, 若是 T1 再次讀取同一個表, 就會多出幾行。
數據庫事務的隔離性:數據庫系統必須具備隔離併發運行各個事務的能力, 使它們不會相互影響, 避免各類併發問題。
一個事務與其餘事務隔離的程度稱爲隔離級別。數據庫規定了多種事務隔離級別, 不一樣隔離級別對應不一樣的干擾程度, 隔離級別越高, 數據一致性就越好, 但併發性越弱。
Mysql 支持 4 種事務隔離級別。 Mysql 默認的事務隔離級別爲: REPEATABLE READ。在mysql中REPEATABLE READ的隔離級別也能夠避免幻讀了。
每啓動一個 mysql 程序, 就會得到一個單獨的數據庫鏈接。每一個數據庫鏈接都有一個全局變量 @@tx_isolation, 表示當前的事務隔離級別.
查看當前的隔離級別: SELECT @@tx_isolation;
查看全局的隔離級別: SELECT @@global.tx_isolation;
設置當前 mySQL 鏈接的隔離級別:
set tx_isolation ='repeatable-read';
設置數據庫系統的全局的隔離級別:
set global tx_isolation ='read-committed';
注意:這裏的隔離級別中間是減號,不是下劃線。
(1)IP+用戶名做爲身份驗證
(2)密碼
(1)全局(2)數據庫(3)表(4)字段
依次校驗權限,若是前面經過了,後面就不校驗了:
全局 > 數據庫 > 表 > 字段
注意:root@localhost,這個用戶始終保留全部的全局權限。
查看帳戶權限:
show grants for user@host;