【SQL】JOIN 詳解

1 LEFT顽腾、INNER 和 RIGHT JOIN 原理

  • LEFT JOIN:以左表為主表际乘,返回所有左表的數(shù)據(jù)
  • INNER JOIN:返回兩張表的交集部分
  • RIGHT JOIN:以右表為主表,返回所有右表的數(shù)據(jù)
image.png

數(shù)據(jù)準備

# 創(chuàng)建表格 employees  并插入數(shù)據(jù)
CREATE TABLE employees (
  emp_id INT,
  emp_name STRING,
  dept_id INT
);
INSERT INTO employees VALUES 
  (1, 'John', 100),
  (2, 'Mike', 200),
  (3, 'Lisa', 100),
  (4, 'Sarah', 300);

# 創(chuàng)建表格 departments 并插入數(shù)據(jù)
CREATE TABLE departments (
  dept_id INT,
  dept_name STRING,
  location_id INT
);
INSERT INTO departments VALUES 
  (100, 'IT', 1),
  (200, 'Finance', 3),
  (300, 'HR', 1),
  (400, 'Marketing', 2);

# 創(chuàng)建表格 locations 并插入數(shù)據(jù)
CREATE TABLE locations (
  location_id INT,
  location STRING
);
INSERT INTO locations VALUES 
  (1, 'New York'),
  (2, 'London'),
  (3, 'Paris');

1.1 LEFT JOIN 示例

# Left Join
SELECT * 
FROM employees
LEFT JOIN departments ON employees.dept_id = departments.dept_id;

# 結(jié)果
+------+--------+-------+-------+----------+----------+
|emp_id|emp_name|dept_id|dept_id|dept_name |location_id |
+------+--------+-------+-------+----------+----------+
|1     |John    |100    |100    |IT        |1 |
|2     |Mike    |200    |200    |Finance   |3 |
|3     |Lisa    |100    |100    |IT        |1 |
|4     |Sarah   |300    |300    |HR        |1 | 
+------+--------+-------+-------+----------+----------+

1.2 INNER JOIN 示例

# INNER Join
SELECT * 
FROM employees
INNER JOIN departments ON employees.dept_id = departments.dept_id;

# 結(jié)果
+------+--------+-------+-------+----------+----------+
|emp_id|emp_name|dept_id|dept_id|dept_name |location_id |
+------+--------+-------+-------+----------+----------+
|1     |John    |100    |100    |IT        |1 |
|3     |Lisa    |100    |100    |IT        |1 |
|2     |Mike    |200    |200    |Finance   |3 |
|4     |Sarah   |300    |300    |HR        |1 |
+------+--------+-------+-------+----------+----------+

1.3 RIGHT JOIN 示例

# RIGHT Join
SELECT * 
FROM employees
RIGHT JOIN departments ON employees.dept_id = departments.dept_id;

# 結(jié)果
+------+--------+-------+-------+----------+----------+
|emp_id|emp_name|dept_id|dept_id|dept_name |location_id |
+------+--------+-------+-------+----------+----------+
|1     |John    |100    |100    |IT        |1 |
|3     |Lisa    |100    |100    |IT        |1 |
|2     |Mike    |200    |200    |Finance   |3 |
|4     |Sarah   |300    |300    |HR        |2 |
|NULL   |NULL   |NULL   |400    |Marketing      |2 |
+------+--------+-------+-------+----------+----------+


2.FULL OUTER衔肢、UNION ALL 和 CROSS JOIN 原理

  • FULL OUTER JOIN:全外連接庄岖,返回兩張表的并集
  • CROSS JOIN:返回的是兩張表的笛卡爾積
image.png

2.1 FULL OUTER JOIN 示例

# FULL OUTER Join
SELECT * 
FROM employees
FULL OUTER JOIN departments ON employees.dept_id = departments.dept_id;

# 結(jié)果
+------+--------+-------+-------+----------+----------+
|emp_id|emp_name|dept_id|dept_id|dept_name |location_id |
+------+--------+-------+-------+----------+----------+
|1     |John    |100    |100    |IT        |1 |
|3     |Lisa    |100    |100    |IT        |1 |
|2     |Mike    |200    |200    |Finance   |3 |
|4     |Sarah   |300    |300    |HR        |1 |
|NULL   |NULL   |NULL   |400    |Marketing |2 |
+------+--------+-------+-------+----------+----------+

2.2 CROSS JOIN 示例

說明:employees 表一共 4 行數(shù)據(jù),departments 表一共 4 行數(shù)據(jù)角骤,笛卡爾積后生成 4*4=16 行數(shù)據(jù)隅忿。

# CROSS Join
SELECT * 
FROM employees
CROSS JOIN departments;

