數據庫關系運算之連接

在數據庫理論中,關系連接(Join) 是將兩個或多個關系(表)中的元組(行)根據一定條件組合成新關系的操作,是關系型數據庫中核心且高頻使用的操作。其本質是通過共享的屬性(列)建立表之間的關聯,從而獲取更完整的信息。

一、連接的核心要素

  1. 參與連接的表:至少兩個表(如表A和表B)。
  2. 連接條件:指定表之間的關聯規則,通常基于兩表中相同或可比較的列(如A.id = B.a_id)。
  3. 連接結果:新表,包含滿足條件的元組組合,列通常是兩表列的并集(可通過選擇指定需要的列)。

二、常見連接類型及示例

為便于理解,先定義兩個示例表:

表1:學生表(Student)
學號(S_id)姓名(S_name)班級(Class)
101張三一班
102李四二班
103王五一班
104趙六三班
表2:成績表(Score)
成績ID(Sc_id)學號(S_id)科目(Subject)分數(Score)
1101數學90
2101語文85
3102數學88
4103英語92
5105數學75
1. 內連接(Inner Join)
  • 定義:只保留兩個表中同時滿足連接條件的元組。
  • 邏輯:結果 = 表A中滿足條件的元組 + 表B中對應滿足條件的元組(交集)。
  • 示例需求:查詢“有成績記錄的學生姓名及對應成績”(即學生表和成績表中都存在的學號)。
-- SQL語句
SELECT s.S_name, s.S_id, sc.Subject, sc.Score
FROM Student s
INNER JOIN Score sc ON s.S_id = sc.S_id;
  • 結果
    | S_name | S_id | Subject | Score |
    |--------|------|---------|-------|
    | 張三 | 101 | 數學 | 90 |
    | 張三 | 101 | 語文 | 85 |
    | 李四 | 102 | 數學 | 88 |
    | 王五 | 103 | 英語 | 92 |

  • 說明

    • 趙六(104)在成績表中無記錄,故未出現;
    • 成績表中105號學生不在學生表中,故未出現;
    • 張三(101)有兩條成績記錄,因此結果中會對應兩條行(一行數學、一行語文)。
2. 左連接(Left Join / Left Outer Join)
  • 定義:以左表(左側的表)為基準,保留左表所有元組,右表中滿足條件的元組與之匹配;若右表無匹配,右表列顯示為NULL。
  • 邏輯:結果 = 左表所有元組 + 右表中對應滿足條件的元組(左表全集 + 交集)。
  • 示例需求:查詢“所有學生的姓名及成績(無成績的學生顯示‘無成績’)”。
-- SQL語句
SELECT s.S_name, s.S_id, IFNULL(sc.Subject, '無科目') AS Subject,  -- 用IFNULL處理NULLIFNULL(sc.Score, '無成績') AS Score
FROM Student s
LEFT JOIN Score sc ON s.S_id = sc.S_id;
  • 結果
    | S_name | S_id | Subject | Score |
    |--------|------|----------|--------|
    | 張三 | 101 | 數學 | 90 |
    | 張三 | 101 | 語文 | 85 |
    | 李四 | 102 | 數學 | 88 |
    | 王五 | 103 | 英語 | 92 |
    | 趙六 | 104 | 無科目 | 無成績 | (趙六在成績表中無記錄,右表列用NULL填充后替換)

  • 說明:左表(Student)的所有4名學生均保留,趙六因無成績記錄,成績表相關列顯示為“無科目”和“無成績”。

3. 右連接(Right Join / Right Outer Join)
  • 定義:以右表(右側的表)為基準,保留右表所有元組,左表中滿足條件的元組與之匹配;若左表無匹配,左表列顯示為NULL。
  • 邏輯:結果 = 右表所有元組 + 左表中對應滿足條件的元組(右表全集 + 交集)。
  • 示例需求:查詢“所有成績記錄對應的學生姓名(包括無對應學生的成績)”。
