MySQL之多表查詢自連接方式
一、引言
自連接,顧名思義就是自己連接自己。
自連接的語法結(jié)構(gòu):

表 A 別名 A join 表 A 別名 B ON 條件 ...;
注意:
- 1、這種語法有一個關(guān)鍵字:join
- 2、自連接查詢可以是內(nèi)連接的語法,可以是外連接的語法(當(dāng)然包括左外連接和右外連接)
接下來去工具 DataGrip 通過兩個需求去演示一下 自連接查詢 的語法。
二、實操
(0)兩張表的結(jié)構(gòu)以及數(shù)據(jù)展示
- 員工表 emp

- 部門表 dept

(1)查詢員工及其所屬領(lǐng)導(dǎo)的名字
1、分析
在表 emp 中沒有直接的表示出某某的直屬領(lǐng)導(dǎo)是誰,只有一個所屬領(lǐng)導(dǎo)id號(managerid)
而對于一個企業(yè)的領(lǐng)導(dǎo),它也是企業(yè)的員工。
表結(jié)構(gòu):emp。
單靠單表查詢是不可能完成所要的需求的。所以要對自己進(jìn)行子連接查詢。
把emp看成兩張表:員工表和領(lǐng)導(dǎo)表(仔細(xì)深思一下)

這就是它們之間的編寫思路
2、編寫SQL語句
/*類似于內(nèi)連接,有null 的值時沒有顯示*/ SELECT a.name,b.name FROM emp AS a JOIN emp AS b WHERE a.managerid=b.id;

(2)直詢所有員工emp及其領(lǐng)導(dǎo)的名字emp ,如果員工沒有領(lǐng)導(dǎo),也需要查詢出來。
1、分析
如果這個員工的字段 managerid = null ,也需要把這個員工查詢出來。
這時只能用到外連接
因為內(nèi)連接只能查詢到交集的數(shù)據(jù),外連接才會包含左表或者右表的數(shù)據(jù)
表結(jié)構(gòu):emp a , emp b
2、編寫SQL語句
/*查出直屬領(lǐng)導(dǎo)為 null 也要顯示*/ SELECT a.name AS '員工',b.name AS '領(lǐng)導(dǎo)' FROM emp AS a LEFT OUTER JOIN emp AS b ON a.managerid=b.id;

這樣就通過兩個自連接查詢完成兩個需求。
在自連接查詢的時候,一定注意要給表名起別名。
要不然我們會不清楚條件,以及返回的字段到底是哪一張表當(dāng)中的字段。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
windows下在一臺機(jī)器上安裝兩個MYSQL數(shù)據(jù)庫的方法
正常安裝第一個mysql,在控制面板里停止第一個mysql服務(wù),將C:\Program Files\MySQL目錄下的所有目錄和文件copy到另外一個路徑,我這里是copy到E盤2013-10-10
MySQL pt-query-digest從安裝到實戰(zhàn)的慢查詢優(yōu)化實戰(zhàn)指南
本文介紹了pt-query-digest工具的安裝、配置、核心原理和實戰(zhàn)應(yīng)用,包括慢查詢分析步驟、常見場景命令模板及使用技巧,通過合理配置和分析,能夠有效提升MySQL性能,感興趣的朋友跟隨小編一起看看吧2026-04-04
Mysql5.7中使用group concat函數(shù)數(shù)據(jù)被截斷的問題完美解決方法
前幾天在項目中遇到一個問題,使用 GROUP_CONCAT 函數(shù)select出來的數(shù)據(jù)被截斷了,最長長度不超過1024字節(jié),開始還以為是navicat客戶端自身對字段長度做了限制的問題。后來查找出原因,解決方法大家跟隨腳本之家小編一起看看吧2018-03-03

