SQL join(連接)- 左連接、右連接、內連接 &慢查詢(Join、explain)

SQL join(連接): 用於把來自兩個或多個表的行結合起來。

下圖展示了 LEFT JOIN、RIGHT JOIN、INNER JOIN、OUTER JOIN 相關的 7 種用法。

在這裏插入圖片描述

  • INNER JOIN:內連接,又叫等值連接,只返回兩個表中連接字段相等的行。
  • LEFT JOIN:即使右表中沒有匹配,也從左表返回所有的行,右邊爲空字段補null
  • RIGHT JOIN:即使左表中沒有匹配,也從右表返回所有的行,左邊爲空字段補null
  • FULL JOIN:外連接,返回兩個表中的行:left join + right join。
  • CROSS JOIN : 結果是笛卡爾積,就是第一個表的行數乘以第二個表的行數。

FULL OUTER JOIN 用法:

SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name=table2.column_name;

得到的結果數
inner join <= min(left join, right join)
full join >= max(left join, right join)
當 inner join < min(left join, right join) 時, full join > max(left join, right join)

表連接的邏輯

首先,連接的結果可以在邏輯上看作是由SELECT語句指定的列組成的新表

左連接與右連接的左右指的是以兩張表中的哪一張爲基準,它們都是外連接

外連接就好像是爲非基準表添加了一行全爲空值的萬能行,用來與基準表中找不到匹配的行進行匹配。假設兩個沒有空值的表進行左連接,左表是基準表,左表的所有行都出現在結果中,右表則可能因爲無法與基準表匹配而出現是空值的字段。

在使用 left join 時,on 和 where 條件的區別如下:

數據庫在通過連接兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然後再將這張臨時表返回給用戶。

  1. on 條件是在生成臨時表時使用的條件,它不管 on 中的條件是否爲真,都會返回左邊表中的記錄。
  2. where 條件是在臨時表生成好後,再對臨時表進行過濾的條件。這時已經沒有 left join 的含義(必須返回左邊表的記錄)了,條件不爲真的就全部過濾掉。

舉例說明:
A表(a1,b1,c1)
B表(a2,b2)

在這裏插入圖片描述
在這裏插入圖片描述

左連接

SELECT A.\*,B.\* FROM A left outer join on (A.a1 = B.a2);

結果:
在這裏插入圖片描述

右連接

SELECT A.\*,B.\* FROM A right outer join B on (A.a1 = B.a2);** 

結果:
在這裏插入圖片描述

內連接

從多個表中返回滿足 JOIN 條件的所有行。

SELECT A.\*,B.\* FROM A inner join B ON (A.a1 = B.a2);

自然連接

SELECT * FROM A,B WHERE A.a1 = B.a2;

結果:
在這裏插入圖片描述

union & union all

合併兩個或多個SQL語句的結果集(重複或不重複)
在這裏插入圖片描述

請注意,UNION 內部的每個 SELECT 語句必須擁有相同數量的列列也必須擁有相似的數據類型。同時,每個 SELECT 語句中的列的順序必須相同

SQL union用法:

SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;

默認地,UNION 操作符選取不同的值。如果允許重複的值,請使用 UNION ALL。

SQL union all用法:

SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;

UNION 結果集中的列名總是等於 UNION 中第一個 SELECT 語句中的列名。

使用UNION命令時需要注意,只能在最後使用一個ORDER BY命令,是將兩個查詢結果合在一起之後,再進行排序!絕對不能寫兩個ORDER BY命令。

另外,在使用ORDER BY排序時,注意兩個結果的別名保持一致,使用別名排序很方便。當然也可以使用列數。

ORDER BY 除了可以對指定的字段進行排序,還可以使用函數進行排序:

order by abs(a);

ORDER BY 只能當前 SQL 查詢結果進行排序,如要對 union all 出來的結果進行排序,需要先做集合。

select aa.* from 
(select country,name from websites where country = 'CN'
union all select country,app_name from apps where country='CN' ) aa
order by aa.name;

EXPLAIN

可以模擬優化器執行SQL查詢語句,從而指導MySQL是如何處理你的SQL語句的。可用來分析查詢語句或表結構的性能瓶頸。可以查看:

  1. 表的讀取順序
  2. 數據讀取操作的操作類型
  3. 哪些索引可以使用
  4. 哪些索引被實際使用
  5. 表之間的引用
  6. 每張表有多少行被優化器查詢

EXPLAIN用法

EXPLAIN SQL語句
例:EXPLAIN SELECT * FROM ‘Table’ LIMIT 3,5

  1. type:查詢使用類型 system > const > eq_ref > ref > range > index > all
  2. possible_keys:查詢涉及到的字段上若存在索引就會列出,但不一定會被用到
  3. key:實際查詢中用到的索引
  4. rows:查詢數據時掃描的行數,越少越好
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章