SQL JOIN 全解析:用 `users` 與 `orders` 表徹底掌握內連接、左連接、右連接

SQL JOIN 全解析:用 usersorders 表徹底掌握內連接、左連接、右連接

在日常開發中,SQL 的連接(JOIN)語句是數據庫查詢的核心技能。尤其在多表聯合查詢時,不掌握好 INNER JOINLEFT JOINRIGHT JOIN,你就很容易寫出“行數膨脹”、數據丟失、NULL 滿天飛的奇怪結果。

本文將用兩張簡單的表 users(用戶)和 orders(訂單)作為例子,深入講解三種常見的連接方式。


一、準備工作:建表與數據

我們先創建兩張表并插入一些測試數據。

表結構:

-- 用戶表:左表
CREATE TABLE users (id INT PRIMARY KEY,name VARCHAR(50)
);-- 訂單表:右表
CREATE TABLE orders (id INT PRIMARY KEY,user_id INT,item VARCHAR(100),FOREIGN KEY (user_id) REFERENCES users(id)
);

示例數據:

-- 插入用戶數據
INSERT INTO users (id, name) VALUES
(1, '孫悟空'),
(2, '蘇有朋'),
(3, '李白'),
(4, '趙云'),
(5, '諸葛亮');-- 插入訂單數據
INSERT INTO orders (id, user_id, item) VALUES
(101, 1, '金箍棒'),
(102, 2, '琵琶'),
(103, 1, '筋斗云'),
(104, 99, '無主之劍');  -- 注意:user_id=99 不存在于 users 中

二、INNER JOIN:內連接

SELECT a.id, a.name, b.item
FROM users a
INNER JOIN orders b ON a.id = b.user_id;

結果:

idnameitem
1孫悟空金箍棒
2蘇有朋琵琶
1孫悟空筋斗云

特點:

  • 只保留能成功匹配的記錄。
  • user_id=99 的訂單匹配不到 → 被排除。
  • 李白趙云諸葛亮沒下單 → 被排除。
  • 孫悟空有兩個訂單 → 出現兩次。

總結一句話:

內連接 = 兩邊都有才要。


三、LEFT JOIN:左連接

SELECT a.id, a.name, b.item
FROM users a
LEFT JOIN orders b ON a.id = b.user_id;

結果:

idnameitem
1孫悟空金箍棒
1孫悟空筋斗云
2蘇有朋琵琶
3李白NULL
4趙云NULL
5諸葛亮NULL

特點:

  • 保留所有左表(users)數據
  • 匹配不到的訂單信息 → 填充為 NULL
  • user_id=99 的訂單仍然被丟棄。

總結一句話:

左連接 = 左邊全保,右邊能連就連,不能連就補 NULL。


四、RIGHT JOIN:右連接

SELECT a.id, a.name, b.item
FROM users a
RIGHT JOIN orders b ON a.id = b.user_id;

結果:

idnameitem
1孫悟空金箍棒
1孫悟空筋斗云
2蘇有朋琵琶
NULLNULL無主之劍

特點:

  • 保留所有右表(orders)數據
  • 匹配不到的用戶信息 → 補 NULL
  • user_id=99 沒用戶匹配 → 仍然出現在結果中。

總結一句話:

右連接 = 右邊全保,左邊對不上就補 NULL。


五、膨脹現象:JOIN 會讓行數增加嗎?

是的!比如:

SELECT a.*, b.*
FROM users a
LEFT JOIN orders b ON a.id = b.user_id;

你可能以為每個用戶只出現一行,結果 孫悟空 出現了兩次。

原因:

  • JOIN 會對滿足條件的所有組合都生成結果。
  • 孫悟空有兩個訂單 → 出現兩行。
  • 趙云沒下單 → 也會保留一行(item=NULL)。

小貼士:

連接時不是“找一個就停”,而是“所有匹配的都拿出來”。


六、常見場景推薦

場景推薦 JOIN
只看有訂單的用戶INNER JOIN
列出所有用戶 + 他們的訂單情況LEFT JOIN
列出所有訂單 + 是否找到下單用戶RIGHT JOIN
查出哪些用戶沒有下單LEFT JOIN + WHERE b.id IS NULL

示例:

SELECT a.id, a.name
FROM users a
LEFT JOIN orders b ON a.id = b.user_id
WHERE b.id IS NULL;

