mysql多表查询

 

1.背景介绍

 

在任务一里,我们已经对mysql数据库的基本sql有了一定了解,也能使用基于单表的sql操作来完成修真院的Java任务,然而实际项目中,我们所需要的数据往往存在于多张表中,那么基本的单表查询语句就显得力不从心了(当然也可以选择单表多次查,但开发效率大打折扣)

什么是多表查询

多表查询就是从多张表中查找出所需的数据,并且按照自己设定的约束条件将两表中查出的数据整合在一起获取出来

表之间的关系到底是怎样确立的?

表的关联,只是一种逻辑概念,mysql并没有强大到可以帮我们完美实现物理上的“硬绑定”,这种关联的逻辑实际上只是表中某些数据存在一定的联系而已(比如设公共字段,建关联表等),而这种数据上的联系是我们在设计表的时候定好的逻辑

如何只用一条sql语句就查出几张不同表中的数据呢?

笛卡尔积(又名交叉连接)

笛卡尔操积作的最大作用是把任意两个表连接起来。假设2张表,笛卡尔积就是2张表的所有记录的排列组合,比如: select * from 表1,表2——这就是 表1,表2的笛卡尔积。但是,实际情况中,真正使用的绝大部分都是它的子集(即2表是有关联条件的),只有在极特殊开应用景下才会用笛卡尔积作为最终结果

2.知识剖析

多表连接有哪些分类?针对这些分类有哪些连接方法?

A)内连接:inner join

B)外连接:left outer join,right outer join,union

C)交叉连接:cross join

内连接

语法:select 列from 表1 别名 inner join 表2 别名 on 表1.列=表2.列,...

from开始,表1与表2进行笛卡尔积,每匹配一行的数据,就会通过on后条件判断

                是否成立,就将该行匹配的信息存放到临时表,否则不存放

外连接

左外连接:左表中所有的记录都会被放到结果集中,无论是否在右表是否存在匹配记录

语法:select 列

                from 表1 left outer join 表2 on 表1.列=表2.列

右外连接:不管是否成功匹配连接条件都会返回右表中的所有记录

语法: select 列

            from 表1 right outer join 表2 on 表1.列=表2.列

自连接

自连接比较特殊,一般反映记录的优先级的关系,在逻辑上看来像是查询了多次同一张表

子查询

把内层查询结果当作外层查询的比较条件,一个select...From...Where查询语句块可以嵌套在另一个select...From...Where查询块的Where子句中,又称为嵌套查询。外层查询称为父查询,主查询。内层查询称为子查询,从查询。子查询可以嵌套多层,子查询查询到的结果又成为父查询的条件,先处理子查询,再处理父查询。

3.常见问题

约束

数据库中的完整性约束用来防止对数据的意外破坏,来保证数据的安全性和一致性。

                    通常我们都需要对数据库的某些列加上合适的约束来防止程序bug等导致的数据不一致,因为这类数据不一致的问题排查起来很困难

表中的约束

主键约束、唯一约束、非空约束等

表间的约束

外键约束(又名参照完整性约束)

作用:保持数据的一致性、完整性

5.编码实战

6.扩展思考

对于单表多次查询和多表联查(join)的各自优势

在业务逻辑不是十分复杂的情况下,绝大多数join是可以使用多次查询替代的。它们的区别在我看来其实就是:使用join偏向于使用sql语句来处理数据间的逻辑问题,多次查询偏向于使用程序代码来解决数据间的逻辑问题  迫使人使用程序代码代替SQL语句来处理问题

单表多次查询的优势

1、高并发场景下的资源消耗低

2、降低了业务之间的耦合度

3、可扩展性强

多表联查(join)的优势

1、低并发场景下开发效率高

2、频繁复杂数据读写的一致性和完整性高

3、对开发人员的能力要求相对低些

7.参考文献

1.知乎:https://zhuanlan.zhihu.com/p/24659011

2.CSDN博客:https://blog.csdn.net/jintao_ma/article/details/51260458

8.更多讨论

今天的分享就到这里啦,欢迎大家提问和探讨!

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值