Mysql基礎04-查詢

關聯查詢

1、內連接:實現A∩B

select 字段列表
from A表 inner join B表
on 關聯條件
where 等其他子句;

2、左外連接

#實現查詢結果是A
select 字段列表
from A表 left join B表
on 關聯條件
where 等其他子句;

#實現A - A∩B
select 字段列表
from A表 left join B表
on 關聯條件
where 從表關聯字段 is null and 等其他子句;

3、右外連接

#實現查詢結果是B
select 字段列表
from A表 right join B表
on 關聯條件
where 等其他子句;

#實現B -  A∩B
select 字段列表
from A表 right join B表
on 關聯條件
where 從表關聯字段 is null and 等其他子句;

4、用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中的每個查詢必須包含相同的列、表達式或聚集函數(不過,各個列不需要以相同的次序列出)。

列數據類型必須兼容:類型不必完全相同,但必須是DBMS可以隱含轉換的類型(例如,不同的數值類型或不同的日期類型)。

實際上,UNION在需要組合多個表的數據時也很有用,即使是有不匹配列名的表,在這種情況下,可以將UNION與別名組合,檢索一個結果集。

5、自連接:同一張表,通過取別名的方式來虛擬成兩張表

select 字段列表
from 表名 別名1 inner/left/right join 表名 別名2
on 別名1.關聯字段 = 別名2的關聯字段
where 其他條件

6大子句順序

(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與分組函數

可以使用GROUP BY子句將表中的數據分成若干組

在SELECT列表中,所有未包含在分組函數中的列都應該包含在 GROUP BY子句中

包含在 GROUP BY 子句中的列不必包含在SELECT 列表中

having與where的區別

(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默認是自動提交,執行一句就提交一句。

我想要手動提交事務:

(1)set autocommit=false;

接下來所有語句都必須手動提交,

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 再次讀取同一個表, 就會多出幾行。

  • 數據庫事務的隔離性:數據庫系統必須具有隔離併發運行各個事務的能力, 使它們不會相互影響, 避免各種併發問題。

  • 一個事務與其他事務隔離的程度稱爲隔離級別。數據庫規定了多種事務隔離級別, 不同隔離級別對應不同的干擾程度, 隔離級別越高, 數據一致性就越好, 但併發性越弱。

Oracle 支持的 2 種事務隔離級別:READ COMMITED, SERIALIZABLE。 Oracle 默認的事務隔離級別爲: READ COMMITED 。

Mysql 支持 4 種事務隔離級別。 Mysql 默認的事務隔離級別爲: REPEATABLE READ。在mysql中REPEATABLE READ的隔離級別也可以避免幻讀了。

在MySql中設置隔離級別

  • 每啓動一個 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)密碼

給每個用戶權限,4個權限級別:

(1)全局(2)數據庫(3)表(4)字段

依次校驗權限,如果前面通過了,後面就不校驗了:

全局 > 數據庫 > 表 > 字段

注意:root@localhost,這個用戶始終保留所有的全局權限。

查看賬戶權限:

show grants for user@host;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章