mysql right join实例_MySQL 左连接left join、右连接right join、内连接inner join、全连接union使用实例讲解...

MySQL数据库表有4种连接方式:

左连接(左外连接)

右连接(右外连接)

等值连接(内连接)

全连接(全外连接)

以下,小编将依次简要介绍,希望能对初学的小伙伴们有所裨益。

首先先介绍下将要使用的两张数据库表

表a

6632b0315ee4cca4ebf249c7a76f3095.png

表b

51004021a6abd13056ea9696e62af1c4.png

表b中的uid字段,与表a中id字段相对应。

表a中id为6的记录,在表b中没有体现,表b中id为9,uid为7的记录在表a中没有体现。

建表语句如下:

9c315387f480b8f09e9da28d3a659fb0.gif

1336310940e7e2098d6151b4e667881b.gif

1 SETNAMES 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 NULLAUTO_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 BTREE15 ) 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

9c315387f480b8f09e9da28d3a659fb0.gif

1336310940e7e2098d6151b4e667881b.gif

1 SETNAMES 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 NULLAUTO_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 BTREE13 ) 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

其查询结果为:

978326a78ba1b6fdd26601031ab92b91.png

由记录可以发现,

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

查询结果如下:

0c65df25a17f86cae0db6b88a35b4370.png

由记录可以发现,

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

查询结果为:

0c783f58735e70179bf6a1d0cb2afe73.png

由记录可以发现,

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.uidUNION

SELECT * FROM `a` right join b on a.id = b.uid

查询结果如下:

31e515f6a4df71f433549fb578c8ecf9.png

1.返回的结果集的顺序是按照被JOIN的后表(表b)的顺序显示

2.表a、表b均出现所有记录,无法按a.id=b.uid匹配的记录,本表正常显示,连接表用null值填充,如结果集中最后两条记录

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Mysql数据库中左连接left join右连接right join内连接inner join的介绍和演示: 1. 左连接left join 左连接left join会返回左表中所有的记录,以及右表中符合条件的记录。如果右表中没有符合条件的记录,则返回NULL。 语法: ``` SELECT * FROM a_table LEFT JOIN b_table ON a_table.key = b_table.key; ``` 示例: 假设有两个表,一个是学生表students,一个是成绩表scores。学生表中有学生的ID和姓名,成绩表中有学生的ID和成绩。我们需要查询所有学生的姓名和成绩,如果学生没有成绩,则成绩为NULL。 ```sql SELECT students.name, scores.score FROM students LEFT JOIN scores ON students.id = scores.id; ``` 2. 右连接right join 右连接right join会返回右表中所有的记录,以及左表中符合条件的记录。如果左表中没有符合条件的记录,则返回NULL。 语法: ``` SELECT * FROM a_table RIGHT JOIN b_table ON a_table.key = b_table.key; ``` 示例: 假设有两个表,一个是学生表students,一个是成绩表scores。学生表中有学生的ID和姓名,成绩表中有学生的ID和成绩。我们需要查询所有成绩和对应的学生姓名,如果成绩表中没有对应的学生,则姓名为NULL。 ```sql SELECT students.name, scores.score FROM students RIGHT JOIN scores ON students.id = scores.id; ``` 3. 内连接inner join 内连接inner join会返回左右表中都符合条件的记录。 语法: ``` SELECT * FROM a_table INNER JOIN b_table ON a_table.key = b_table.key; ``` 示例: 假设有两个表,一个是学生表students,一个是成绩表scores。学生表中有学生的ID和姓名,成绩表中有学生的ID和成绩。我们需要查询所有有成绩的学生的姓名和成绩。 ```sql SELECT students.name, scores.score FROM students INNER JOIN scores ON students.id = scores.id; ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值