SQL之JOIN連接的概念和優化

  • 目錄
  • 1. 前言
  • 2. JOIN的類型
  • 2.1 內連接INNER
  • 2.2 全外連接FULL OUTER
  • 2.3 左外連接 LEFT OUTER
  • 2.4 右外連接 RIGHT OUTER
  • 2.5 交叉連接 CROSS
  • 3. 使用join案例
  • 3.1 使用join更新多張表
  • 3.2 使用join優化子查詢
  • 3.3 使用join優化聚合子查詢
  • 4.總結

1.前言

使用join是SQL查詢裏較爲常用的命令,因此熟練掌握和理解是我們很有必要的。

2.JOIN的類型

JOIN有五種類型,分別是內連接INNER、全外連接FULL OUTER、左外連接 LEFT OUTER、右外連接 RIGHT OUTER、交叉連接 CROSS這五種類型

2.1 內連接INNER

內連接就是基於連接謂詞將兩張表的列組合起來產生新的結果表,結果集是兩張表的公共部分,如下圖所示:

2.2 全外連接FULL OUTER

全連接的意思是查詢A表和B表的全部數據或者無交集的數據,如下圖所示:

注意:mysql不支持全外連接,我們需要使用union all聯合查詢代替

我們可以根據左外連接和右外連接的隱藏交集的屬性特徵,進行無交集數據查詢,如上圖右圖,sql語句示例如下:

SELECT a.name,a.over,b.over
FROM user1 a
LEFT JOIN user2 b ON a.name=b.name
UNION ALL
SELECT b.name,b.over,a.over
FROM user1 a
RIGHT JOIN user2 b ON a.name=b.name

2.3 左外連接 LEFT OUTER

左外連接就是以A爲主要表基於連接謂詞將A表和B表有交集的部分顯示或者隱藏掉,如下圖所示:

2.4 右外連接 RIGHT OUTER

右外連接就是以B爲主要表基於連接謂詞將A表和B表有交集的部分顯示或者隱藏掉,如下圖所示:

2.5 交叉連接 CROSS

交叉連接又稱爲笛卡爾連接或者叉乘,如果A和B是兩個集合,他們的交叉連接就是AxB,sql語句如下:

SELECT a.name,a.over,b.name,b.over
FROM user1 a
CROSS JOIN user2 b

注意:在具體項目中避免使用笛卡爾積查詢

3.使用join案例

3.1 使用join更新多張表

一次性更新包含自身表和另一張表的同一字段

UPDATE user1 a JION 
(
SELECT b.`user_name`
FROM user1 a INNER JOIN user2 b
ON a.`user_name`=b.`user_name` 
) b ON a.user_name=b.user_name
SET a.over=xxx;

3.2 使用join優化子查詢

優化前:

SELECT a.user_name,a.`over`,(
SELECT over FROM user2 b
WHERE a.user_name=b.`user_name`)
AS over2
FROM user1 a;

優化後:

SELECT a.`user_name`,a.`over`,b.`over`
AS over2 
FROM user1 a
LEFT JOIN user2 
ON a.`user_name`=b.`user.name`;

以上兩條查詢結果相同,但是查詢時間有差異

3.3 使用join優化聚合子查詢

比如上表,我們要查出所有用戶中打怪最多的日期,怎麼查詢?

優化前:

SELECT a.user_name,b.timestr,b.kills
FROM user1 a 
JOIN user_kills b ON a.id= b.user_id
WHERE b.kills=(
SELECT MAX(c.kills) FROM user_kills c
WHERE c.user_id=b.user_id)

優化後:

SELECT a.user_name,b.timestr,b.kills
FROM user1 a
JOIN user_kills b ON a.id =b.user_id
JOIN user_likks c ON c.user_id =b.user_id
GROUP BY a.user_name,b.timestr,b.kills
HAVING b.kills=MAX(c.kills);

4.總結

JOIN命令是我們掌握SQL的高級命令之一,重要的是掌握優化思想,把一些效率低的SQL轉變成使用高級命令查詢的SQL。

 

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