mysql 多表查询

这里是修真院后端小课堂,每篇分享文从

【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】

八个方面深度解析后端知识/技能,本篇分享的是:

【mysql 多表查询】

标题:【修真院java(职业)小课堂】mysql 多表查询

大家好,我是IT修真院武汉分院的15期学员,一枚正直纯洁善良的JAVA程序员。 本次为大家带来关于深度思考的一个问题,我们为什么要使用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等导致的数据不一致,因为这类数据不一致的问题排查起来很困难

(4)解决方案:

表中的约束

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

表间的约束

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

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

(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)更多讨论:

问题1.关系数据库的三范式?

一范式就是属性不可分割,原子性。

二范式就是要有主键,要求其他字段都依赖于主键。

三范式就是要消除传递依赖,方便理解,可以看做是“消除冗余”

问题2.MySQL中如何使用全外链接?

mysql中是不支持全连接的,MySQL中实现全连接的方式是使用UNION关键词联合左右连接来实现

问题3.查询过多的话多表怎么去重?

要注意多加限制语句,数据库设计要规范

(9)鸣谢:

感谢娄文斌师兄,此教程是在他们之前技术分享的基础上完善而成。

(10)结束语:

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

PPT链接 视频链接

更多内容,可以加入IT交流群565734203与大家一起讨论交流

这里是技能树·IT修真院:,初学者转行到互联网的聚集地

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 目录 连接 连接池产生原因 连接池实现原理 小结 TEMPERANCE:Eat not to dullness;drink not to elevation.节制
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 一个优秀的工程师和一个普通的工程师的区别,不是满天飞的架构图,他的功底体现在所写的每一行代码上。-- 毕玄 1. 命名风格 【书摘】类名用 UpperCamelC
今天犯了个错:“接口变动,伤筋动骨,除非你确定只有你一个人在用”。哪怕只是throw了一个新的Exception。哈哈,这是我犯的错误。一、接口和抽象类类,即一个对象。先抽象类,就是抽象出类的基础部分,即抽象基类(抽象类)。官方定义让人费解,但是记忆方法是也不错的 —包含抽象方法的类叫做抽象类。接口
Writer :BYSocket(泥沙砖瓦浆木匠)微 博:BYSocket豆 瓣:BYSocketFaceBook:BYSocketTwitter :BYSocket一、引子文件,作为常见的数据源。关于操作文件的字节流就是 —FileInputStream&FileOutputStream。
作者:泥沙砖瓦浆木匠网站:http://blog.csdn.net/jeffli1993个人签名:打算起手不凡写出鸿篇巨作的人,往往坚持不了完成第一章节。交流QQ群:【编程之美 365234583】http://qm.qq.com/cgi-bin/qm/qr?k=FhFAoaWwjP29_Aonqz
本文目录 线程与多线程 线程的运行与创建 线程的状态 1 线程与多线程 线程是什么? 线程(Thread)是一个对象(Object)。用来干什么?Java 线程(也称 JVM 线程)是 Java 进程内允许多个同时进行的任务。该进程内并发的任务成为线程(Thread),一个进程里至少一个线程。 Ja
Writer :BYSocket(泥沙砖瓦浆木匠)微 博:BYSocket豆 瓣:BYSocketFaceBook:BYSocketTwitter :BYSocket在面向对象编程中,编程人员应该在意“资源”。比如?1String hello = "hello"; 在代码中,我们
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 这是泥瓦匠的第103篇原创 《程序兵法:Java String 源码的排序算法(一)》 文章工程:* JDK 1.8* 工程名:algorithm-core-le
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 目录 一、父子类变量名相同会咋样? 有个小故事,今天群里面有个人问下面如图输出什么? 我回答:60。但这是错的,答案结果是 40 。我知错能改,然后说了下父子类变
作者:泥瓦匠 出处:https://www.bysocket.com/2021-10-26/mac-create-files-from-the-root-directory.html Mac 操作系统挺适合开发者进行写代码,最近碰到了一个问题,问题是如何在 macOS 根目录创建文件夹。不同的 ma
作者:李强强上一篇,泥瓦匠基础地讲了下Java I/O : Bit Operation 位运算。这一讲,泥瓦匠带你走进Java中的进制详解。一、引子在Java世界里,99%的工作都是处理这高层。那么二进制,字节码这些会在哪里用到呢?自问自答:在跨平台的时候,就凸显神功了。比如说文件读写,数据通信,还
1 线程中断 1.1 什么是线程中断? 线程中断是线程的标志位属性。而不是真正终止线程,和线程的状态无关。线程中断过程表示一个运行中的线程,通过其他线程调用了该线程的 方法,使得该线程中断标志位属性改变。 深入思考下,线程中断不是去中断了线程,恰恰是用来通知该线程应该被中断了。具体是一个标志位属性,
Writer:BYSocket(泥沙砖瓦浆木匠)微博:BYSocket豆瓣:BYSocketReprint it anywhere u want需求 项目在设计表的时候,要处理并发多的一些数据,类似订单号不能重复,要保持唯一。原本以为来个时间戳,精确到毫秒应该不错了。后来觉得是错了,测试环境下很多一
纯技术交流群 每日推荐 - 技术干货推送 跟着泥瓦匠,一起问答交流 扫一扫,我邀请你入群 纯技术交流群 每日推荐 - 技术干货推送 跟着泥瓦匠,一起问答交流 扫一扫,我邀请你入群 加微信:bysocket01
Writer:BYSocket(泥沙砖瓦浆木匠)微博:BYSocket豆瓣:BYSocketReprint it anywhere u want.文章Points:1、介绍RESTful架构风格2、Spring配置CXF3、三层初设计,实现WebService接口层4、撰写HTTPClient 客户
Writer :BYSocket(泥沙砖瓦浆木匠)什么是回调?今天傻傻地截了张图问了下,然后被陈大牛回答道“就一个回调…”。此时千万个草泥马飞奔而过(逃哈哈,看着源码,享受着这种回调在代码上的作用,真是美哉。不妨总结总结。一、什么是回调回调,回调。要先有调用,才有调用者和被调用者之间的回调。所以在百
Writer :BYSocket(泥沙砖瓦浆木匠)一、什么大小端?大小端在计算机业界,Endian表示数据在存储器中的存放顺序。百度百科如下叙述之:大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加
What is a programming language? Before introducing compilation and decompilation, let's briefly introduce the Programming Language. Programming la
Writer :BYSocket(泥沙砖瓦浆木匠)微 博:BYSocket豆 瓣:BYSocketFaceBook:BYSocketTwitter :BYSocket泥瓦匠喜欢Java,文章总是扯扯Java。 I/O 基础,就是二进制,也就是Bit。一、Bit与二进制什么是Bit(位)呢?位是CPU
Writer:BYSocket(泥沙砖瓦浆木匠)微博:BYSocket豆瓣:BYSocket一、前言 泥瓦匠最近被项目搞的天昏地暗。发现有些要给自己一些目标,关于技术的目标:专注很重要。专注Java 基础 + H5(学习) 其他操作系统,算法,数据结构当成课外书博览。有时候,就是那样你越是专注方面越