mysql中谓语_详解 MySQL 数据库连接

引言

上次博文引用了各连接的示意图,未做详述,本文补充对数据库各连接的实例描述。

bVbC81O

举个栗子

数据

数据为klass与student的关系,班级一对多学生,没有加外键。

bVbDpAY

89e90bcf7c8707ca16a5cc904726da09.png

数据关系如下:1班的Hello Kitty和史努比,2班的米老鼠和唐老鸭,3班没学生,葫芦娃没有班级。

f645e0a432acf4331e4e32ccc6fc629f.png

何为连接?

关系型数据库,即数据之间是有所关系的。

就如我们当前场景下的klass与student表一样,两表中的数据在实际的业务场景中是有所关联的,学生属于哪个班级,这种多对一的关系,我们在学生表中加上klass_id一列存储这种关系。

班级与学生的关系通过klass_id进行维护。

简单的单表查询:

SELECT *

FROM `klass`;

74afe1b49da0ac674db44380b45927ef.png

如果想同时看教师和班级的数据,就需要进行多表查询了:

SELECT `klass`.`name` as `klass_name`, `student`.`name` as `student_name`

FROM `klass`, `student`

WHERE `klass`.`id` = `student`.`klass_id`;

c6e887f24ac04936c914615d348cee76.png

How it works?

进行多表查询时,其实是将两表的记录先做笛卡尔积,再根据WHERE条件对数据进行过滤。

不加WHERE条件的示例:

SELECT `klass`.`name` as `klass_name`, `student`.`name` as `student_name`

FROM `klass`, `student`;

da70cd8c7116bc203a2aad391a9d40c6.png

很惭愧,从我学数据库到现在,每次我手写这样需求的SQL,都是使用的这种方法进行多表查询。

Better?

试想,如果我们所有的多表查询,都使用WHERE进行过滤,这会造成一个很严重的问题。

如果查询条件很复杂的话,会导致WHERE语句不仅充斥着数据表层面的连接条件,还充斥着各种业务条件,会让WHERE语句很不直观。

SELECT `klass`.`name` as `klass_name`, `student`.`name` as `student_name`

FROM `klass`, `student`

WHERE `klass`.`id` = `student`.`klass_id`;

这种场景下推荐使用内连接代替WHERE。

内连接可更好地完成上述需求:

SELECT `klass`.`name` as `klass_name`, `student`.`name` as `student_name`

FROM `klass`

INNER JOIN `student`

ON `klass`.`id` = `student`.`klass_id`;

bVbDq7i

并且,连接的条件写在ON里,WHERE只写业务条件,更直观。

0b11fb55b5d8288afe50d42c1a5b29bb.png

左连接/右连接

内连接:内连接基于连接谓词将两张表(如 A 和 B )的列组合在一起,产生新的结果表。查询会将 A 表的每一行和 B 表的每一行进行比较,并找出满足连接谓词的组合。当连接谓词被满足,A 和 B 中匹配的行会按列组合(并排组合)成结果集中的一行。

示例数据有三个班,但是3班因为没有任何学生与之关联,所以不符合查询谓语中的klass.id = student.klass_id,所以没有3班的信息。

同样地,因为学生“葫芦娃”没有班级,也不符合查询条件,同样没有出现在内连接的查询 结果中。

注:在表连接中NULL != NULL

b90899010946506aaa7751008992a6a5.png

如果想让数据显示完全,就需要左连接与右连接了。

382f1cc3d7504383ae57f5f30de09855.png

klass表连接student表,klass算左表,student算右表。

左连接,显示左表所有数据:

SELECT `klass`.`name` as `klass_name`, `student`.`name` as `student_name`

FROM `klass`

LEFT JOIN `student`

ON `klass`.`id` = `student`.`klass_id`;

3班在左连接中出现了:

c792f07f2c173820947c5e8f7f93e107.png

右连接,显示右表所有数据:

SELECT `klass`.`name` as `klass_name`, `student`.`name` as `student_name`

FROM `klass`

RIGHT JOIN `student`

ON `klass`.`id` = `student`.`klass_id`;

“葫芦娃”在右连接中出现了:

72a6cd0f4b1b383f5fdc3634c3c933eb.png

总结

宝剑锋从磨砺出,梅花香自苦寒来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值