搜尋
首頁資料庫mysql教程MySQL中資料表的外接連線怎麼使用

為什麼要使用外部連接

在解釋為什麼使用 “外部連接” 之前,先來看一個記錄。 (如下:)

MySQL中資料表的外接連線怎麼使用

針對表中的張三沒有所屬的部門編號,我們暫且將他歸類為 「臨時工」 ,沒有固定的部門編制。

介於如此的場景,那麼問題就出現了。當我們想要查詢每位員工和他所屬的部門的名稱時,在使用內連結的情況下,因為我們的連結條件是` 「員工表」 的「部門編號」 = “部門表” 的「部門編號」 ,就會將「張三」 漏掉。雖然說 “張三” 沒有 “部門編號” ,但是他作為 “臨時工” 也是公司的一員, 所以要引入外連接的語法才能解決這個問題,否則就會丟失一些符合邏輯的數據。

外部連接簡介

外連接與內連接的區別:

內連接的結果接中只會出現符合連接條件的記錄,不符合連接條件的記錄是絕對不會出現在結果集裡面的。

無論是否滿足資料連接條件,外部連接都會以特殊的方式顯示在結果集中。 (就例如上文提到的查詢員工部門標號信息,因為“張三” 沒有部門編號,如果使用內連接,則“張三” 就不符合“連接條件”,也就不會出現在結果集裡面;換做「外連接」就不會漏掉了。)

外連接例句如下

SELECT 
	e.empno, e.ename, d.dname
FROM
	t_emp e
LEFT JOIN t_dept d ON e.deptno = d.deptno;

-- 在连接的时候仍然是链接 "员工表" 与 "部门表" ,只不过连接关键字由 "JOIN" 变成了 "LEFT JOIN" (下文再为大家详细解释)
-- 两张表的连接条件还是使用 "ON" 关键字去连接的 , 连接条件依然是 "员工表" 的 "部门编号" = "部门表" 的 "部门编号" 

-- LEFT JOIN 为 "外连接" 的 "左外连接" ;(在 "外连接" 中,是分为 "左外连接" 与 "右外连接" 的)

-- 在该SQL语句中 "LEFT JOIN" 左右各有数据表  "t_emp e" 与 "t_dept d" 
-- 所以这里的 "左连接" 的意思就是:保留 左表 的所有记录,然后与 右表 去连接,如果 右表 有符合条件的记录,则正常连接即可;
-- 如果 右表 没有符合条件的连接记录, 右表 则展示 "NULL" 值与 "左表" 去匹配

MySQL中資料表的外接連線怎麼使用

左連接與右連接

「左外連接」是指連接操作時,保留左邊表的所有記錄並與右邊表做連接。左表將與右表連接,如果右表中存在符合條件的記錄;如果右表中不存在符合條件的記錄,則用「NULL」連接左表。

區別於“左連接” 的就是“右連接”,“右連接” 與“左連接” 相反,是保留右表的所有記錄與左表的符合條件的記錄進行連接;同樣的,如果左表沒有符合條件的記錄,就用「NULL」 與右表連接。

右邊連接SQL 語句範例:

SELECT 
	e.empno, e.ename, d.dname
FROM
	t_dept d
RIGHT JOIN t_emp e ON e.deptno = d.deptno;

-- 这里有个需要注意的地方,就是相较于上文中的 "左连接" ,这里的 "右连接" 左右两张的表的位置做了调换

MySQL中資料表的外接連線怎麼使用

#在這裡,大家可以看到,仍然可以查出來“張三” 的沒有“部門編號”的記錄。所以說 “左連接” 與 “右連接” 的差別並不是很大。

外部連結練習①

查詢每個部門的名稱和部門的人數?

這題看似簡單,但是裡面存在著兩個難點,而且也存在容易出錯的地方,詳見下文 SQL 語句範例,與示意圖。

SELECT 
    d.deptno, d.dname, COUNT(*)
FROM
    t_dept d LEFT JOIN t_emp e 
ON d.deptno = e.deptno
GROUP BY d.deptno;

MySQL中資料表的外接連線怎麼使用

OK,問題就在這裡開始出現了。

大家注意到這裡的「40」 - 「OPERATIONS」 部門,這個部門其實是沒有人的,也就是人數為「0」 ,但是奇怪的是,這裡進行統計的時候,卻出現了統計人數「1」 ,這是為什麼呢?

這是因為我們在使用分組的時候,用的是「左連接」 ,保留了左表的所有的數據,所以就按照左表的“deptno” 進行分組。 (因為是保留了左表的記錄,所以分組也需要按照左表進行分組。接下來的關鍵在於“COUNT(*)”,它會統計所有有效記錄的數量。所以當左表“t_dept” 的所有記錄與右表“t_emp” 進行連接的時候,右表會使用"NULL"值與左表“t_dept” 連接,連接完之後就是一條有效的記錄,如此既然是有效記錄,那麼“COUNT(*)”統計到的結果就是「1」。

所以,如此統計到40 部門的統計結果為「1」 ,也是情有可原的,但是這個結果並不是我們想要的,要怎麼去解決呢?參考下方的SQL 語句。

SELECT 
    d.deptno, d.dname, COUNT(e.deptno)
FROM
    t_dept d LEFT JOIN t_emp e 
ON d.deptno = e.deptno
GROUP BY d.deptno;

MySQL中資料表的外接連線怎麼使用

這個SQL 語句還是非常不錯的,有非常多的細節與未考慮到的情況,只有真正寫一遍的時候才能會注意到這些攻擊。

外連接練習②

檢索部門名稱和人數,對於沒有部門的員工,用「NULL」代替部門名稱。(這裡其實就是指的"張三")

可能這裡會覺得剛剛使用的是"左外連接" 保留的部門表中所有的記錄,這裡直接換成"右" 外連接不就行了麼?其實.. .沒那麼簡單。

這個練習的SQL 語句需要使用到"UNION"關鍵字去實現,利用"UNION" 關鍵字將多個查詢語句的結果集進行並集的合併處理(排除重複內容)。

"UNION"关键字 在 SQL 语句中的用法如下:

(SQL查询语句) UNION (SQL查询语句)         -- 如果存在多条查询语句的话,可以继续使用 UNION 关键字 连接

PS:这里需要注意一下,“UNION” 合并多少个结果集其实无所谓,关键是这些结果集的字段数量和字段的名称必须要相同 。如果说第一个 SQL 查询语句返回的是 10个 字段,第二个返回的是 2个字段 ,这种情况是完全没办法合并的。

(SELECT 
	d.deptno, d.dname, COUNT(e.deptno)
FROM
	t_dept d LEFT JOIN t_emp e 
ON d.deptno = e.deptno
GROUP BY d.deptno)
UNION
(SELECT 
	d.deptno, d.dname, COUNT(*)
FROM
	t_dept d RIGHT JOIN t_emp e 
ON d.deptno = e.deptno
GROUP BY d.deptno);

-- 第一个查询语句,得到的结果集是各个部门的人数。
-- 第二个查询语句,得到的结果集是隶属于各个部门的人数,但是因为 "张三" 是一个没有部门所属的 "临时工"
-- 所以两个查询语句的结果集合并之下没救如下图所示。

MySQL中資料表的外接連線怎麼使用

以上是MySQL中資料表的外接連線怎麼使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:亿速云。如有侵權,請聯絡admin@php.cn刪除
MySQL中的存儲過程是什麼?MySQL中的存儲過程是什麼?May 01, 2025 am 12:27 AM

存儲過程是MySQL中的預編譯SQL語句集合,用於提高性能和簡化複雜操作。 1.提高性能:首次編譯後,後續調用無需重新編譯。 2.提高安全性:通過權限控制限制數據表訪問。 3.簡化複雜操作:將多條SQL語句組合,簡化應用層邏輯。

查詢緩存如何在MySQL中工作?查詢緩存如何在MySQL中工作?May 01, 2025 am 12:26 AM

MySQL查詢緩存的工作原理是通過存儲SELECT查詢的結果,當相同查詢再次執行時,直接返回緩存結果。 1)查詢緩存提高數據庫讀取性能,通過哈希值查找緩存結果。 2)配置簡單,在MySQL配置文件中設置query_cache_type和query_cache_size。 3)使用SQL_NO_CACHE關鍵字可以禁用特定查詢的緩存。 4)在高頻更新環境中,查詢緩存可能導致性能瓶頸,需通過監控和調整參數優化使用。

與其他關係數據庫相比,使用MySQL的優點是什麼?與其他關係數據庫相比,使用MySQL的優點是什麼?May 01, 2025 am 12:18 AM

MySQL被廣泛應用於各種項目中的原因包括:1.高性能與可擴展性,支持多種存儲引擎;2.易於使用和維護,配置簡單且工具豐富;3.豐富的生態系統,吸引大量社區和第三方工具支持;4.跨平台支持,適用於多種操作系統。

您如何處理MySQL中的數據庫升級?您如何處理MySQL中的數據庫升級?Apr 30, 2025 am 12:28 AM

MySQL數據庫升級的步驟包括:1.備份數據庫,2.停止當前MySQL服務,3.安裝新版本MySQL,4.啟動新版本MySQL服務,5.恢復數據庫。升級過程需注意兼容性問題,並可使用高級工具如PerconaToolkit進行測試和優化。

您可以使用MySQL的不同備份策略是什麼?您可以使用MySQL的不同備份策略是什麼?Apr 30, 2025 am 12:28 AM

MySQL備份策略包括邏輯備份、物理備份、增量備份、基於復制的備份和雲備份。 1.邏輯備份使用mysqldump導出數據庫結構和數據,適合小型數據庫和版本遷移。 2.物理備份通過複製數據文件,速度快且全面,但需數據庫一致性。 3.增量備份利用二進制日誌記錄變化,適用於大型數據庫。 4.基於復制的備份通過從服務器備份,減少對生產系統的影響。 5.雲備份如AmazonRDS提供自動化解決方案,但成本和控制需考慮。選擇策略時應考慮數據庫大小、停機容忍度、恢復時間和恢復點目標。

什麼是mySQL聚類?什麼是mySQL聚類?Apr 30, 2025 am 12:28 AM

MySQLclusteringenhancesdatabaserobustnessandscalabilitybydistributingdataacrossmultiplenodes.ItusestheNDBenginefordatareplicationandfaulttolerance,ensuringhighavailability.Setupinvolvesconfiguringmanagement,data,andSQLnodes,withcarefulmonitoringandpe

如何優化數據庫架構設計以在MySQL中的性能?如何優化數據庫架構設計以在MySQL中的性能?Apr 30, 2025 am 12:27 AM

在MySQL中優化數據庫模式設計可通過以下步驟提升性能:1.索引優化:在常用查詢列上創建索引,平衡查詢和插入更新的開銷。 2.表結構優化:通過規範化或反規範化減少數據冗餘,提高訪問效率。 3.數據類型選擇:使用合適的數據類型,如INT替代VARCHAR,減少存儲空間。 4.分區和分錶:對於大數據量,使用分區和分錶分散數據,提升查詢和維護效率。

您如何優化MySQL性能?您如何優化MySQL性能?Apr 30, 2025 am 12:26 AM

tooptimizemysqlperformance,lofterTheSeSteps:1)inasemproperIndexingTospeedUpqueries,2)使用ExplaintplaintoAnalyzeandoptimizequeryPerformance,3)ActiveServerConfigurationStersLikeTlikeTlikeTlikeIkeLikeIkeIkeLikeIkeLikeIkeLikeIkeLikeNodb_buffer_pool_sizizeandmax_connections,4)

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器