MySQL資料庫表有4種連接方式: 左連接(左外連接) 右連接(右外連接) 等值連接(內連接) 全連接(全外連接) 以下,小編將依次簡要介紹,希望能對初學的小伙伴們有所裨益。 首先先介紹下將要使用的兩張資料庫表 表a 表b 表b中的uid欄位,與表a中id欄位相對應。 表a中id為6的記錄,在表b中 ...
MySQL資料庫表有4種連接方式:
左連接(左外連接)
右連接(右外連接)
等值連接(內連接)
全連接(全外連接)
以下,小編將依次簡要介紹,希望能對初學的小伙伴們有所裨益。
首先先介紹下將要使用的兩張資料庫表
表a
表b
表b中的uid欄位,與表a中id欄位相對應。
表a中id為6的記錄,在表b中沒有體現,表b中id為9,uid為7的記錄在表a中沒有體現。
建表語句如下:
1 SET NAMES utf8mb4; 2 SET FOREIGN_KEY_CHECKS = 0; 3 4 -- ---------------------------- 5 -- Table structure for a 6 -- ---------------------------- 7 DROP TABLE IF EXISTS `a`; 8 CREATE TABLE `a` ( 9 `id` int(11) NOT NULL AUTO_INCREMENT, 10 `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 11 `age` int(11) NOT NULL, 12 `gender` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 13 `psw` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 14 PRIMARY KEY (`id`) USING BTREE 15 ) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; 16 17 -- ---------------------------- 18 -- Records of a 19 -- ---------------------------- 20 INSERT INTO `a` VALUES (1, 'zhangsan', 30, 'f', '123456'); 21 INSERT INTO `a` VALUES (2, 'lisi', 31, 'f', '123456'); 22 INSERT INTO `a` VALUES (3, 'wangwu', 32, 'm', '123456'); 23 INSERT INTO `a` VALUES (4, 'zhaoliu', 33, 'm', '123456'); 24 INSERT INTO `a` VALUES (5, 'baiqi', 34, 'm', '123456'); 25 INSERT INTO `a` VALUES (6, 'hongba', 35, 'f', '123456'); 26 27 SET FOREIGN_KEY_CHECKS = 1;a.sql
1 SET NAMES utf8mb4; 2 SET FOREIGN_KEY_CHECKS = 0; 3 4 -- ---------------------------- 5 -- Table structure for b 6 -- ---------------------------- 7 DROP TABLE IF EXISTS `b`; 8 CREATE TABLE `b` ( 9 `id` int(11) NOT NULL AUTO_INCREMENT, 10 `uid` int(11) NOT NULL, 11 `pet` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 12 PRIMARY KEY (`id`) USING BTREE 13 ) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; 14 15 -- ---------------------------- 16 -- Records of b 17 -- ---------------------------- 18 INSERT INTO `b` VALUES (1, 1, 'cat'); 19 INSERT INTO `b` VALUES (2, 2, 'dog'); 20 INSERT INTO `b` VALUES (3, 1, 'sheep'); 21 INSERT INTO `b` VALUES (4, 3, 'goat'); 22 INSERT INTO `b` VALUES (5, 4, 'dog'); 23 INSERT INTO `b` VALUES (6, 5, 'duck'); 24 INSERT INTO `b` VALUES (7, 5, 'cat'); 25 INSERT INTO `b` VALUES (8, 5, 'rabbit'); 26 INSERT INTO `b` VALUES (9, 7, 'shark'); 27 28 SET FOREIGN_KEY_CHECKS = 1;b.sql
一、左連接
返回左表中的所有記錄 + 右表中與左表連接欄位相等的記錄
例如:
SELECT * FROM `a` left join `b` on a.id = b.uid
其查詢結果為:
由記錄可以發現,
1.返回的結果集的順序是按照被JOIN的後表(表b)的順序顯示
2.表a中所有數據均出現,當表b中出現無法與表a按照既定方式匹配的數據時,表b的欄位顯示為null。例如,表a中id為6的記錄,在表b中不存在uid為6的記錄,因此表b的相應欄位顯示為null。
3.表b中的數據不是全部出現,若b中的uid無法與a中匹配是,該條數據不顯示。例如,表b中id為9,uid為7的記錄,因為表a中不存在id為7的記錄,因此在查詢結果中不顯示該條記錄。
4.第2、3條中可以發現,所有的null值只能出現在後表(表b)的欄位中。
二、右連接
返回右表中的所有記錄 + 左表中與左表連接欄位相等的記錄
例如:
SELECT * FROM `a` right join `b` on a.id = b.uid
查詢結果如下:
由記錄可以發現,
1.返回的結果集的順序是按照被JOIN的表(表b)的順序顯示
2.表b中所有數據均出現,當表a中出現無法與表b按照既定方式匹配的數據時,表a的欄位顯示為null,例如表b中id為9,uid為7的記錄。
3.表a中的數據不是全部出現,若b中的uid無法與a中匹配是,該條數據不顯示。例如表a中id為6的記錄,在表b中並沒有uid為6的記錄,因此不顯示。
4.第2、3條中可以發現,所有的null值只能出現在前表的欄位中
三、等值連接
返回兩個表中,連接欄位相等的值。
例如:
SELECT * FROM `a` inner join b on a.id = b.uid
查詢結果為:
由記錄可以發現,
1.返回的結果集的順序是按照被JOIN的後表(表b)的順序顯示
2.表a、表b均不是出現所有記錄,而是僅返回滿足a.id=b.uid的記錄。a表中id為6的記錄未顯示,b表中id為9,uid為7的記錄未顯示
3.返回的結果集中不存在null值
四、全連接
mysql中不支持全連接,因此需採用union來連接左連接和右連接的結果集
SELECT * FROM `a` left join b on a.id = b.uid UNION SELECT * FROM `a` right join b on a.id = b.uid
查詢結果如下:
1.返回的結果集的順序是按照被JOIN的後表(表b)的順序顯示
2.表a、表b均出現所有記錄,無法按a.id=b.uid匹配的記錄,本表正常顯示,連接表用null值填充,如結果集中最後兩條記錄
具體項目中使用哪種連接,還需要小伙伴們根據需求自己選擇了。