結語

  • JOIN 本質上是“表之間的行配對”,不只是挑字段而已。
  • 行數會膨脹,尤其是一對多、多對多連接時尤為明顯。
  • 熟練掌握 JOIN,才能寫出既高效又準確的 SQL 查詢。

一圖了解JOIN

在這里插入圖片描述

參考鏈接

  • SQL Joins Visualizer
    一目了然地展示各種 JOIN 類型行為。

  • LeetCode SQL Tutorial(JOIN 練習)
    通過實戰題目鞏固 JOIN 和子查詢等知識點。

  • W3Schools:SQL JOIN
    基礎入門首選,配有圖解和在線練習。

  • MySQL JOIN 語法官方文檔
    官方介紹各種 JOIN 的語法規則和性能提示。

  • PostgreSQL JOIN Types
    PostgreSQL 對 JOIN 的詳細描述,適用于所有標準 SQL 數據庫。

  • Join Data In SQL

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/92742.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/92742.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/92742.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

(一)從零搭建unity3d機械臂仿真-unity3d導入urdf模型

1.新建工程并加載模型 (1)unity中新建3d工程 (2)將機器人模型導入到unity3d中 導入開源Unity-Robotics-Hub的機械臂。 詳細操作參考視頻 ROS Unity URDF Import Testing Robot Motion 使用 URDF Importer工具 在 Unity 中&#x…

Linux之網絡部分-應用層自定義協議與序列化

一、應用層 1.1、理解協議 協議是一種 "約定". socket api 的接口, 在讀寫數據時, 都是按 "字符串" 的方式來發送接收的。如果我們要傳輸一些 "結構化的數據" 怎么辦呢? 其實,協議就是雙方約定好的結構化的數據。 1.2、網絡版計…

機器學習week3-分類、正則化

1. 邏輯回歸1.1. 線性回歸 vs 邏輯回歸對比維度線性回歸邏輯回歸任務類型回歸(預測連續值)分類(預測離散類別)輸出范圍(?∞,∞)[0,1](概率值)損失函數均方誤差(MSE)對數損失&#x…

FastAdmin 中生成插件

在 FastAdmin 中生成一個 OCR 發票識別插件,可以按照以下步驟進行開發。這里假設你已經熟悉 FastAdmin 插件開發的基本流程,并會使用 Composer 和 PHP 擴展。1. 創建插件骨架使用 FastAdmin 命令行工具生成插件基礎結構:php think addon -a o…

DevExpress WinForms中文教程:Grouping(分組)- 如何自定義分組算法?

DevExpress WinForms擁有180組件和UI庫,能為Windows Forms平臺創建具有影響力的業務解決方案。DevExpress WinForms能完美構建流暢、美觀且易于使用的應用程序,無論是Office風格的界面,還是分析處理大批量的業務數據,它都能輕松勝…

PHP 與 Vue.js 結合的前后端分離架構

PHP 與 Vue.js 結合是構建現代 Web 應用的流行技術棧,通常采用 前后端分離架構。以下是關鍵要點和推薦實現方案: 一、技術棧組合 角色技術選項后端 (PHP)Laravel (推薦)、Symfony、CodeIgniter前端 (Vue)Vue 2/3、Vue Router、Pinia/Vuex、Vite通信協議…

XML高效處理類 - 專為Office文檔XML處理優化

