数据库中的内连接,外连接,交叉连接的区别

内连接:指连接结果仅包含符合连接条件的行,参与连接的两个表都应该符合连接条件。

外连接:连接结果不仅包含符合连接条件的行同时也包含自身不符合条件的行,外连接包括左外连接、右外连接和全外连接。

用一张题来说明他们之间的关系。

在这里插入图片描述

下面具体说一下他们之间的用法:

内连接包括等值连接,不等值连接和自然连接,由于后两个用的很少,这里就不做叙述了。
等值连接:在连接条件中使用等于号(=)运算符,其查询结果中列出被连接表中的所有列,包括其中的重复列。

内连接中等值连接的例子:

在这里插入图片描述

mysql> select * from student s,score c where s.name=c.name;
+-----+------+-------+------+-------+
| num | name | class | name | grade |
+-----+------+-------+------+-------+
|   2 | jack |     1 | jack |    98 |
|   4 | pony |     2 | pony |    85 |
|   5 | rose |     1 | rose |    81 |
+-----+------+-------+------+-------+
3 rows in set (0.04 sec)

此等值连接等价于 select * from student s inner join score c on s.name=c.name;

左外连接:返回左表中的所有行,如果左表中行在右表中没有匹配行,则结果中右表中的列返回空值。

mysql> select * from student s left join score c on  s.name=c.name;
+-----+------+-------+------+-------+
| num | name | class | name | grade |
+-----+------+-------+------+-------+
|   2 | jack |     1 | jack |    98 |
|   4 | pony |     2 | pony |    85 |
|   5 | rose |     1 | rose |    81 |
|   1 | tom  |     2 | NULL | NULL  |
|   3 | mary |     3 | NULL | NULL  |
+-----+------+-------+------+-------+
5 rows in set (0.05 sec)

这里可以看到student表中的数据已经完全返回,对于没有和坐标匹配上的数据用Null值代替。

右外连接:与左外连接相反,返回右表中的所有行,如果右表中行在左表中没有匹配行,则结果中左表中的列返回空值。

mysql> select * from student s right join score c on  s.name=c.name;
+------+------+-------+------+-------+
| num  | name | class | name | grade |
+------+------+-------+------+-------+
|    2 | jack |     1 | jack |    98 |
|    4 | pony |     2 | pony |    85 |
|    5 | rose |     1 | rose |    81 |
| NULL | NULL | NULL  | bill |    74 |
+------+------+-------+------+-------+
4 rows in set (0.05 sec)

mysql> 

全外连接:不管匹配不匹配,全部显示出来,左表在右边没有的显示NULL,右表在左边没有的显示NULL。
按照正常情况下全外连接应该是select * from student s full join score c on s.name=c.name; 但是mysql并不支持全外连接,所以我们用union来代替full

mysql> select * from student s left join score c on  s.name=c.name
    -> union   select * from student s right join score c on  s.name=c.name;
+------+------+-------+------+-------+
| num  | name | class | name | grade |
+------+------+-------+------+-------+
|    2 | jack |     1 | jack |    98 |
|    4 | pony |     2 | pony |    85 |
|    5 | rose |     1 | rose |    81 |
|    1 | tom  |     2 | NULL | NULL  |
|    3 | mary |     3 | NULL | NULL  |
| NULL | NULL | NULL  | bill |    74 |
+------+------+-------+------+-------+
6 rows in set (0.05 sec)

mysql> 

交叉连接:也成为了笛卡尔积,因为相对于内连接来讲他缺少了连接条件,它返回的是两个表行数的乘积,所以为了避免笛卡尔积的出现,当我们进行两张表或者多张表连接时一定要加上最后的连接条件。

mysql> select * from student,score;
+-----+------+-------+------+-------+
| num | name | class | name | grade |
+-----+------+-------+------+-------+
|   1 | tom  |     2 | bill |    74 |
|   1 | tom  |     2 | jack |    98 |
|   1 | tom  |     2 | pony |    85 |
|   1 | tom  |     2 | rose |    81 |
|   2 | jack |     1 | bill |    74 |
|   2 | jack |     1 | jack |    98 |
|   2 | jack |     1 | pony |    85 |
|   2 | jack |     1 | rose |    81 |
|   3 | mary |     3 | bill |    74 |
|   3 | mary |     3 | jack |    98 |
|   3 | mary |     3 | pony |    85 |
|   3 | mary |     3 | rose |    81 |
|   4 | pony |     2 | bill |    74 |
|   4 | pony |     2 | jack |    98 |
|   4 | pony |     2 | pony |    85 |
|   4 | pony |     2 | rose |    81 |
|   5 | rose |     1 | bill |    74 |
|   5 | rose |     1 | jack |    98 |
|   5 | rose |     1 | pony |    85 |
|   5 | rose |     1 | rose |    81 |
+-----+------+-------+------+-------+
20 rows in set (0.06 sec)

mysql> 
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值