MySQL的三條JOIN子句使用指南
譯文【51CTO.com快譯】眾所周知,關系型數據庫中的每張表都包含了唯一或通用的數據,而且各個表之間都存在著邏輯上的聯系。例如,相同的列名和數據類型,通常會被保存在作為公共值鏈接的表中。因此,我們在進行單個SQL查詢時,JOIN語句往往被用于從共享著公共字段的多張表中,連接并獲取數據。特別是在MySQL中,JOIN被用于聚合那些來自多張表的數據,并將它們整合為單個輸出結果。而且,我們可以在SELECT、UPDATE和DELETE命令中,使用到JOIN。
JOIN入門
MySQL的JOIN類型能夠指明在查詢中,兩個表是如何鏈接的。其中INNER JOIN、OUTER JOIN和CROSS JOIN都是被MySQL支持的三種JOIN子句。而LEFT JOIN和RIGHT JOIN則是兩種不同類型的OUTER JOIN。為了更加直觀地展示該如何使用JOIN,我們首先需要通過如下方式,創建一個新結構模式(schema),以便為后續的操作提供數據示例。
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)
- );
接下來,我們要做的便是向其中插入一些數據。如下面語句所示,您可以根據自己的偏好,在表中插入任意數量的用戶。
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去檢索各種常見的匹配性記錄。例如,INNER JOIN子句可以通過檢索表A和表B中的記錄,為需要滿足某種連接要求而篩選記錄。這也是最常用的JOIN類型。下面的維恩圖可以協助您更好地理解INNER JOIN。
以下是基于MySQL語法的INNER JOIN:
- SELECT
- COLUMNS
- FROM
- tableA
- INNER JOINtableB
- ON tableA.column = tableB.column;
MySQL外部連接
與INNER JOIN相比,OUTER JOIN會生成不匹配(non-matching)的記錄,以及匹配的數據行。也就是說,如果連接表中的數據行并不匹配的話,則會顯示NULL值。如前所述,MySQL有兩種不同形式的OUTER JOIN,它們分別是:MySQL LEFT JOIN和MySQL RIGHT JOIN。下面,讓我們來詳細地了解它們之間的區別。
MySQL LEFT JOIN子句
LEFT JOIN允許您從表A和表B中,獲取滿足連接條件的所有條目。而且,對于表A中不符合條件的記錄,將顯示為NULL值。下面的維恩圖可以協助您更好地理解LEFT JOIN。
以下是基于MySQL語法的LEFT JOIN子句:
MySQL
- COLUMNS
- tableA
- JOINtableB
- ON tableA.column = tableB.column;
如上圖所示:LEFT JOIN關鍵字會返回那些匹配Customers表,而在Orders表中沒有匹配項的所有記錄。
MySQL RIGHT JOIN子句
而RIGHT JOIN則允許用戶獲取表B中的所有條目,以及滿足連接條件在表A中的條目。也就是說,表B中不符合條件的記錄會被顯示為NULL值。下面的維恩圖可以協助您更好地理解RIGHT JOIN。
以下是基于MySQL語法的RIGHT JOIN子句:
MySQL
- SELECT
- COLUMNS
- FROM
- tableA
- RIGHTJOINtableB
- ON tableA.column = tableB.column;
如上圖所示:該RIGHT JOIN關鍵字返回那些匹配Employees表,而在Orders表中沒有匹配項的所有記錄。
MySQL CROSS JOIN子句
MySQL CROSS JOIN通常被稱為笛卡爾連接(cartesian join)。它返回每個表中所有可能性數據行的組合。也就是說,如果不提供額外的條件,那么可將表A的每一行與表B中的所有行相乘,以得到結果集。下面的維恩圖可以協助您更好地理解CROSS JOIN。
那么我們什么時候會需要用到這種JOIN呢?假設您接到一個任務:查找某個產品和顏色的所有可能性組合。那么CROSS JOIN在此時就能夠派上用場了。不過,值得注意的是,CROSS JOIN可能會產生相當大的結果集!
以下是基于MySQL語法的CROSS JOIN子句:
MySQL
- SELECT
- COLUMNS
- FROM
- tableA
- CROSSJOINtableB;
JOIN的技巧
總的說來,在MySQL中,JOIN能夠方便您執行單個JOIN查詢,而省去了許多個簡單的查詢。因此,它能夠帶來更快的速度、更低的服務器開銷、以及更少的MySQL與應用之間的數據傳輸。與SQL Server不同,MySQL雖然沒有用于FULL OUTER JOIN的獨特JOIN類型,但是您可以通過LEFT OUTER JOIN和RIGHT OUTER JOIN(請參照如下語句)的組合,以獲得與FULL OUTER JOIN相同的輸出效果。
MySQL
- SELECT
- *
- FROM
- tableA
- LEFTJOINtableB
- ON tableA.id = tableB.id
- UNION
- SELECT
- *
- FROM
- tableA
- RIGHTJOINtableB
- ON tableA.id = tableB.id
此外,使用MySQL JOIN,您還可以順利地連接上述兩張表。
MySQL
- SELECT
- *
- FROM
- tableA
- LEFTJOINtableB
- ON tableA.id = tableB.id
- LEFTJOINtableC
- ON tableC.id = tableA.id;
JOINS的實用性
- 更快的速度。在單個查詢中,JOINS允許您從兩個或多個鏈接的數據庫表中,獲取數據。顯然,這比通過逐個運行查詢,以獲得相同的結果,要更加節省時間。
- MySQL的效率更高。由于連接是通過索引來執行的,因此JOINS會讓MySQL具有更好的性能。
- 降低了服務器的負載。畢竟JOINS的單次查詢執行,能夠讓服務器更快地輸出結果。
為了能夠在日常工作中靈活地使用JOIN,不少分析師或數據庫管理員(DBA)都會選用Arctype for MySQL之類的工具,去生成復雜、完整的JOIN子句,以避免去記憶那些數百條條列名或別名。此外,此類自動化工具還能夠通過豐富的功能,協助用戶創建復雜的查詢,并能夠輕松地管理JOIN的各項條件。
原文標題:A Guide to MySQL JOINs,作者:Blessing Krofegha
【51CTO譯稿,合作站點轉載請注明原文譯者和出處為51CTO.com】