在單個(gè)查詢中,JOIN 用于從多個(gè)表中獲取數(shù)據(jù)。 在 MySQL 中,JOIN 聚合來(lái)自多個(gè)表的數(shù)據(jù)并將其作為單個(gè)結(jié)果。關(guān)系數(shù)據(jù)庫(kù)中的每張表都包含唯一或通用的數(shù)據(jù),并且每張表都是邏輯連接的。JOIN 用于從共享公共字段的表中獲取數(shù)據(jù)。
在MySQL 中的 JOIN 是什么?
在 MySQL 中,JOIN語(yǔ)句是一種基于這些表中公共字段的值在數(shù)據(jù)庫(kù)中的幾個(gè)表之間連接數(shù)據(jù)的技術(shù)。相同的列名和數(shù)據(jù)類型通常存在于作為公共值鏈接的表中。連接鍵或公共鍵是指共享列。SELECT、UPDATE和DELETE命令都可以使用 JOIN。
JOIN 入門
MySQL JOIN 類型指定查詢中的兩個(gè)表如何鏈接。INNER JOIN、OUTER JOIN和CROSS JOIN是 MySQL 支持的三種 JOIN 子句。LEFT JOINs 和RIGHT JOINs 是兩種不同類型的 OUTER JOIN。為了更直觀地展示 JOIN 如何操作,我們需要?jiǎng)?chuàng)建一個(gè)新模式并插入一些示例數(shù)據(jù)。
MySQL:
CREATE TABLE Users (
UserID int,
UserName varchar(255),
Password varchar(255),
isActive boolean
);
CREATE TABLE Userprofile (
ProfileID int,
LastName varchar(255),
FirstName varchar(255),
Email varchar(255),
Phone varchar(255)
);
接下來(lái)我們要做的是向其中插入一些數(shù)據(jù)。您可以根據(jù)需要在表中插入任意數(shù)量的用戶。
MySQL:
INSERT INTO Users
(UserID, UserName,Password, isActive)
VALUES
(1,'krofax','krofax1234', true);
INSERT INTO userprofile
(profileid, lastname, firstname, email, phone)
VALUES
(1,'Ada', 'George', 'adageorge@gmail.com','1290003456');
MySQL INNER JOIN 子句
使用 INNER JOIN 僅檢索常見(jiàn)的匹配記錄。該INNER JOIN子句將表 A 和表 B 中的記錄檢索限制為滿足連接要求的記錄。它是最常用的 JOIN 類型。檢查下面的維恩圖以更好地理解 INNER JOIN。
以下是 MySQL 的語(yǔ)法INNER JOIN:
MySQL:
SELECT
columns
FROM
tableA
INNER JOIN tableB
ON tableA.column = tableB.column;
MySQL中的外部連接
OUTER JOIN 與 INNER JOIN 相比,產(chǎn)生不匹配的記錄以及匹配的行。如果連接表中的行不匹配,則將顯示 NULL 值。MySQL 有兩種不同形式的 OUTER JOIN: MySQLLEFT JOIN和 MySQL RIGHT JOIN。讓我們更詳細(xì)地了解它們中的每一個(gè)。
MySQL LEFT JOIN 子句
LEFT JOINs 允許您從表 A 和表 B 中獲取滿足連接條件的所有條目。對(duì)于表 A 中不符合條件的記錄,將顯示 NULL 值。檢查下面的維恩圖以更好地理解 LEFT JOIN。
以下是 MySQL 的語(yǔ)法LEFT JOIN:
MySQL:
SELECT
columns
FROM
tableA
LEFT JOIN tableB
ON tableA.column = tableB.column;
注意:該LEFT JOIN關(guān)鍵字返回左表 (Customers) 中的所有記錄,即使右表 (Orders) 中沒(méi)有匹配項(xiàng)。
MySQL 右連接子句
因此,RIGHT JOINs 允許您獲取表 B 中的所有條目以及滿足連接條件的表 A 中的條目。為表 B 中不符合條件的記錄顯示 NULL 值。為了更好地理解 RIGHT JOIN,請(qǐng)參見(jiàn)下面的維恩圖。
以下是 MySQL 的語(yǔ)法RIGHT JOIN:
MySQL:
SELECT
columns
FROM
tableA
RIGHT JOIN tableB
ON tableA.column = tableB.column;
注意:該RIGHT JOIN關(guān)鍵字返回右表 (Employees) 中的所有記錄,即使左表 (Orders) 中沒(méi)有匹配項(xiàng)。
MySQL 交叉連接子句
MySQL CROSS JOIN,通常稱為笛卡爾連接,返回每個(gè)表中所有可能的行組合。如果不提供額外條件,則通過(guò)將表 A 的每一行與表 B 中的所有行相乘得到結(jié)果集。檢查下面的維恩圖以了解有關(guān) CROSS JOINS 的更多信息。
您認(rèn)為什么時(shí)候需要這種 JOIN?例如,假設(shè)您的任務(wù)是查找產(chǎn)品和顏色的所有可能組合。在這種情況下,CROSS JOIN 將非常有用。
注意: CROSS JOIN可能會(huì)導(dǎo)致相當(dāng)大的結(jié)果集!
以下是 MySQL 的語(yǔ)法CROSS JOIN:
MySQL:
SELECT
columns
FROM
tableA
CROSS JOIN tableB;
加入技巧
在 MySQL 中,JOIN 允許您執(zhí)行單個(gè) JOIN 查詢而不是許多簡(jiǎn)單的查詢。因此,您將獲得更高的速度、更低的服務(wù)器開銷以及更少的 MySQL 和您的應(yīng)用程序之間的數(shù)據(jù)傳輸。與 SQL Server 不同,MySQL 沒(méi)有用于 FULL OUTER JOIN 的獨(dú)特 JOIN 類型。但是,您可以組合 LEFT OUTER JOIN 和 RIGHT OUTER JOIN 以獲得與 FULL OUTER JOIN 相同的效果。
MySQL:
SELECT
*
FROM
tableA
LEFT JOIN tableB
ON tableA.id = tableB.id
UNION
SELECT
*
FROM
tableA
RIGHT JOIN tableB
ON tableA.id = tableB.id
使用 MySQL JOIN,您還可以連接兩個(gè)以上的表。
MySQL:
SELECT
*
FROM
tableA
LEFT JOIN tableB
ON tableA.id = tableB.id
LEFT JOIN tableC
ON tableC.id = tableA.id;
為什么 JOINS 這么有用?
- 比較快是一個(gè)特點(diǎn)。在單個(gè)查詢中,JOINS 允許您從兩個(gè)或多個(gè)鏈接的數(shù)據(jù)庫(kù)表中獲取數(shù)據(jù)。JOINS 非常有價(jià)值,因?yàn)樗鼈儽纫粋€(gè)一個(gè)地運(yùn)行查詢來(lái)獲得相同的結(jié)果節(jié)省了時(shí)間。
- MySQL 效率更高。使用 JOINS 的另一個(gè)優(yōu)點(diǎn)是 MySQL 性能更好,因?yàn)檫B接是通過(guò)索引執(zhí)行的。
- 使用 JOINS 降低了服務(wù)器負(fù)載。因?yàn)槟阒粓?zhí)行一個(gè)查詢,你會(huì)得到更好更快的結(jié)果。
任何分析師或 DBA 都必須牢牢掌握 JOIN 并在日常工作中自由地使用它們。這就是 Arctype for MySQL 派上用場(chǎng)的時(shí)候了。即使對(duì)于復(fù)雜的 JOIN 子句,其復(fù)雜的代碼完成也能完美運(yùn)行。Arctype for MySQL 將為您提供完整的 JOIN 子句,因此您不必記住數(shù)百個(gè)列名或別名。其功能豐富的功能使創(chuàng)建復(fù)雜的查詢和管理 JOIN 條件變得輕而易舉。