/**** 提供XML讀取、寫入、修改、查詢等高級功能,支持命名空間和復雜XML結構* * 主要功能:* 1. 復雜路徑解析(支持屬性篩選、索引、通配符)* 2. 完整節點類型支持(元素、文本、CDATA、注釋、PI)* 3. 高效元…

星慈光編程蟲2號小車講解第一篇--向前向后

星慈光編程蟲2號小車是一款基于微控制器(如Arduino)的編程教學小車,常用于學習機器人控制和編程基礎。本講解將重點介紹小車的基本運動:前進、后退、左轉和右轉。這些運動通過控制電機實現,通常涉及調整電機的方向和速…

iOS 加固工具有哪些?快速發布團隊的實戰方案

在當今快速迭代的 iOS 開發環境中,團隊需要在高頻上線與應用安全之間找到平衡。快速發布不應犧牲安全性,而安全加固也不應成為阻礙上線的瓶頸。這就要求開發者在加固工具的選型與流程設計上,做到既高效又可靠。 那么,iOS 加固工具…

結構型模式-架構解耦與擴展實踐

結構型模式聚焦于對象間的組合關系,通過優化類與對象的裝配方式,實現系統的靈活性與可擴展性。在分布式系統中,由于多節點協作、跨網絡通信及異構環境集成等特性,傳統結構型模式需進行適應性改造,以應對分布式特有的復…

scratch筆記和練習-第三課

角色的大小變化 亮度等特效設置 流程圖圖形符號 Figma攻略:26個流行流程圖符號及其解釋 練習 實現在閃動10次后角色緩緩變回原形

Redis MCP 安裝與配置完整指南

一、Redis MCP 簡介 Redis MCP (Managed Control Plane) 是一個獨立于 Redis 服務運行的管理控制平臺,用戶可通過該平臺快速高效地管理和配置 Redis 實例。Redis MCP 可配合開源 Redis 或 Redis Cloud 使用。 二、安裝 Redis MCP 服務 Redis MCP 提供多種安裝方式&a…

Spring Boot配置文件加載全指南:從基礎到Spring Cloud集成

??? ??一、核心概念? 配置文件默認存在加載順序優先級主要用途必需依賴bootstrap.yml? 無1(最先)最高Spring Cloud上下文初始化spring-cloud-starter-bootstrapbootstrap.properties? 無1(略高于.yml)最高同上同上application.yml? 自動創建2中等應用核心配置無appl…

Python通關秘籍(六)數據結構——字典

前文復習 五、數據結構 5.1 列表(List) 列表是一種有序的可變數據集合,可以包含不同類型的元素。

自學嵌入式 day33 TCP、HTTP協議(超文本傳輸協議)

6、黏包問題(1)、原因:發送方發送數據太快或者接收方接收數據太慢,導致數據在緩沖區緩存。(2)、解決方法:①發送指定大小數據(結構體)問題:結構體對齊問題&am…

LinuxShell 的 Here-Document(<< EOF) 筆記250723

LinuxShell 的 Here-Document(<< EOF) 筆記250723 Here-Document(<< EOF) Linux Shell Here Document (<< EOF) 終極指南 Here Document&#xff08;立即文檔&#xff09;是 Shell 中用于多行輸入重定向的強大功能&#xff0c;其核心語法為 << DELI…

【windows修復】解決windows10,沒有【相機] 功能問題

問題: windows10,相機模塊,好像是被卸載了,想重新安裝 方法簡介: 先下載windows store, 然后,在windows store 里面下載 相機功能: 解決: 直接下載官方離線包并手動安裝(成功率 90%+) 1 用瀏覽器打開 https://store.rg-adguard.net 這是微軟 CDN 解析站,安…

Python 中字典和 if-else 的選擇

一、為什么要寫這篇文章&#xff1f; 在 Python 編程中&#xff0c;我們經常需要根據不同的條件做不同的事情。比如&#xff1a; 根據用戶等級顯示不同的內容根據成績給出不同的評價根據天氣決定穿什么衣服 這時候&#xff0c;我們通常有兩種選擇&#xff1a; 用 if-else 語句用…

【開源解析】基于HTML5的智能會議室預約系統開發全攻略:從零構建企業級管理平臺

&#x1f680; 【開源解析】基于HTML5的智能會議室預約系統開發全攻略&#xff1a;從零構建企業級管理平臺 &#x1f308; 個人主頁&#xff1a;創客白澤 - CSDN博客 &#x1f4a1; 熱愛不止于代碼&#xff0c;熱情源自每一個靈感閃現的夜晚。愿以開源之火&#xff0c;點亮前行…

中央廣播電視總臺聯合阿里云研究院權威發布《中國人工智能應用發展報告(2025)》:我國依舊需要大力注重人工智能人才的培養

你好&#xff0c;我是杰哥。 中央廣播電視總臺聯合阿里云研究院權威發布《中國人工智能應用發展報告&#xff08;2025&#xff09;》&#xff0c;以下為報告核心看點&#xff1a; 報告首提 “654”體系&#xff1a;揭秘 6大技術趨勢、5 新應用場景、4 力產業模型&#xff1b;成…