码迷,mamicode.com
首页 > 数据库 > 详细

MySQL 表连接

时间:2018-09-18 16:05:27      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:表连接   lis   显示   语句   names   _for   from   collate   play   

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值填充,如结果集中最后两条记录

 

具体项目中使用哪种连接,还需要小伙伴们根据需求自己选择了。

MySQL 表连接

标签:表连接   lis   显示   语句   names   _for   from   collate   play   

原文地址:https://www.cnblogs.com/wulisz/p/9668908.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!