最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文帶你掌握MySQL中的連表查詢

 更新時間:2026年01月14日 08:41:04   作者:盛夏綻放  
在 MySQL 中,連表查詢是通過關(guān)聯(lián)多個表的共同字段整合數(shù)據(jù)的核心操作,本文將基于真實的業(yè)務(wù)表(用戶表、訂單表、商品表),詳細講解所有連表查詢類型的語法、作用、執(zhí)行結(jié)果,并對比彼此的核心差異,讓你直觀理解各類連表查詢的特點

一、準(zhǔn)備工作:創(chuàng)建真實業(yè)務(wù)表并插入測試數(shù)據(jù)

我們以電商場景的用戶表(user)、訂單表(order)、 商品表(product) 為例,先創(chuàng)建表并插入測試數(shù)據(jù)(注意:order是 MySQL 關(guān)鍵字,需用反引號``包裹)。

1. 創(chuàng)建表結(jié)構(gòu)

-- 1. 用戶表(存儲用戶基本信息)
CREATE TABLE `user` (
    user_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '用戶ID(主鍵)',
    user_name VARCHAR(50) NOT NULL COMMENT '用戶名',
    user_phone VARCHAR(20) COMMENT '用戶手機號',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時間'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 2. 商品表(存儲商品信息)
CREATE TABLE `product` (
    product_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '商品ID(主鍵)',
    product_name VARCHAR(100) NOT NULL COMMENT '商品名稱',
    price DECIMAL(10,2) NOT NULL COMMENT '商品價格',
    stock INT DEFAULT 0 COMMENT '商品庫存'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 3. 訂單表(存儲用戶訂單,關(guān)聯(lián)用戶表和商品表)
CREATE TABLE `order` (
    order_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '訂單ID(主鍵)',
    user_id INT NOT NULL COMMENT '用戶ID(關(guān)聯(lián)user表的user_id)',
    product_id INT NOT NULL COMMENT '商品ID(關(guān)聯(lián)product表的product_id)',
    order_amount DECIMAL(10,2) NOT NULL COMMENT '訂單金額',
    order_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '下單時間',
    -- 外鍵約束(可選,用于強制數(shù)據(jù)完整性)
    FOREIGN KEY (user_id) REFERENCES `user`(user_id),
    FOREIGN KEY (product_id) REFERENCES `product`(product_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2. 插入測試數(shù)據(jù)

-- 插入用戶數(shù)據(jù)(3個用戶:張三、李四、王五,其中王五暫無訂單)
INSERT INTO `user` (user_name, user_phone) VALUES
('張三', '13800138000'),
('李四', '13900139000'),
('王五', '13700137000');

-- 插入商品數(shù)據(jù)(3個商品:手機、電腦、耳機)
INSERT INTO `product` (product_name, price, stock) VALUES
('華為Mate60', 6999.00, 100),
('蘋果MacBook Pro', 12999.00, 50),
('索尼WH-1000XM5', 2499.00, 200);

-- 插入訂單數(shù)據(jù)(4個訂單:張三買了手機和耳機,李四買了電腦,無王五的訂單,且有一個訂單關(guān)聯(lián)的商品ID為4(不存在的商品))
INSERT INTO `order` (user_id, product_id, order_amount) VALUES
(1, 1, 6999.00),  -- 張三買華為Mate60
(1, 3, 2499.00),  -- 張三買索尼耳機
(2, 2, 12999.00), -- 李四買蘋果電腦
(2, 4, 0.00);     -- 李四買了一個不存在的商品(product_id=4)

3. 表數(shù)據(jù)預(yù)覽

表名數(shù)據(jù)內(nèi)容
useruser_id:1(張三)、2(李四)、3(王五)
productproduct_id:1(華為 Mate60)、2(蘋果 MacBook Pro)、3(索尼耳機)
orderorder_id:1(1-1-6999)、2(1-3-2499)、3(2-2-12999)、4(2-4-0)

二、各類連表查詢詳解(附語法、結(jié)果、作用)

1. 交叉連接(CROSS JOIN):笛卡爾積連接

作用

返回兩個表的笛卡爾積(表 A 的每一行與表 B 的每一行組合),無任何條件匹配,實際業(yè)務(wù)中極少直接使用,通常需配合WHERE過濾。

語法

-- 顯式交叉連接(用戶表 × 商品表)
SELECT u.user_name, p.product_name 
FROM `user` u
CROSS JOIN `product` p;

執(zhí)行結(jié)果(共 3×3=9 行)

user_nameproduct_name
張三華為 Mate60
張三蘋果 MacBook Pro
張三索尼 WH-1000XM5
李四華為 Mate60
李四蘋果 MacBook Pro
李四索尼 WH-1000XM5
王五華為 Mate60
王五蘋果 MacBook Pro
王五索尼 WH-1000XM5

特點

  • 結(jié)果行數(shù) = 表 A 行數(shù) × 表 B 行數(shù);
  • 無業(yè)務(wù)意義,僅用于測試或特殊數(shù)據(jù)生成。

2. 內(nèi)連接(INNER JOIN):匹配連接(最常用)

作用

只返回兩個 / 多個表中滿足關(guān)聯(lián)條件的行(即交集),是業(yè)務(wù)中使用頻率最高的連表查詢。

語法(查詢用戶的訂單及對應(yīng)商品信息)

-- 顯式內(nèi)連接(推薦,可讀性高)
SELECT 
    u.user_name,
    o.order_id,
    p.product_name,
    o.order_amount
FROM `user` u
INNER JOIN `order` o ON u.user_id = o.user_id
INNER JOIN `product` p ON o.product_id = p.product_id;

-- 隱式內(nèi)連接(省略INNER JOIN,用WHERE指定條件,功能一致)
SELECT 
    u.user_name,
    o.order_id,
    p.product_name,
    o.order_amount
FROM `user` u, `order` o, `product` p
WHERE u.user_id = o.user_id AND o.product_id = p.product_id;

執(zhí)行結(jié)果(僅保留匹配的行,共 3 行)

user_nameorder_idproduct_nameorder_amount
張三1華為 Mate606999.00
張三2索尼 WH-1000XM52499.00
李四3蘋果 MacBook Pro12999.00

關(guān)鍵說明

  • 過濾掉了:王五(無訂單)、李四的 order_id=4(product_id=4 無匹配商品);
  • 可關(guān)聯(lián)多個表(上述示例關(guān)聯(lián)了 3 個表);
  • 顯式內(nèi)連接更符合 SQL 標(biāo)準(zhǔn),推薦使用。

3. 外連接(OUTER JOIN):保留單側(cè) / 雙側(cè)未匹配行

外連接分為左外連接、右外連接、全外連接(MySQL 不直接支持全外連接,需用 UNION 實現(xiàn)),核心是保留一側(cè) / 雙側(cè)表的所有行,無匹配時顯示NULL

(1)左外連接(LEFT JOIN / LEFT OUTER JOIN)

作用:保留左表(JOIN左側(cè)的表)的所有行,右表僅匹配滿足條件的行;若右表無匹配,右表字段顯示NULL。

語法(查詢所有用戶的訂單,包括無訂單的用戶)

-- 左外連接:保留用戶表的所有行
SELECT 
    u.user_name,
    o.order_id,
    p.product_name,
    o.order_amount
FROM `user` u
LEFT JOIN `order` o ON u.user_id = o.user_id
LEFT JOIN `product` p ON o.product_id = p.product_id;

執(zhí)行結(jié)果(共 5 行,包含王五和李四的無效訂單)

user_nameorder_idproduct_nameorder_amount
張三1華為 Mate606999.00
張三2索尼 WH-1000XM52499.00
李四3蘋果 MacBook Pro12999.00
李四4NULL0.00
王五NULLNULLNULL

關(guān)鍵說明

  • 保留了左表(user)的所有用戶:王五(無訂單,字段為 NULL);
  • 保留了李四的 order_id=4(product_id=4 無匹配商品,product_name 為 NULL)。

在這段左外連接 SQL 中,第一個LEFT JOIN的左表是FROM后的user表(別名u),而后續(xù)的LEFT JOIN的左表是前一個連接的結(jié)果集(即userorder連接后的臨時表)。

分步拆解說明

我們把 SQL 拆成兩步,你會更清晰:

第一步:user LEFT JOIN order

-- 左表:user(u),右表:order(o)
SELECT u.user_name, o.order_id
FROM `user` u
LEFT JOIN `order` o ON u.user_id = o.user_id;
  • 左表:userFROM后的主表),保留其所有行;
  • 右表:order,僅匹配滿足u.user_id = o.user_id的行,無匹配則顯示NULL。

第二步:再 LEFT JOIN product

-- 左表:第一步得到的臨時表(user+order),右表:product(p)
SELECT ...
FROM (user u LEFT JOIN order o ON ...)  -- 這是新的左表
LEFT JOIN `product` p ON o.product_id = p.product_id;
  • 左表:前一次連接的結(jié)果集userorder連接后的臨時表),保留其所有行;
  • 右表:product,僅匹配滿足o.product_id = p.product_id的行,無匹配則顯示NULL。

核心規(guī)律(通用)

在 MySQL 的多表連接中:

  • LEFT JOIN的左表 = LEFT JOIN關(guān)鍵字左側(cè)的表 / 結(jié)果集;
  • LEFT JOIN的右表 = LEFT JOIN關(guān)鍵字右側(cè)的表 / 結(jié)果集;
  • 多表連續(xù)LEFT JOIN時,左表會依次繼承前一次連接的結(jié)果,這也是為什么你的 SQL 能保留user表所有行的原因(因為每一步都是左連接,最終不會過濾掉user的行)。

比如你的 SQL 中,即使后續(xù)連接product,也不會丟失user表的行(比如王五無訂單的行、李四的無效訂單行都會保留)。

(2)右外連接(RIGHT JOIN / RIGHT OUTER JOIN)

作用:保留右表(JOIN右側(cè)的表)的所有行,左表僅匹配滿足條件的行;若左表無匹配,左表字段顯示NULL

語法(查詢所有商品的訂單,包括無訂單的商品)

-- 右外連接:保留商品表的所有行
SELECT 
    u.user_name,
    o.order_id,
    p.product_name,
    o.order_amount
FROM `user` u
INNER JOIN `order` o ON u.user_id = o.user_id
RIGHT JOIN `product` p ON o.product_id = p.product_id;

執(zhí)行結(jié)果(共 3 行,無訂單的商品顯示 NULL)

user_nameorder_idproduct_nameorder_amount
張三1華為 Mate606999.00
李四3蘋果 MacBook Pro12999.00
張三2索尼 WH-1000XM52499.00

擴展:若要保留商品表全量(包括無訂單的商品,需調(diào)整連接順序)

SELECT 
    u.user_name,
    o.order_id,
    p.product_name,
    o.order_amount
FROM `product` p
RIGHT JOIN `order` o ON p.product_id = o.product_id
LEFT JOIN `user` u ON o.user_id = u.user_id;
-- 結(jié)果會包含product_id=4的無效訂單,以及所有商品(若有商品無訂單則顯示NULL)

(3)全外連接(FULL JOIN / FULL OUTER JOIN)

作用:保留左表和右表的所有行,無匹配的一側(cè)字段顯示NULL(即左外連接 + 右外連接的并集)。

注意:MySQL 不直接支持 FULL JOIN,需通過LEFT JOIN UNION RIGHT JOIN實現(xiàn)

語法(查詢所有用戶和所有商品的訂單,無匹配則顯示 NULL)

-- 左外連接部分:所有用戶 + 匹配的訂單/商品
SELECT 
    u.user_name,
    o.order_id,
    p.product_name,
    o.order_amount
FROM `user` u
LEFT JOIN `order` o ON u.user_id = o.user_id
LEFT JOIN `product` p ON o.product_id = p.product_id

UNION  -- UNION去重,UNION ALL保留重復(fù)行

-- 右外連接部分:所有商品 + 匹配的訂單/用戶
SELECT 
    u.user_name,
    o.order_id,
    p.product_name,
    o.order_amount
FROM `user` u
RIGHT JOIN `order` o ON u.user_id = o.user_id
RIGHT JOIN `product` p ON o.product_id = p.product_id;

執(zhí)行結(jié)果(包含所有用戶、所有商品、所有訂單,無匹配則 NULL)

user_nameorder_idproduct_nameorder_amount
張三1華為 Mate606999.00
張三2索尼 WH-1000XM52499.00
李四3蘋果 MacBook Pro12999.00
李四4NULL0.00
王五NULLNULLNULL

4. 自然連接(NATURAL JOIN):自動匹配同名字段

作用

自動根據(jù)兩個表中名稱相同的字段進行連接(無需手動寫ON條件),分為自然內(nèi)連接、自然左 / 右外連接。

語法(自動匹配user_id字段,查詢用戶和訂單)

-- 自然內(nèi)連接(自動匹配user_id字段)
SELECT 
    user_name,
    order_id,
    order_amount
FROM `user` u
NATURAL JOIN `order` o;

執(zhí)行結(jié)果(等同于 INNER JOIN ON u.user_id = o.user_id,共 4 行)

user_nameorder_idorder_amount
張三16999.00
張三22499.00
李四312999.00
李四40.00

特點

  • 自動匹配同名字段,無需寫ON條件;
  • 風(fēng)險高:若表中有多個同名字段(如create_time),會同時匹配所有同名字段,導(dǎo)致非預(yù)期結(jié)果;
  • 生產(chǎn)環(huán)境極少使用,推薦顯式指定ON條件。

5. 自連接(SELF JOIN):表自身連接

作用

將表與自身進行連接(把一個表當(dāng)作兩個表使用),用于查詢表內(nèi)的層級關(guān)系或關(guān)聯(lián)數(shù)據(jù)(如員工與上級、分類與子分類)。

擴展:新增員工表并演示自連接

-- 創(chuàng)建員工表(包含員工ID和上級ID,上級ID關(guān)聯(lián)自身的員工ID)
CREATE TABLE `employee` (
    emp_id INT PRIMARY KEY AUTO_INCREMENT COMMENT '員工ID',
    emp_name VARCHAR(50) NOT NULL COMMENT '員工姓名',
    manager_id INT COMMENT '上級ID(關(guān)聯(lián)emp_id)',
    department VARCHAR(50) COMMENT '部門'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 插入測試數(shù)據(jù)
INSERT INTO `employee` (emp_name, manager_id, department) VALUES
('馬云', NULL, '董事會'),       -- 馬云無上級
('張勇', 1, 'CEO辦公室'),      -- 張勇的上級是馬云
('王堅', 2, '阿里云'),         -- 王堅的上級是張勇
('蔣芳', 2, '廉政部');         -- 蔣芳的上級是張勇

-- 自連接查詢:每個員工的姓名及對應(yīng)的上級姓名
SELECT 
    e.emp_name AS 員工姓名,
    m.emp_name AS 上級姓名,
    e.department AS 部門
FROM `employee` e
LEFT JOIN `employee` m ON e.manager_id = m.emp_id;

執(zhí)行結(jié)果

員工姓名上級姓名部門
馬云NULL董事會
張勇馬云CEO 辦公室
王堅張勇阿里云
蔣芳張勇廉政部

特點

  • 本質(zhì)是內(nèi)連接 / 外連接的特殊形式(表自身關(guān)聯(lián));
  • 必須為表取不同的別名(如e代表員工,m代表上級);
  • 常用于處理層級數(shù)據(jù)(如組織架構(gòu)、評論回復(fù))。

三、各類連表查詢的核心差異對比表

連接類型核心邏輯結(jié)果集特點匹配條件指定方式常用場景
交叉連接(CROSS)笛卡爾積,無匹配行數(shù) = 表 A× 表 B,無意義組合多無(或 WHERE 過濾)測試數(shù)據(jù)、特殊數(shù)據(jù)生成
內(nèi)連接(INNER)僅匹配滿足條件的行(交集)只保留匹配行,無 NULLON/WHERE業(yè)務(wù)核心查詢(如用戶 + 訂單)
左外連接(LEFT)保留左表所有行,右表匹配左表全量,右表無匹配則 NULLON查主表全量 + 關(guān)聯(lián)表數(shù)據(jù)(所有用戶 + 訂單)
右外連接(RIGHT)保留右表所有行,左表匹配右表全量,左表無匹配則 NULLON查關(guān)聯(lián)表全量 + 主表數(shù)據(jù)(所有訂單 + 用戶)
全外連接(FULL)保留左右表所有行(并集)左右表全量,無匹配則 NULLON(MySQL 需 UNION 實現(xiàn))查兩個表的所有數(shù)據(jù)(極少用)
自然連接(NATURAL)自動匹配同名字段同內(nèi) / 外連接,但依賴字段名自動(無需 ON)簡單場景(不推薦生產(chǎn)使用)
自連接(SELF)表自身關(guān)聯(lián)同內(nèi) / 外連接,處理表內(nèi)層級ON(表別名區(qū)分)層級數(shù)據(jù)查詢(員工 - 上級、分類 - 子分類)

四、關(guān)鍵注意事項

關(guān)聯(lián)鍵索引:連表查詢的關(guān)聯(lián)鍵(如user.user_id、order.user_id)需建立索引,否則會觸發(fā)全表掃描,性能極差;

NULL 值處理:外連接的 NULL 字段需用IFNULL()/COALESCE()處理(如IFNULL(o.order_amount, 0.00)),避免業(yè)務(wù)邏輯異常;

表別名:多表連接時建議使用表別名(如u代表user,o代表order),簡化 SQL 并提高可讀性;

優(yōu)先級JOIN的執(zhí)行優(yōu)先級高于WHERE,因此關(guān)聯(lián)條件寫在ON中比WHERE中更高效(尤其是外連接)。

到此這篇關(guān)于一文帶你掌握MySQL中的連表查詢的文章就介紹到這了,更多相關(guān)MySQL連表查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql 8.0.14 安裝配置方法圖文教程(通用)

    mysql 8.0.14 安裝配置方法圖文教程(通用)

    這篇文章主要為大家詳細介紹了mysql 8.0.14 安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • 你知道m(xù)ysql哪些查詢情況不走索引嗎

    你知道m(xù)ysql哪些查詢情況不走索引嗎

    索引的種類眾所周知,索引類似于字典的目錄,可以提高查詢的效率,下面這篇文章主要給大家介紹了關(guān)于mysql哪些查詢情況不走索引的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-04-04
  • MySQL5.7.44-winx64版本W(wǎng)indows Server下載安裝過程

    MySQL5.7.44-winx64版本W(wǎng)indows Server下載安裝過程

    本文詳細介紹了如何下載、安裝和配置MySQL 5.7.44的步驟,包括設(shè)置環(huán)境變量、修改配置文件和密碼,以及如何修改默認端口
    2025-12-12
  • Linux操作系統(tǒng)操作MySQL常用命令小結(jié)

    Linux操作系統(tǒng)操作MySQL常用命令小結(jié)

    本文給大家分享Linux操作系統(tǒng)操作MySQL常用命令小結(jié),需要的朋友參考下吧
    2017-07-07
  • mysql日志系統(tǒng)的簡單使用教程

    mysql日志系統(tǒng)的簡單使用教程

    這篇文章主要給大家介紹了關(guān)于mysql日志系統(tǒng)的簡單使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • MySQL報錯:The?server?quit?without?updating?PID?file的解決思路與方法

    MySQL報錯:The?server?quit?without?updating?PID?file的解決思路

    最近在學(xué)習(xí)mysql二進制的時候遇到了個報錯,解決分享給大家,這篇文章主要給大家介紹了關(guān)于MySQL報錯:The?server?quit?without?updating?PID?file的解決思路與方法,需要的朋友可以參考下
    2023-02-02
  • mysql 開放外網(wǎng)訪問權(quán)限的方法

    mysql 開放外網(wǎng)訪問權(quán)限的方法

    今天小編就為大家分享一篇mysql 開放外網(wǎng)訪問權(quán)限的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • 提高MySQL中InnoDB表BLOB列的存儲效率的教程

    提高MySQL中InnoDB表BLOB列的存儲效率的教程

    這篇文章主要介紹了提高MySQL中InnoDB表BLOB列的存儲效率的教程,InnoDB的優(yōu)化在MySQL的優(yōu)化研究中也是一個非常熱門的課題,需要的朋友可以參考下
    2015-05-05
  • Navicat連接MySQL錯誤描述分析

    Navicat連接MySQL錯誤描述分析

    最近遇到了一件非常棘手的問題,用Navicat連接MySQL總是出錯, 網(wǎng)上查閱了一下原因,最終找到解決方案,好吧,下面我就來回憶一下自己怎么處理這問題的,分享到腳本之家平臺需要的朋友參考下吧
    2021-06-06
  • MYSQL輸入密碼后閃退現(xiàn)象的解決方法

    MYSQL輸入密碼后閃退現(xiàn)象的解決方法

    最近在啟動MySQL服務(wù)端并輸入密后,出現(xiàn)閃退現(xiàn)象,實際上這種問題很常見,下面這篇文章主要給大家介紹了關(guān)于MYSQL輸入密碼后閃退現(xiàn)象的解決方法,文中介紹的非常詳細,需要的朋友可以參考下
    2023-05-05

最新評論

连州市| 铜陵市| 临清市| 裕民县| 惠东县| 游戏| 南木林县| 保定市| 那坡县| 桓仁| 昌图县| 灌南县| 绍兴市| 察隅县| 固阳县| 杭锦后旗| 利辛县| 罗田县| 五华县| 农安县| 饶阳县| 海南省| 遵义市| 常山县| 清水县| 库尔勒市| 堆龙德庆县| 西峡县| 昌宁县| 馆陶县| 营山县| 名山县| 阳曲县| 灵台县| 宜宾县| 青神县| 汤阴县| 改则县| 同德县| 乌苏市| 偏关县|