【MySQL】聯(lián)表查詢總結(jié)

聯(lián)表查詢在平時的項目中經(jīng)常遇到,總覺得理解的不是很透徹,這里簡單總結(jié)一下連表查詢的使用。

比方我們有如下兩張表:

  • EmployeeTB:
employee_id employee_name dept_id
0001 張三 01
0002 李四 01
0003 王五 02
0004 趙六 02
0005 鄭七 NULL
  • DeptTB
dept_id dept_name
01 技術(shù)部
02 市場部
03 工程部

從上面兩張表可以看出他們存在dept id為關(guān)聯(lián)的關(guān)系,所以就會存在如下需求:

  1. 找出EmployeeTB中員工與DeptTB中部門之間對應關(guān)系;

查詢方式有多種,下面就做簡單的概括:

  • 內(nèi)聯(lián)結(jié)查詢:

SELECT e.employee_id, e.employee_name, d.dept_name FROM EmployeeTB AS e, DeptTB AS d WHERE e.dept_id=d.dept_id;
SELECT e.employee_id, e.employee_name, d.dept_name FROM EmployeeTB AS e INNER JOIN DeptTB AS d ON e.dept_id=d.dept_id;

上面兩句查詢的效果是一樣的:

mysql> SELECT e.employee_id, e.employee_name, d.dept_name FROM EmployeeTB AS e,
DeptTB AS d WHERE e.dept_id=d.dept_id;
+-------------+---------------+------------+
| employee_id | employee_name | dept_name  |
+-------------+---------------+------------+
|           1 | zhangsan      | jishubu    |
|           2 | lisi          | jishubu    |
|           3 | wangwu        | shichangbu |
|           4 | zhaoliu       | shichangbu |
+-------------+---------------+------------+
4 rows in set (0.00 sec)
  • 外聯(lián)結(jié)查詢:

    • 1、左外聯(lián)結(jié):

如上面例子,有時候我們需要知道所有員工的信息,如果不屬于任何部門,則dept_name字段用NULL補充。此時,我們就可以采用左外聯(lián)結(jié)達到該效果:

SELECT e.employee_id, e.employee_name, d.dept_name FROM EmployeeTB AS e LEFT OUTER JOIN DeptTB AS d ON d.dept_id=e.dept_id;

查詢結(jié)果:

mysql> SELECT e.employee_id, e.employee_name, d.dept_name FROM EmployeeTB AS e L
EFT OUTER JOIN DeptTB AS d ON d.dept_id=e.dept_id;
+-------------+---------------+------------+
| employee_id | employee_name | dept_name  |
+-------------+---------------+------------+
|           1 | zhangsan      | jishubu    |
|           2 | lisi          | jishubu    |
|           3 | wangwu        | shichangbu |
|           4 | zhaoliu       | shichangbu |
|           5 | zhengqi       | NULL       |
+-------------+---------------+------------+
5 rows in set (0.00 sec)
  • 2、右外聯(lián)結(jié):

右外聯(lián)結(jié)查詢和左外聯(lián)結(jié)查詢中把兩張表的位置互換是一致的。讀者可以試試如下兩個查詢語句的執(zhí)行結(jié)果:

SELECT d.employee_id, d.employee_name, e.dept_name FROM DeptTB AS e LEFT OUTER JOIN EmployeeTB AS d ON d.dept_id=e.dept_id;
SELECT e.employee_id, e.employee_name, d.dept_name FROM EmployeeTB AS e RIGHT OUTER JOIN DeptTB AS d ON d.dept_id=e.dept_id;

查詢結(jié)果應該是如下的:

+-------------+---------------+-------------+
| employee_id | employee_name | dept_name   |
+-------------+---------------+-------------+
|           1 | zhangsan      | jishubu     |
|           2 | lisi          | jishubu     |
|           3 | wangwu        | shichangbu  |
|           4 | zhaoliu       | shichangbu  |
|        NULL | NULL          | gongchengbu |
+-------------+---------------+-------------+
5 rows in set (0.00 sec)
  • 3、完全外聯(lián)結(jié):

如果我們需要知道所有的記錄,不管部門下有沒有員工,員工有沒有所屬的部門,我們都需要檢索。那我們就需要用到完全外聯(lián)結(jié)查詢了。

SELECT e.employee_id, e.employee_name, d.dept_name FROM EmployeeTB AS e FULL OUTER JOIN DeptTB AS d ON d.dept_id=e.dept_id;

由于MYSQL目前不再支持完全外聯(lián)結(jié)查詢,可以使用如下方法實現(xiàn)相同的效果:

SELECT e.employee_id, e.employee_name, d.dept_name FROM EmployeeTB AS e LEFT OUTER JOIN DeptTB AS d ON d.dept_id=e.dept_id UNION SELECT e.employee_id, e.employee_name, d.dept_name FROM EmployeeTB AS e RIGHT OUTER JOIN DeptTB AS d ON d.dept_id=e.dept_id;
mysql> SELECT e.employee_id, e.employee_name, d.dept_name FROM EmployeeTB AS e L
EFT OUTER JOIN DeptTB AS d ON d.dept_id=e.dept_id UNION SELECT e.employee_id, e.
employee_name, d.dept_name FROM EmployeeTB AS e RIGHT OUTER JOIN DeptTB AS d ON
d.dept_id=e.dept_id;
+-------------+---------------+-------------+
| employee_id | employee_name | dept_name   |
+-------------+---------------+-------------+
|           1 | zhangsan      | jishubu     |
|           2 | lisi          | jishubu     |
|           3 | wangwu        | shichangbu  |
|           4 | zhaoliu       | shichangbu  |
|           5 | zhengqi       | NULL        |
|        NULL | NULL          | gongchengbu |
+-------------+---------------+-------------+
6 rows in set (0.01 sec)

參考資料:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 目錄 簡介 在Android中存儲數(shù)據(jù)有時會用到數(shù)據(jù)庫,Android給我們提供了 一系列的API來操作數(shù)據(jù)庫,非...
    慕涵盛華閱讀 1,147評論 1 2
  • mysql數(shù)據(jù)庫中 :database : 文件夾table : 數(shù)據(jù)表(數(shù)據(jù)文件) 進入mysqlmysql -...
    賦閑閱讀 643評論 0 0
  • 多表查詢有如下幾種: 合并結(jié)果集;UNION、UNION ALL 連接查詢 內(nèi)連接[INNER] JOINON 外...
    Michael_林閱讀 3,568評論 0 6
  • sql語句是數(shù)據(jù)庫很重要的一部分,這篇文章主要記錄了一些基本的sql語法,包括對數(shù)據(jù)庫的操作、對表的增刪改查、以及...
    devbird閱讀 533評論 0 3
  • Chapter 10 下午6點多,林沖又要拉著路小星去吃晚飯。不管后面那幾個人叨叨,“林沖是被打的腦袋壞了?以前...
    WJEXJ_Y閱讀 4,495評論 1 3

友情鏈接更多精彩內(nèi)容