MySQL 多表連接操作方法(INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN)
一、 什么是多表連接?
多表連接是一種將兩個(gè)或多個(gè)表中的數(shù)據(jù)組合在一起的 SQL 操作。通過(guò)連接,我們可以根據(jù)表之間的關(guān)系(如主鍵和外鍵)提取相關(guān)聯(lián)的數(shù)據(jù)。連接操作是關(guān)系型數(shù)據(jù)庫(kù)的核心功能之一,廣泛應(yīng)用于數(shù)據(jù)分析、報(bào)表生成等場(chǎng)景。
二、 MySQL 支持的連接類型
| 連接類型 | 作用 | 特點(diǎn) | 適用場(chǎng)景 | MySQL 支持 | 連接方式 |
|---|---|---|---|---|---|
INNER JOIN | 返回兩個(gè)表中匹配的行。 | 只返回滿足連接條件的記錄。 | 需要獲取兩個(gè)表中完全匹配的數(shù)據(jù)。 | 支持 | 內(nèi)連接 |
LEFT JOIN | 返回左表中的所有行,以及右表中匹配的行。如果右表中沒(méi)有匹配的行,則返回 NULL。 | 左表為主,右表為輔。 | 需要獲取左表中的所有數(shù)據(jù),即使右表中沒(méi)有匹配的記錄。 | 支持 | 左外連接 |
RIGHT JOIN | 返回右表中的所有行,以及左表中匹配的行。如果左表中沒(méi)有匹配的行,則返回 NULL。 | 右表為主,左表為輔。 | 需要獲取右表中的所有數(shù)據(jù),即使左表中沒(méi)有匹配的記錄。 | 支持 | 右外連接 |
FULL OUTER JOIN | 返回左表和右表中的所有行。如果某一行在另一個(gè)表中沒(méi)有匹配的行,則返回 NULL。 | 返回兩個(gè)表的并集。 | 需要獲取兩個(gè)表中的所有數(shù)據(jù),即使沒(méi)有匹配的記錄。 | 不支持,但可以通過(guò) UNION 模擬實(shí)現(xiàn) | 全連接 |
注意:
1、OUTER JOIN 是一種連接類型,它包括了 LEFT JOIN、RIGHT JOIN 和 FULL OUTER JOIN。它與 INNER JOIN 不同,OUTER JOIN 會(huì)返回不僅包括匹配的行,還包括不匹配的行(用 NULL 填充)。OUTER JOIN 是 LEFT JOIN、RIGHT JOIN 和 FULL OUTER JOIN 的總稱。
2、默認(rèn)情況下,JOIN 是 INNER JOIN 的簡(jiǎn)寫(xiě)形式。
三、 多表連接的語(yǔ)法
多表連接的基本語(yǔ)法如下:
SELECT 列名 FROM 表1 連接類型 JOIN 表2 ON 表1.列 = 表2.列;
- 連接類型:可以是
INNER JOIN、LEFT JOIN、RIGHT JOIN等。 - ON 子句:指定連接條件,通常是主鍵和外鍵的關(guān)系。
四、實(shí)戰(zhàn)示例 數(shù)據(jù)準(zhǔn)備
創(chuàng)建兩個(gè)表 Person 和 Address,并插入測(cè)試數(shù)據(jù):
CREATE TABLE Person (
personId INT PRIMARY KEY,
firstName VARCHAR(50),
lastName VARCHAR(50)
);
CREATE TABLE Address (
addressId INT PRIMARY KEY,
personId INT,
city VARCHAR(50),
state VARCHAR(50)
);
INSERT INTO Person (personId, firstName, lastName) VALUES
(1, 'Allen', 'Wang'),
(2, 'Bob', 'Alice'),
(3, 'Charlie', 'Brown');
INSERT INTO Address (addressId, personId, city, state) VALUES
(1, 2, 'New York City', 'New York'),
(2, 3, 'Leetcode', 'California'),
(3, 4, 'Mountain View', 'California');(1) INNER JOIN 示例
返回 Person 和 Address 表中匹配的行:
SELECT p.firstName, p.lastName, a.city, a.state FROM Person p INNER JOIN Address a ON p.personId = a.personId;
結(jié)果:
| firstName | lastName | city | state |
|---|---|---|---|
| Bob | Alice | New York City | New York |
| Charlie | Brown | Leetcode | California |
(2) LEFT JOIN 示例
返回 Person 表中的所有行,以及 Address 表中匹配的行:
SELECT p.firstName, p.lastName, a.city, a.state FROM Person p LEFT JOIN Address a ON p.personId = a.personId;
結(jié)果:
| firstName | lastName | city | state |
|---|---|---|---|
| Allen | Wang | NULL | NULL |
| Bob | Alice | New York City | New York |
| Charlie | Brown | Leetcode | California |
(3) RIGHT JOIN 示例
返回 Address 表中的所有行,以及 Person 表中匹配的行:
SELECT p.firstName, p.lastName, a.city, a.state FROM Person p RIGHT JOIN Address a ON p.personId = a.personId;
結(jié)果:
| firstName | lastName | city | state |
|---|---|---|---|
| Bob | Alice | New York City | New York |
| Charlie | Brown | Leetcode | California |
| NULL | NULL | Mountain View | California |
(4) FULL OUTER JOIN 模擬
MySQL 不支持 FULL OUTER JOIN,但可以通過(guò) UNION 模擬實(shí)現(xiàn):
SELECT p.firstName, p.lastName, a.city, a.state FROM Person p LEFT JOIN Address a ON p.personId = a.personId UNION SELECT p.firstName, p.lastName, a.city, a.state FROM Person p RIGHT JOIN Address a ON p.personId = a.personId;
結(jié)果:
| firstName | lastName | city | state |
|---|---|---|---|
| Allen | Wang | NULL | NULL |
| Bob | Alice | New York City | New York |
| Charlie | Brown | Leetcode | California |
| NULL | NULL | Mountain View | California |
五、連接的性能優(yōu)化
(1) 索引的使用
在連接字段(如 personId)上創(chuàng)建索引,可以顯著提高查詢性能:
CREATE INDEX idx_personId ON Address(personId);
注意:本文的測(cè)試數(shù)據(jù)創(chuàng)建了主鍵,默認(rèn)創(chuàng)建了索引 (2) 查詢優(yōu)化技巧
- 避免使用
SELECT *,明確指定需要的列。 - 使用
EXPLAIN分析查詢計(jì)劃,確保查詢使用了索引。 - 在連接條件中使用等值比較(
=),避免使用復(fù)雜表達(dá)式。
到此這篇關(guān)于MySQL 多表連接(INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN)的文章就介紹到這了,更多相關(guān)MySQL 多表連接內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mysql修改datadir導(dǎo)致無(wú)法啟動(dòng)問(wèn)題解決方法
這篇文章主要介紹了Mysql修改datadir導(dǎo)致無(wú)法啟動(dòng)問(wèn)題解決方法,本文原因是SELINUX導(dǎo)致,用關(guān)閉SELINUX的方法解決了這個(gè)問(wèn)題,需要的朋友可以參考下2015-02-02
解決Mysql 8.0.17 winx64版本安裝過(guò)程中遇到的問(wèn)題
這篇文章主要介紹了Mysql 8.0.17 winx64版本安裝過(guò)程中遇到的問(wèn)題 ,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08
mysql自增navicat_navicat如何設(shè)置主鍵自增
通過(guò)Navicat設(shè)置MySQL表的主鍵自增,步驟包括:打開(kāi)Navicat連接數(shù)據(jù)庫(kù),選擇表并設(shè)計(jì),右擊id字段設(shè)置為主鍵,然后勾選自動(dòng)遞增功能,這樣每次插入新記錄時(shí),id字段都會(huì)自動(dòng)遞增2025-01-01
Mysql 實(shí)現(xiàn)字段拼接的三個(gè)函數(shù)
這篇文章主要介紹了Mysql 實(shí)現(xiàn)字段拼接的三個(gè)函數(shù),幫助大家更好的理解和使用MySQL 數(shù)據(jù)庫(kù),感興趣的朋友可以了解下2020-11-11
DOS命令行窗口mysql中文顯示亂碼問(wèn)題解決方法
MySQL的默認(rèn)編碼是Latin1,不支持中文,如何修改MySQL的默認(rèn)編碼呢,下面為大家詳細(xì)介紹下2014-05-05

