七、JOIN 語法詳解與實戰示例

一、JOIN 的作用與分類

JOIN 操作用于合并兩個或多個表的行,基于表之間的關聯字段。以下是常見的 JOIN 類型:

JOIN 類型描述
INNER JOIN返回兩個表匹配的記錄
LEFT JOIN返回左表所有記錄 + 右表匹配記錄(右表無匹配則為NULL)
RIGHT JOIN返回右表所有記錄 + 左表匹配記錄(左表無匹配則為NULL)
FULL JOIN返回所有記錄(MySQL不支持,可用UNION模擬)
CROSS JOIN返回笛卡爾積(所有可能的組合)

二、INNER JOIN(內連接)

語法與作用

SELECT 字段
FROM 表A
INNER JOIN 表B ON 表A.字段 = 表B.字段;
  • 作用:僅返回兩表中匹配的行
  • 使用場景:需要精確關聯數據的場景(如訂單與用戶信息關聯)

示例

表結構

-- 用戶表
CREATE TABLE users (user_id INT PRIMARY KEY,name VARCHAR(50)
);
INSERT INTO users VALUES (1, '張三'), (2, '李四');-- 訂單表
CREATE TABLE orders (order_id INT PRIMARY KEY,user_id INT,amount DECIMAL(10,2)
);
INSERT INTO orders VALUES (1001, 1, 299.00), (1002, 3, 599.00);

查詢:獲取有訂單的用戶信息

SELECT u.name, o.order_id, o.amount
FROM users u
INNER JOIN orders o ON u.user_id = o.user_id;

結果

nameorder_idamount
張三1001299.00

三、LEFT JOIN(左連接)

語法與作用

SELECT 字段
FROM 表A
LEFT JOIN 表B ON 表A.字段 = 表B.字段;
  • 作用:返回左表所有記錄,右表無匹配則顯示NULL
  • 使用場景:統計所有用戶的訂單情況(包括未下單用戶)

示例

查詢:統計所有用戶的訂單(含未下單用戶)

SELECT u.name, o.order_id, o.amount
FROM users u
LEFT JOIN orders o ON u.user_id = o.user_id;

結果

nameorder_idamount
張三1001299.00
李四NULLNULL

四、RIGHT JOIN(右連接)

語法與作用

SELECT 字段
FROM 表A
RIGHT JOIN 表B ON 表A.字段 = 表B.字段;
  • 作用:返回右表所有記錄,左表無匹配則顯示NULL
  • 使用場景:查找所有訂單對應的用戶(包括無效用戶訂單)

示例

查詢:顯示所有訂單及用戶信息

SELECT u.name, o.order_id, o.amount
FROM users u
RIGHT JOIN orders o ON u.user_id = o.user_id;

結果

nameorder_idamount
張三1001299.00
NULL1002599.00

五、FULL JOIN(全連接)

語法與作用(MySQL實現方式)

SELECT 字段
FROM 表A
LEFT JOIN 表B ON 表A.字段 = 表B.字段
UNION
SELECT 字段
FROM 表A
RIGHT JOIN 表B ON 表A.字段 = 表B.字段;
  • 作用:返回所有記錄(類似LEFT JOIN + RIGHT JOIN去重)
  • 使用場景:需要同時保留兩個表所有記錄的統計

示例

查詢:合并用戶和訂單的所有記錄

SELECT u.name, o.order_id, o.amount
FROM users u
LEFT JOIN orders o ON u.user_id = o.user_id
UNION
SELECT u.name, o.order_id, o.amount
FROM users u
RIGHT JOIN orders o ON u.user_id = o.user_id;

結果

nameorder_idamount
張三1001299.00
李四NULLNULL
NULL1002599.00

六、復合條件 JOIN

多表關聯

-- 三表關聯示例
SELECT u.name,o.order_id,p.product_name
FROM users u
INNER JOIN orders o ON u.user_id = o.user_id
INNER JOIN products p ON o.product_id = p.product_id;

多條件關聯

-- 日期范圍關聯
SELECT e.emp_name,d.dept_name,s.salary
FROM employees e
LEFT JOIN salaries s ON e.emp_id = s.emp_id AND s.effective_date BETWEEN '2023-01-01' AND '2023-12-31';

七、自連接(Self Join)

語法與作用

SELECT A.字段, B.字段
FROMAS A
JOINAS B ON A.關聯字段 = B.關聯字段;
  • 使用場景:層級數據查詢(如員工與上級經理)

示例

表結構

