重学MYSQL之联结表

数据库 2020-09-08 838

理解联结表,必须先了解基本知识。

1.关系表

比如设计博客表时,博客的类型可以是直接放在博客表中,但是这会存在一个问题,很多博客的类型其实是相同的,每次创建文章都重写一遍过于麻烦,且如果要修改1种类型,必须一个个修改,这是无法忍受的,最好的方式就是单独建立一个博客类型表,通过字段与博客表建立关系,这样可以修改,引用都会方便很多。

2.为什么使用联结

将数据分解为多个表能有效地存储,更方便的管理,可伸缩性(能适应不断增加的工作量而不失败)也更好。

但是分散的表,对于汇总数据比较麻烦,这时就引出-联结了。联结是一种机制,用来在一条SELECT语句中关联表,因此称为联结。使用特殊的语法,可以联结多个表返回一组输出,联结在运行时关联表中的正确的行。

3.创建联结

创建联结非常简单,指定要联结的所有表以及关联它们的方式即可。

例子如下:

SELECT title, readNum, category FROM 
blog_blogmodel, blog_blogtype WHERE blog_blogmodel.category_id = blog_blogtype.id;

从blog表中查询标题,阅读数,和博客类型(在type表中),从上面可以看出写出要查询的字段和字段所在的表,该语句就成功了一半,关键在于WHERE子句,在blog表中category_id对应type表中的id,这就是关联方式(这两个使用外键联结).

效果:

4.WHERE子句的重要性

联结两个表时,实际要做的是将第一个表中的每一行与第二个表中的每一行配对。WHERE子句作为过滤条件,只包含那些匹配给定条件(这里是联结条件)的行。没有WHERE子句,第一个表中的每一行将与第二个表中的每一行配对,而不管它们逻辑上是否能配在一起。

笛卡尔积:由没有联结条件的表关系返回的结果为笛卡尔积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。

没有WHERE子句时的结果:

从上面的输出可以看出,相应的笛卡尔积不是我们想要的。

提示:有时,返回笛卡尔积的联结,也称为叉联结

5.内联结

目前为止使用的联结为等值联结,它基于两表之间的相等测试。这种联结也称为内联结(inner join)。可以对这种联结用稍微不同的语法,明确指定联结的类型。下面的例子与前面的例子的返回结果完全相同。

SELECT title, readNum, category, category_id FROM blog_blogmodel INNER JOIN blog_blogtype ON
blog_blogmodel.category_id = blog_blogtype.id;

使用INNER JOIN这种语法是SQL推荐的写法,但是相对于之前的语法来说比较复杂,具体使用看自己的选择。

6.联结多个表

SELECT不限制使用联结表的数量。但是指定的联结表多了,会产生严重的性能问题。

标签:数据库

文章评论

评论列表

已有0条评论