-- SQL語句
SELECT IFNULL(s.S_name, '未知學生') AS S_name, sc.S_id, sc.Subject, sc.Score
FROM Student s
RIGHT JOIN Score sc ON s.S_id = sc.S_id;
  • 結果
    | S_name | S_id | Subject | Score |
    |----------|------|---------|-------|
    | 張三 | 101 | 數學 | 90 |
    | 張三 | 101 | 語文 | 85 |
    | 李四 | 102 | 數學 | 88 |
    | 王五 | 103 | 英語 | 92 |
    | 未知學生 | 105 | 數學 | 75 | (105號學生不在Student表中,左表列用NULL填充后替換)

  • 說明:右表(Score)的所有5條成績記錄均保留,105號學生因不在學生表中,姓名顯示為“未知學生”。

4. 全連接(Full Join / Full Outer Join)
  • 定義:保留兩個表中所有元組,滿足條件的元組正常匹配;不滿足條件的元組,對應另一表的列顯示為NULL。
  • 邏輯:結果 = 左表全集 + 右表全集(并集)。
  • 注意:MySQL不直接支持Full Join,可通過“Left Join + Union + Right Join”模擬。

示例結果(模擬)

S_nameS_idSubjectScore
張三101數學90
張三101語文85
李四102數學88
王五103英語92
趙六104無科目無成績
未知學生105數學75
5. 交叉連接(Cross Join)
  • 定義:不指定連接條件時的連接,返回兩個表的笛卡爾積(左表每一行與右表每一行都組合)。
  • 特點:結果行數 = 左表行數 × 右表行數(通常需配合條件過濾,否則結果冗余)。
  • 示例:Student(4行)× Score(5行)= 20行結果(此處省略冗余內容)。

三、連接的使用場景總結

連接類型核心用途典型場景示例
內連接獲取兩表關聯的“有效數據”學生成績查詢(必須有學生和成績記錄)
左連接以左表為基準,補充右表信息(允許右表為空)員工及所屬部門查詢(含暫無部門的員工)
右連接以右表為基準,補充左表信息(允許左表為空)訂單及客戶信息查詢(含暫無客戶的訂單)
全連接獲取兩表所有數據及關聯數據合并兩個來源的用戶數據(含獨有和共有)
交叉連接生成所有可能組合(需配合條件)生成“學生-課程”所有可選組合

通過以上示例可以看出,連接的核心是通過“共享列”建立表之間的關聯,不同連接類型決定了結果中保留的數據范圍。實際使用時,需根據業務需求選擇合適的連接類型,并注意連接條件的準確性(避免笛卡爾積或遺漏數據)。

在數據庫關系連接中,不同的連接類型適用于不同的業務場景。以下通過**“電商訂單系統”**的典型場景,舉例說明常用連接類型的實際應用(假設存在兩張核心表:訂單表(orders)用戶表(users))。

基礎表結構與數據

為了更直觀理解,先定義兩張表的結構和示例數據:

1. 用戶表(users)

存儲用戶的基礎信息,主鍵為user_id

user_id(主鍵)usernameage
101張三25
102李四30
103王五28
104趙六35
2. 訂單表(orders)

存儲用戶的訂單信息,user_id為外鍵(關聯users表的user_id),主鍵為order_id

order_id(主鍵)user_id(外鍵)order_timetotal_amount
10011012025-07-01 10:00299
10021012025-07-05 14:30599
10031022025-07-03 09:15199
10041052025-07-06 16:40899

典型場景與連接類型示例

場景1:查詢“有訂單的用戶及其訂單信息”(內連接 Inner Join)

業務需求:運營需要統計“已下單用戶”的訂單明細(不含未下單用戶,也不含無對應用戶的異常訂單)。

原理:內連接只保留兩張表中“連接條件匹配”的記錄(即users.user_id = orders.user_id且兩邊都存在的記錄)。

SQL語句

SELECT u.user_id, u.username, o.order_id, o.total_amount
FROM users u
INNER JOIN orders o 
ON u.user_id = o.user_id;

查詢結果(只保留匹配的記錄):

user_idusernameorder_idtotal_amount
101張三1001299
101張三1002599
102李四1003199