-- 創建員工表(包含員工ID、姓名和直屬上級ID)
CREATE TABLE employees (emp_id INT PRIMARY KEY,       -- 員工ID(主鍵)name VARCHAR(50),            -- 員工姓名manager_id INT               -- 直屬上級的員工ID(引用emp_id)
);-- 插入示例數據(構建管理層級關系)
INSERT INTO employees VALUES
(1, 'CEO', NULL),   -- CEO沒有上級(manager_id為NULL)
(2, 'CTO', 1),      -- CTO的上級是CEO(emp_id=1)
(3, '工程師', 2);    -- 工程師的上級是CTO(emp_id=2)

查詢:顯示員工及其上級

-- 查詢員工及其對應上級姓名(包含無上級的員工)
SELECT e.name AS employee,   -- 員工姓名m.name AS manager     -- 上級姓名
FROM employees e
LEFT JOIN employees m     -- 自連接:將員工表同時作為員工和上級表使用ON e.manager_id = m.emp_id;  -- 通過manager_id關聯上級信息

結果

employeemanager
CEONULL
CTOCEO
工程師CTO

八、常見錯誤與解決方法

1. 笛卡爾積問題

錯誤示例

SELECT * FROM users, orders;  -- 未指定關聯條件

結果:用戶數 × 訂單數 條記錄(如2用戶×2訂單=4條)

正確寫法

SELECT * FROM users
JOIN orders ON users.user_id = orders.user_id;

2. 別名使用不當

錯誤示例

SELECT user_id FROM users u
JOIN orders o ON users.user_id = o.user_id;  -- 錯誤:未使用別名

正確寫法

SELECT u.user_id FROM users u
JOIN orders o ON u.user_id = o.user_id;

