- 目錄
- 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。