說明

  • 王五(103)、趙六(104)因無訂單,未出現在結果中;
  • 訂單1004(user_id=105)因無對應用戶,也未出現在結果中。
場景2:查詢“所有用戶的訂單情況(含未下單用戶)”(左連接 Left Join)

業務需求:客服需要整理“所有用戶的訂單記錄”,包括“未下單用戶”(需標記為“無訂單”)。

原理:左連接以“左表(users)”為基準,保留左表所有記錄;右表(orders)中匹配的記錄正常顯示,不匹配的記錄用NULL填充。

SQL語句

SELECT u.user_id, u.username, o.order_id, IFNULL(o.total_amount, '無訂單') AS total_amount
FROM users u
LEFT JOIN orders o 
ON u.user_id = o.user_id;

查詢結果(保留所有用戶,無訂單的用戶訂單字段為NULL或“無訂單”):

user_idusernameorder_idtotal_amount
101張三1001299
101張三1002599
102李四1003199
103王五NULL無訂單
104趙六NULL無訂單

說明

  • 左表(users)的所有用戶(101-104)均被保留;
  • 王五(103)、趙六(104)無訂單,訂單相關字段顯示為NULL(通過IFNULL轉換為“無訂單”)。
場景3:查詢“所有訂單及對應用戶(含異常訂單)”(右連接 Right Join)

業務需求:技術人員需要排查“異常訂單”(即訂單對應的用戶不存在的情況)。

原理:右連接以“右表(orders)”為基準,保留右表所有記錄;左表(users)中匹配的記錄正常顯示,不匹配的記錄用NULL填充。

SQL語句

SELECT o.order_id, o.user_id, u.username, IF(u.user_id IS NULL, '異常訂單', '正常訂單') AS order_status
FROM users u
RIGHT JOIN orders o 
ON u.user_id = o.user_id;

查詢結果(保留所有訂單,無對應用戶的訂單標記為異常):

order_iduser_idusernameorder_status
1001101張三正常訂單
1002101張三正常訂單
1003102李四正常訂單
1004105NULL異常訂單

說明

  • 右表(orders)的所有訂單(1001-1004)均被保留;
  • 訂單1004(user_id=105)無對應用戶,用戶相關字段(username)顯示為NULL,被標記為“異常訂單”。
場景4:查詢“所有用戶和所有訂單(含未匹配記錄)”(全連接 Full Join)

業務需求:數據分析師需要一次性獲取“所有用戶+所有訂單”的完整數據(含未下單用戶和異常訂單),用于全局統計。

原理:全連接保留左表和右表的所有記錄,雙方不匹配的部分用NULL填充(注:MySQL不直接支持FULL JOIN,可通過LEFT JOIN + UNION + RIGHT JOIN模擬)。

模擬SQL語句

-- 左連接結果(所有用戶+匹配訂單)
SELECT u.user_id, u.username, o.order_id, o.total_amount
FROM users u LEFT JOIN orders o ON u.user_id = o.user_id
UNION  -- 合并結果并去重
-- 右連接中“訂單無對應用戶”的部分(避免重復)
SELECT u.user_id, u.username, o.order_id, o.total_amount
FROM users u RIGHT JOIN orders o ON u.user_id = o.user_id
WHERE u.user_id IS NULL;

查詢結果(所有用戶+所有訂單,不匹配部分為NULL):

user_idusernameorder_idtotal_amount
101張三1001299
101張三1002599
102李四1003199
103王五NULLNULL
104趙六NULLNULL
NULLNULL1004899

總結:連接類型與場景對應關系

連接類型核心作用典型場景
內連接(Inner)只保留匹配的記錄正常業務數據查詢(如已下單用戶的訂單明細)
左連接(Left)保留左表所有記錄,匹配右表數據需包含“主表全部數據”的查詢(如所有用戶的訂單情況)
右連接(Right)保留右表所有記錄,匹配左表數據需包含“從表全部數據”的查詢(如所有訂單及用戶匹配情況)
全連接(Full)保留左右表所有記錄全局數據統計(如所有用戶+所有訂單的完整視圖)