九、最佳實踐建議

  1. 優先使用 INNER JOIN:明確需要關聯數據時使用
  2. 慎用 RIGHT JOIN:可通過調換表順序改用 LEFT JOIN
  3. 使用表別名:提高可讀性(如 users u
  4. 關聯字段加索引:顯著提升 JOIN 性能
  5. 避免 SELECT:明確列出需要字段

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

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

相關文章

2019年01月全國POI數據分享(同源歷史POI分享系列)

2019年01月全國范圍POI數據 2019年01月份全國范圍歷史POI數據,全國范圍所有類別共59336781個POI 2019年01月全國范圍POI數據按大類統計 大類代碼大類名稱2019年01月該類POI數量010000汽車服務1151164020000汽車銷售213647030000汽車維修517367040000摩托車服務1800…

Spring Boot + MyBatis 實現 RESTful API 的完整流程

后端開發:Spring Boot 快速開發實戰 引言 在現代后端開發中,Spring Boot 因其輕量級、快速開發的特性而備受開發者青睞。本文將帶你從零開始,使用 Spring Boot MyBatis 實現一個完整的 RESTful API,并深入探討如何優雅地處理異…

使用Python開發以太坊智能合約:輕松入門與深度探索

使用Python開發以太坊智能合約:輕松入門與深度探索 隨著區塊鏈技術的快速發展,以太坊作為最為成熟和廣泛使用的智能合約平臺,成為了開發去中心化應用(DApp)的核心工具。智能合約不僅是區塊鏈技術的基礎,更…

ES scroll=1m:表示快照的有效時間為1分鐘。怎么理解

在Elasticsearch中,scroll1m 表示你創建的 scroll 上下文 的有效時間為 1分鐘。這個參數控制了你可以在多長時間內繼續使用這個 scroll_id 來獲取更多的數據。 什么是 Scroll 上下文? 當你使用 scroll API 時,Elasticsearch 會為你的查詢創…

Linux與UDP應用1:翻譯軟件

UDP應用1:翻譯軟件 本篇介紹 本篇基于UDP編程接口基本使用中封裝的服務器和客戶端進行改寫,基本功能如下: 從配置文件dict.txt讀取到所有的單詞和意思客戶端向服務端發送英文服務端向客戶端發送英文對應的中文意思 配置文件內容 下面的內…

Jeecg-Boot 開放接口開發實戰:在 Jeecg-Boot 的jeecg-system-biz中添加一個controller 實現免鑒權數據接口

Jeecg-Boot 開放接口開發實戰:在 Jeecg-Boot 的jeecg-system-biz中添加一個controller 實現免鑒權數據接口 一、場景需求分析 在微服務架構中,常需要快速實現以下兩類接口: 開放接口:無需登錄即可訪問(如數據查詢、…

C++ ++++++++++

初始C 注釋 變量 常量 關鍵字 標識符命名規則 數據類型 C規定在創建一個變量或者常量時,必須要指定出相應的數據類型,否則無法給變量分配內存 整型 sizeof關鍵字 浮點型(實型) 有效位數保留七位,帶小數點。 這個是保…

構建安全的Docker基礎鏡像:從最佳實踐到自動化加固

引言 容器化技術的普及使得Docker鏡像成為軟件交付的核心載體,但鏡像中的安全漏洞、敏感信息泄露和權限配置不當等問題可能引發嚴重風險。本文結合OWASP容器安全指南與一線運維經驗,系統化講解如何構建安全的Docker基礎鏡像,覆蓋鏡像構建、依賴管理、運行時防護全鏈路,并提…

BKA-CNN基于黑翅鳶算法優化卷積神經網絡的數據多特征分類預測Matlab

BKA-CNN基于黑翅鳶算法優化卷積神經網絡的數據多特征分類預測Matlab 目錄 BKA-CNN基于黑翅鳶算法優化卷積神經網絡的數據多特征分類預測Matlab分類效果基本介紹BKA-CNN基于黑翅鳶算法優化卷積神經網絡的數據多特征分類預測一、引言1.1、研究背景和意義1.2、研究現狀1.3、研究目…

SOLID Principle基礎入門

(Robert C. Martin (Uncle Bob)) 什么是SOLID原則? SOLID原則是面向對象編程(OOP)中編寫高質量代碼的指導方針。實際上,即使不使用SOLID原則,僅通過類、繼承、封裝和多態性,也可以讓程序正常運行。那么為…

輕松實現語音生成:GPT-SoVITS V2整合包的遠程訪問操作詳解

文章目錄 前言1.GPT-SoVITS V2下載2.本地運行GPT-SoVITS V23.簡單使用演示4.安裝內網穿透工具4.1 創建遠程連接公網地址 5. 固定遠程訪問公網地址 前言 今天要給大家安利一個絕對能讓你大呼過癮的聲音黑科技——GPT-SoVITS!這款由花兒不哭大佬精心打造的語音克隆神…

Python線程池知多少

目錄 目標 Python版本 官方文檔 概述 線程池 實戰 創建線程池的基本語法 批量提交任務 生產者&消費者模型 目標 掌握線程池的基本概念和使用方法。 Python版本 Python 3.9.18 官方文檔 concurrent.futures — Launching parallel taskshttps://docs.python.org/3…

(轉)SpringBoot和SpringCloud的區別

(轉)SpringBoot和SpringCloud的區別:

中科大 計算機網絡組成原理 1.4 接入網和物理媒體 筆記

一、接入網核心功能與架構 ?核心作用? 接入網是連接用戶終端與核心網絡的橋梁,承擔用戶身份認證、帶寬分配、數據加密等功能,直接影響網絡服務的可靠性和用戶體驗。例如,杭州電視臺的數字人主播通過光纖專線實現零失誤新聞播報,…

阿里云音頻算法崗內推

1、視頻云直播、連麥,點播,短視頻,媒體生產與處理等服務相關的實時/非實時的音頻分析和處理; 2、音頻處理算法,包括多場景降噪、自動增益控制、回聲消除等; 3、音頻特效算法研發,包括變調變速…

如何使用DeepSeek輔助準備面試

前言 又到了金三銀四的時間點了。每年的這個時間點都會出現無數的機遇和機會,但是如何準備面試,應該準備哪些面試題,如何查漏補缺我們的技術面的短板,這是我們每次準備面試的時候,都會遇見的問題。在今年,…

如何流暢訪問github

1.傳輸數據原理 本地計算機通過本地網接入運營骨干網,經過DNS域名解析,將輸入的字符解析為要連接的真實IP地址,服務器返還一個數據包(github)給計算機 2.原因 DNS域名污染-DNS解析出現問題,導致訪問一個不存在的服務器 3.解決…

JPA屬性轉換器的使用與實例解析

在Java持久化框架中,JPA(Java Persistence API)為我們提供了強大的功能來操作數據庫。其中,屬性轉換器(Attribute Converter)是一個非常實用的特性,它允許我們將實體類中的屬性類型轉換為適合存…

AI數據分析:用DeepSeek做數據清洗

在當今數據驅動的時代,數據分析已成為企業和個人決策的重要工具。隨著人工智能技術的快速發展,AI 驅動的數據分析工具正在改變我們處理和分析數據的方式。本文將著重介紹如何使用 DeepSeek 進行數據清洗。 數據清洗是數據分析的基礎,其目的是…

rust學習~tokio的io

await Suspend execution until the result of a Future is ready. 暫停執行,直到一個 Future 的結果就緒。 .awaiting a future will suspend the current function’s execution until the executor has run the future to completion. 對一個 Future 使用 .awa…