# 結(jié)果
+------+--------+-------+-------+----------+
|emp_id|emp_name|dept_id|dept_id|dept_name |
+------+--------+-------+-------+----------+
|1     |John    |100    |100    |IT        |1 |
|1     |John    |100    |200    |Finance   |3 |
|1     |John    |100    |300    |HR        |1 |
|1     |John    |100    |400    |Marketing |2 |
|2     |Mike    |200    |100    |IT        |1 |
|2     |Mike    |200    |200    |Finance   |3 |
|2     |Mike    |200    |300    |HR        |1 |
|2     |Mike    |200    |400    |Marketing |2 |
|3     |Lisa    |100    |100    |IT        |1 |
|3     |Lisa    |100    |200    |Finance   |3 |
|3     |Lisa    |100    |300    |HR        |1 |
|3     |Lisa    |100    |400    |Marketing |2 |
|4     |Sarah   |300    |100    |IT        |1 |
|4     |Sarah   |300    |200    |Finance   |3 |
|4     |Sarah   |300    |300    |HR        |1 |
|4     |Sarah   |300    |400    |Marketing |2 |
+------+--------+-------+-------+----------+

3.連續(xù)多個 JOIN

# 連續(xù) 3 個表的 Join
SELECT * 
FROM employees e
LEFT JOIN departments d ON e.dept_id = d.dept_id
LEFT JOIN locations l ON d.location_id = l.location_id;


# 結(jié)果
+------+--------+-------+-------+----------+------------+---------+---------+
|emp_id|emp_name|dept_id|dept_id|dept_name |location_id |location_id |location |
+------+--------+-------+-------+----------+------------+---------+---------+
|1     |John    |100    |100     |IT      |1      |1      |New York    |  
|2     |Mike    |200    |200     |Finance |3      |3      |Paris       |
|3     |Lisa    |100    |100     |IT      |1      |1      |New York    |
|4     |Sarah   |300    |300     |HR      |1      |1      |New York    |
+------+--------+-------+-------+----------+------------+---------+---------+
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末心剥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子背桐,更是在濱河造成了極大的恐慌优烧,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件链峭,死亡現(xiàn)場離奇詭異畦娄,居然都是意外死亡,警方通過查閱死者的電腦和手機弊仪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門熙卡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人励饵,你說我怎么就攤上這事驳癌。” “怎么了曲横?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵喂柒,是天一觀的道長不瓶。 經(jīng)常有香客問我禾嫉,道長,這世上最難降的妖魔是什么蚊丐? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任熙参,我火速辦了婚禮,結(jié)果婚禮上麦备,老公的妹妹穿的比我還像新娘孽椰。我一直安慰自己,他們只是感情好凛篙,可當我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布黍匾。 她就那樣靜靜地躺著,像睡著了一般呛梆。 火紅的嫁衣襯著肌膚如雪锐涯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天填物,我揣著相機與錄音纹腌,去河邊找鬼。 笑死滞磺,一個胖子當著我的面吹牛升薯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播击困,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼涎劈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起责语,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤炮障,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后坤候,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胁赢,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年白筹,在試婚紗的時候發(fā)現(xiàn)自己被綠了智末。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡徒河,死狀恐怖系馆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情顽照,我是刑警寧澤由蘑,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站代兵,受9級特大地震影響尼酿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜植影,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一裳擎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧思币,春花似錦鹿响、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至博投,卻和暖如春绸贡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贬堵。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工恃轩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人黎做。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓叉跛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蒸殿。 傳聞我的和親對象是個殘疾皇子筷厘,可洞房花燭夜當晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載自 圖解 SQL 里的各種 JOIN 從業(yè)以來主要在做客戶端鸣峭,用到的數(shù)據(jù)庫都是表結(jié)構(gòu)比較簡單的 SQLite...
    kakukeme閱讀 706評論 0 49
  • SQL 最強大的功能之一就是能在數(shù)據(jù)檢索查詢的執(zhí)行中聯(lián)結(jié)(join)表。聯(lián)結(jié)是利用 SQL 的 SELECT 能執(zhí)...
    acc8226閱讀 294評論 0 0
  • 目錄 JOIN 簡介為何要將數(shù)據(jù)拆分為不同地表格?你的第一個JOINERD回顧鍵JOIN 回顧連接多個表格別名為何...
    IntoTheVoid閱讀 659評論 0 2
  • 一些數(shù)據(jù)庫之間是存在關(guān)聯(lián)的酥艳,編寫一個JOIN可以聯(lián)結(jié)多個不同的數(shù)據(jù)庫摊溶。 數(shù)據(jù)庫規(guī)范化 在創(chuàng)建數(shù)據(jù)庫時,一定要思考下...
    夏威夷的芒果閱讀 1,203評論 0 2
  • 從業(yè)以來主要在做客戶端充石,用到的數(shù)據(jù)庫都是表結(jié)構(gòu)比較簡單的 SQLite莫换,以我那還給老師一大半的 SQL 水平倒也能...
    灰色程序閱讀 3,493評論 0 13