通過這些場景可以看出,連接的核心是“基于關聯字段(如user_id)匹配數據”,而選擇哪種連接類型,取決于業務是否需要保留“未匹配的記錄”。

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

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

相關文章

npm全局安裝后,依然不是內部或外部命令,也不是可運行的程序或批處理文件

雖然通過 npm install -g yarn 安裝了 Yarn,但系統無法識別 yarn 命令。這通常是因為 npm 的全局安裝目錄沒有添加到系統的 PATH 環境變量中C:\Users\Administrator>npm install -g yarnadded 1 package in 518msC:\Users\Administrator>yarn yarn 不是內部或…

C++ Proactor 與 Reactor 網絡編程模式

🧠 C Proactor 與 Reactor 網絡編程模式📌 核心區別概述特性Reactor 模式Proactor 模式事件驅動核心監聽 I/O 就緒事件 (可讀/可寫)監聽 I/O 完成事件 (讀完成/寫完成)I/O 執行者用戶線程 主動執行 I/O 操作操作系統 異步執行 I/O 操作控制流同步非阻塞 …

從手動操作到自動化:火語言 RPA 在多系統協作中的實踐

在企業日常運營中,很多業務流程需要在多個系統間來回切換:從 A 系統導出數據,到 B 系統校驗格式,再到 C 系統錄入信息…… 這些跨系統操作步驟繁瑣、邏輯固定,卻往往依賴人工完成,不僅效率低下,…

Spring Security 實踐之登錄

前言Spring Security是一個功能強大且高度且可定制的身份驗證和訪問控制框架,包含標準的身份認證和授權。 本文主要介紹SpringBoot中如何配置使用 Spring Security 安全認證框架并簡述相關原理和步驟。核心認證流程解析請求過濾 用戶提交登錄表單AbstractAuthentica…

華為云開發者空間 × DeepSeek-R1 智能融合測評:云端開發與AI客服的協同進化

前言: 華為開發者空間,是為全球開發者打造的專屬開發者空間,致力于為每位開發者提供一臺云主機、一套開發工具和云上存儲空間,當普惠云資源遇見推理大模型,企業服務與開發效能的范式革命正在加速。華為云開發者空間&am…

二分查找----4.搜索旋轉排序數組

