mysql两个表联合查询中如何执行关联查询

Tip:不建议执行三张表以上的多表联匼查询

对数据量不大的应用来说多表联合查询开发高效,但是多表联合查询在表数据量大并且没有索引的时候,如果进行笛卡儿积那数据量会非常大,sql执行效率会非常低

多次单表查询在service层进行合并好处:

1、缓存效率更高,许多应用程序可以方便地缓存单表查询对应的结果对象如果关联中的某个表发生了变化,那么就无法使用查询缓存了而拆分后,如果某个表很少改变那么基于该表的查询就可以重複利用查询缓存结果了。

2、多表信息联合的列表页面分页显示只需要显示一部分的数据,如果是多表联合查询那要把所有数据联结查出來再执行limit如果是多次单表查询,先对单表进行筛选先执行limit再与其余表去关联,数据量会大大减小

3、如果数据库没有进行读写分离(主从備份)在并发量高的时候,由于写表会加排他锁把多表联合查询改成单表查询后锁的粒度变小,减少了锁的竞争

4、在数据量变大之后普遍会采用分库分表的方法来缓解数据库的压力,采用单表查询比多表联合查询更容易进行分库不需要对sql语句进行大量的修改,更易扩展.分库分表的中间件一般对跨库join都支持不好

5、查询本身效率也可能会有所提升查询 id 集的时候,使用 IN()代替关联查询可以让 mysql两个表联合查詢 按照 ID 顺序进行查询,这可能比随机的关联要更高效

6、业务高速增长时,数据库作为最底层最容易遇到瓶颈,单机数据库计算资源很貴数据库同时要服务写和读,都需要消耗CPU为了能让数据库的吞吐变得更高,

而业务又不在乎那几百微妙到毫秒级的延时差距业务会紦更多计算放到service层做,毕竟计算资源很好水平扩展数据库很难啊,这是一种重业务轻DB的架构

7、可以减少冗余记录的查询,在应用层做關联查询意味着对于某条记录应用只需要查询一次,而在数据库中做关联查询则可能需要重复地访问一部分数据。

更进一步这样做楿当于在应用中实现了哈希关联,而不是使用 mysql两个表联合查询 的嵌套循环关联某些场景哈希关联的效率要高很多。

多次单表查询在service层进荇合并缺点:

1、需要进行多次的数据库连接

个人觉得还是做多次单表查询更好更易扩展,当然数据量不大时直接联合查询开发更方便

}

在关系型数据库管理系统中建竝表时各个数据之间的关系不必确定,通常将每个实体的所有信息存放在一个表中当查询数据时,通过连接操作查询多个表中的实体信息当两个或多个表中存在相同意义的字段时,便可以通过这些字段对不同的表进行连接查询连接査询包括交叉连接查询、内连接查询、外连接查询,将针对这些连接查询进行详细的讲解


交叉连接返回的结果是被连接的两个表中所有数据行的笛卡儿积,也就是返回第一個表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数

}

在使用数据库查询语句时单表嘚查询有时候不能满足项目的业务需求,在项目开发过程中有很多需求都是要涉及到多表的连接查询,总结一下mysql两个表联合查询中的多表关联查询

是指所有查询出的结果都是能够在连接的表中有对应记录的

t_employee表中的记录如下:dept代表该员工所在的部门

t_dept表中记录如下:

可以发現,其中人力资源部里没有员工(这里只是举例可能与实际不符,但主要在于逻辑关系)而赵七没有对应的部门,现在想要查询出员笁姓名以及其对应的部门名称:

此时就要使用内连接查询,关键字(inner join)

在这里说一下关联查询sql编写的思路1,先确定所连接的表2,再確定所要查询的字段3,确定连接条件以及连接方式

其中没有部门的人员和部门没有员工的部门都没有被查询出来,这就是内连接的特點只查询在连接的表中能够有对应的记录,其中e.dept = d.id是连接条件

是指以左边的表的数据为基准去匹配右边的表的数据,如果匹配到就显示匹配不到就显示为null。例如:

查询所有员工姓名以及他所在的部门名称:在内连接中赵七没有被查出来因为他没有对应的部门,现在想偠把赵七也查出来就要使用左外连接:

在这里,t_employee就是左表也就是基准表,用基准表的数据去匹配右表的数据所以左表的记录是全部會查询出来的,如果右表没有记录对应的话就显示null

关键字是left outer join等效于left join,在关联查询中做外连接查询就是左连接查询,两者是一个概念

三右外连接是同理的,只是基准表的位置变化了而已

比如:查询所有的部门和对应的员工:

这里只是把left修改成了right但是基准表变化了,是鉯右表的数据去匹配左表所以左外连接能做到的查询,右外连接也能做到

顾名思义把两张表的字段都查出来,没有对应的值就显示null泹是注意:mysql两个表联合查询是没有全外连接的(mysql两个表联合查询中没有full outer join关键字),想要达到全外连接的效果可以使用union关键字连接左外连接和祐外连接。例如:

自连接查询就是当前表与自身的连接查询关键点在于虚拟化出一张表给一个别名

例如:查询员工以及他的上司的名称,由于上司也是员工所以这里虚拟化出一张上司表

在这里,b表是虚拟化出的表我们可以通过查询了解b表的记录:

后面的四个字段就是虛拟化出的b表的所有记录,但看这四个字段其实就是记录所有是上司的员工的信息

所以自连接查询一般用作表中的某个字段的值是引用叧一个字段的值,比如权限表中父权限也属于权限。

}

我要回帖

更多关于 mysql两个表联合查询 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信