題目鏈接 /** 升序數組在某個位置被分割為前后兩部分,前后兩部分整體互換;在被改變后的數組中找到目標值 O(log n)---> 二分查找 特點: 旋轉后的數組被分割為兩個獨立的遞增區間 左半區的最小值,大于右半區的最大值(mid所在區間的判斷依據) 二分策略: 首先判斷mid落在左區間…

地球表面附近兩點之間距離、高低角和方位角的計算方法,VC++代碼實操!

書接上文,這篇文章介紹具體的VC編程實現,代碼實操。任何一個算法,你必須將其編寫為代碼,運行結果正確,才算真正掌握了,否則都是似懂非懂,一知半解,下面先給出仿真結果的截圖&#xf…

uniapp各大平臺導航組件

最近有個需求要點擊導航然后跳出各家導航軟件話不多出直接貼出代碼&#xff1a;這個可以作為組件引入<template><view><view class"nav" :style"{color: customColor}" click.stop"openMap">{{title}}</view><!-- 彈…

Access開發一鍵刪除Excel指定工作表

Hi&#xff0c;大家好&#xff01;又到了每周給大家更新的時間了&#xff0c;這周給大家講講excel的處理操作吧。在開始前&#xff0c;先給大家匯報一下我們框架的進度&#xff0c;最近兩周沒有直播&#xff0c;所以大家不太清楚目前的進度&#xff0c;框架目前就差權限了&…

無廣告終端安全產品推薦:打造純凈辦公環境的安全之選

在數字化辦公時代&#xff0c;終端安全防護是企業和個人不可忽視的重要環節。然而&#xff0c;許多傳統安全軟件往往伴隨著頻繁的廣告彈窗和推廣信息&#xff0c;不僅干擾正常工作&#xff0c;還可能成為潛在的安全隱患。本文將為您介紹幾款「無廣告、無捆綁」的終端產品&#…

使用UE5自帶節點InteriorCubemap制作假室內效果

Interior Mapping&#xff08;室內映射&#xff09;是一種用著色器方法模擬室內結構紋理的方式&#xff0c;避免了真實對室內場景建模造成的模型面數渲染開銷&#xff0c;在《蜘蛛俠》《城市天際線》等游戲中都采用了該技術。 UE自帶了節點InteriorCubemap&#xff08;Unity S…

基于單片機睡眠質量/睡眠枕頭設計

傳送門 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目速選一覽表 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目功能速覽 概述 隨著現代社會生活節奏的加快&#xff0c;睡眠質量問題日益受到人們的關注。本研究設計了一種基于…

Ajax第一天

AJAX概念&#xff1a;AJAX 是瀏覽器與服務器進行數據通信的技術&#xff08;把數據變活&#xff09;語法&#xff1a;1.引入 axios.js&#xff1a;https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js2.使用 axios 函數? 傳入配置對象? 再用 .then 回調函數接收結果&#…

AI大模型各類概念掃盲

以下內容整理自AI&#xff0c;進行一個概念掃盲&#xff1a;Prompt&#xff08;提示詞&#xff09; Prompt是用戶提供給AI模型的指令或問題&#xff0c;用于引導模型生成特定輸出。良好的Prompt設計能顯著提升模型的任務理解能力和響應質量&#xff0c;例如通過結構化提示&…

Linux系統編程——網絡

一、TCP/UDP 1、osi模型 物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層、應用層&#xff08;下層為上層提供服務&#xff09; 2、TCP/IP模型&#xff08;TCP/IP協議棧&#xff09; 應用層&#xff1a; HTTP&#xff08;超文本傳輸協議&#xff09;、FTP&#xff08;文件…

taro+pinia+小程序存儲配置持久化

主要通過taro的getStorageSync,setStorageSync實現配置持久化 // https://pinia.esm.dev/introduction.html import { defineStore } from pinia; import { CreditCardDateUtils } from /untils/compute; import { getStorageSync, setStorageSync } from "tarojs/taro&qu…

抖音小游戲好做嗎?

從0到1&#xff0c;教你打造爆款抖音小游戲隨著移動互聯網的發展&#xff0c;抖音小游戲憑借便捷即玩、流量龐大等優勢&#xff0c;成為游戲開發者的熱門選擇。想知道如何開發出一款吸睛又好玩的抖音小游戲嗎&#xff1f;下面就為你詳細介紹開發流程。一、前期規劃明確游戲類型…

Spring Boot 3核心技術面試指南:從遷移升級到云原生實戰,9輪技術攻防(含架構解析)

面試官&#xff1a;cc程序員&#xff0c;聊聊Spring Boot 3的那些事兒&#xff1f; 場景背景 互聯網大廠云原生架構部面試官老王&#xff0c;與自稱"Spring Boot骨灰粉"的cc程序員展開技術對決。 面試過程 第一輪&#xff1a;遷移升級 面試官&#xff1a;Spring Boot…

技術演進中的開發沉思-42 MFC系列:Components 與 ActiveX Controls

點擊程序啟動時&#xff0c;是不是看過有加載的畫面。在VC開發時&#xff0c;可使用 VC 的 Component Gallery&#xff0c;找到 Splash screen 組件&#xff0c;當時覺得組件就是給程序員的暖手寶。一、Component GalleryComponent Gallery 在 VC 里的位置很特別 —— 它藏在 “…

抽象類、接口、枚舉

第八天&#xff08;堅持&#xff09;抽象類1.什么是抽象類&#xff0c;作用特點。抽象類是面向對象編程中一種特殊的類&#xff0c;它不能被實例化&#xff0c;主要用于作為其他類的基類&#xff08;父類&#xff09;。抽象類的主要作用是定義公共結構和行為規范&#xff0c;同…