MySql 内连接,外连接查询方式区别

MySql 内连接,外连接查询方式

CREATE TABLE `question_test` (`q_id` int(11) DEFAULT NULL,`q_name` varchar(10) DEFAULT NULL,`q_part` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8CREATE TABLE `answer_test` (`a_id` int(11) DEFAULT NULL,`a_name` varchar(10) DEFAULT NULL,`a_part` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8INSERT INTO `zhenai_qa`.`answer_test` (`a_id`, `a_name`, `a_part`) VALUES (2, '回答二', '答案二');
INSERT INTO `zhenai_qa`.`answer_test` (`a_id`, `a_name`, `a_part`) VALUES (3, '回答三', '答案三');
INSERT INTO `zhenai_qa`.`answer_test` (`a_id`, `a_name`, `a_part`) VALUES (5, '回答五', '答案五');
INSERT INTO `zhenai_qa`.`answer_test` (`a_id`, `a_name`, `a_part`) VALUES (6, '回答六', '答案六');INSERT INTO `zhenai_qa`.`question_test` (`q_id`, `q_name`, `q_part`) VALUES (1, '问题一', '描述一');
INSERT INTO `zhenai_qa`.`question_test` (`q_id`, `q_name`, `q_part`) VALUES (2, '问题二', '描述二');
INSERT INTO `zhenai_qa`.`question_test` (`q_id`, `q_name`, `q_part`) VALUES (3, '问题三', '描述三');
INSERT INTO `zhenai_qa`.`question_test` (`q_id`, `q_name`, `q_part`) VALUES (4, '问题四', '描述四');
  • 建如上数据库,初始化测试数据。
  1. 内连接

[外链图片转存失败(img-wAT4WHmo-1562061066256)(E:\learn\learn笔记\技术相关\mysql1.jpg)]

  • 内连接会查询出answer_test表和question_test表中交集部分的数据如下

[外链图片转存失败(img-G7w9OhGL-1562061066257)(E:\learn\learn笔记\技术相关\mysql2.jpg)]

  1. 左外连接

[外链图片转存失败(img-S9VJlfEf-1562061066257)(E:\learn\learn笔记\技术相关\mysql3.jpg)]

  • 以左表为基准查右表的数据: 也就是左表的数据全查询出,并且会查询出右表中符合要求的数据,不存在的数据补null

[外链图片转存失败(img-wqsQqhXh-1562061066257)(E:\learn\learn笔记\技术相关\mysql4.jpg)]

  1. 右外连接

[外链图片转存失败(img-mNOIhl7j-1562061066258)(E:\learn\learn笔记\技术相关\mysql5.jpg)]

  • 和左外相反,以右表为基准查左表数据,右表的数据会全查询出,并且查询出左表中符合条件的数据,

[外链图片转存失败(img-2fuWLUpD-1562061066258)(E:\learn\learn笔记\技术相关\mysql6.jpg)]

  1. mysql如何执行关联查询以及优化
  • mysql关联查询执行的策略是比较简单的,mysql对任何关联查询执行嵌套循环关联操作,即:mysql先在一个表中循环取出单条数据,然后在嵌套循环到关联表中寻找匹配的行,一次找下去,一直到找到所有表中匹配的行为止。然后更具各个表匹配出的行,返回查询中需要的各个列,如果mysql在最后一个关联表无法找到更多的行,他将返回上一层关联表,看能否找到更多的匹配数据,一次类推执行。
  • 按照这种方式,mysql查找第一个表的记录,再嵌套查询下一个关联表,然后回溯到上一个表,这正如其名——“嵌套循环关联”。看一下下面的例子:
SELECTt1.column1,t2.column2
FROMtb1 t1
INNER JOIN tb2 t2 ON t1.column3 = t2.column3
WHEREt1.column1 IN (4, 6)
outer_iter = iterator over t1 WHERE    column3 IN (4, 6) 
outer_row = outer_iter.next
WHILE outer_row inner_iter = iterator over t2    WHERE    column3 = outer_row.column3inner_row = inner_iter.nextWHILE inner_row output [ outer_row.column1,inner_row.column2 ] inner_row = inner_iter.nextEND outer_row = outer_iter.next
END
  • 假设mysql按照查询中表顺序进行关联操作,我们可以用伪代码标识这个过程。
  • 我们用表格的形式来表示关联查询过程,从左到右
t1t2结果行
column1=4,column3=1column3=1,column2=1column1=4,column3=1
column3=1,column2=2column1=4,column3=2
column3=1,column2=3column1=4,column3=3
column1=6,column3=2column3=2,column2=1column1=6,column3=1
column3=2,column2=2column1=6,column3=2
column3=2,column2=3column1=6,column3=3
  • t1中匹配到的第一行,4和1, 接着会去关联表中查找关联数据,得到一二三条,第二台数据类似。
  1. 关联查询的优化:
EXPLAIN select * from QuestionAnswerContentDetailVerify q STRAIGHT_JOIN Questions a 
ON q.questionID = a.questionID where a.questionType != 4
  • 如上sql,mysql优化器最重要的一个部分就是关联查询的优化,他决定了多个表关联时候的顺序,通常多表关联的时候,可以有多重关联的顺序,来获取相同的结果,关联查询优化器通过评估不同的顺序时候的执行成本来选择一个最小代价的关联顺序。
  • 按照上面的案例中执行顺序,mysql先user表,通过user_company的user_id得到company_id,通过company表主键对应的记录,我们执行mysql的explain得出结果如下:

[外链图片转存失败(img-Z2S33Fjb-1562061066258)(E:\learn\learn笔记\技术相关\mysql7.jpg)]

  • 我们修改join顺序在来执行以下sql
EXPLAIN select * from Questions a STRAIGHT_JOIN QuestionAnswerContentDetailVerify q
ON q.questionID = a.questionID where a.questionType != 4

[外链图片转存失败(img-frt62Xty-1562061066259)(E:\learn\learn笔记\技术相关\mysql8.jpg)]

  • mysql会将查询尽可能往第二中方式去靠近,对比如上两个,第一种查询中第一个表q扫码出45447条记录,第二种扫出61条数据,如果我们第一层查询返回更少的数据记录,然后在镜像嵌套循环查询,这种情况我们嵌套循环和回溯操作的次数会变得更少。
  • 通过这个例子我们也可以得出在关联查询时候讲数据流较少的表放在关联查询的首表的原因也是如此。而mysql重新定义关联顺序也是优化器的一个重要功能,他尝试在顺序查询中选择一个成本最小的来生产执行计划树。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/310642.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

让我的 .NET Core 博客系统支持 Docker

点击上方蓝字关注“汪宇杰博客”导语我的博客(https://edi.wang)所使用的博客系统 Moonglade 开源已经一年多了。目前已有至少4位社区朋友使用此系统在 Azure、阿里云上部署了自己的博客。可惜长久以来该系统一直缺乏 Docker 支持,而 .NET Co…

C++ 实现带权有向图的单源点最短路径Dijkstra算法(完整代码)

首先,引进一个辅助向量D,它的每个分量D[i]表示当前所找到的从始点v0到每个终点vi的最短路径的长度。 它的初态为:若从v0到vi有弧,则D[i]为弧上的权值;否则,置D[i]为∞。 显然,长度为 D[j]Min{…

[ASP.NET Core MVC] 如何实现运行时动态定义Controller类型?

昨天有个朋友在微信上问我一个问题:他希望通过动态脚本的形式实现对ASP.NET Core MVC应用的扩展,比如在程序运行过程中上传一段C#脚本将其中定义的Controller类型注册到应用中,问我是否有好解决方案。这是一个挺有意思的问题,我们…

C++ 实现带权有向图的每对顶点之间的最短路径Floyd算法(完整代码)

基本思想是: 假设求从顶点vi到vj的最短路径。 如果从vi到vj有弧,则从vi到vj存在一条长度为arcs[i][j]的路径,该路径不一定是最短路径,尚需进行n次试探。 首先考虑路径(vi, v0, vj)是否存在(判别…

等额本息,等额本金区别

等额本金,等额本息区别 买房银行贷款分为两种: 等额本金和等额本息 等额本息 等额本息定义:还款本金占比逐月递增,利息占比逐月递减,月还款数不变由于每月的还款额度是一样的,其中每个月的还款包括了根…

【视频回放与课件】Build your AI solution with MLOps

4月8日在Global AI Community on Vitural Tour与大家分享了Build your AI solution with MLOps的专题,本课程主要介绍了微软Azure Machine Learning如何使用 , 以及如何通过Azure Machine Learning 结合 MLOps的概念完成机器学习项目的工作。本次Global AI Communit…

C++ 实现分块查找(顺序存储结构)(完整代码)

代码如下: #include <iostream> using namespace std; const int Maxsize 1000; const int MINNUM -999999; class Index_table {friend class SeqList; private:int key;int address; };class SeqList {//该顺序表从下标为0开始 public:~SeqList(){delete[] elem;del…

《五分钟商学院》管理篇学习笔记

【商业知识】| 作者 / Edison Zhou这是恰童鞋骚年的第213篇原创文章在商业篇中&#xff0c;主要探讨的是企业如何处理与外部&#xff08;比如客户&#xff09;的关系。而在管理篇中&#xff0c;关注的重点则是企业如何处理与内部的关系。外部的世界很精彩&#xff0c;而内部的世…

如何在.NET应用程序中分析CPU使用率过高的问题

原文来自互联网&#xff0c;由长沙DotNET技术社区编译。如译文侵犯您的署名权或版权&#xff0c;请联系小编&#xff0c;小编将在24小时内删除。限于译者的能力有限&#xff0c;个别语句翻译略显生硬&#xff0c;还请见谅。作者:胡安帕勃罗希达&#xff0c;JUAN PABLO SCIDA是一…

HashMap实现原理

HashMap HashMap基础数据结构&#xff1a; 如上结构课看出&#xff0c;HashMap主要是有一个链表的形式来存储数据 &#xff0c;上面Node类和C语言中的结构体很像&#xff0c;如上可以看出HashMap底层由是一个数组结构&#xff0c;数组中的每一项又是一个链表&#xff0c;新建一…

做好技术管理,你必须要跨越的4道槛

点击蓝字关注&#xff0c;回复“职场进阶”获取职场进阶精品资料一份读者群里有不少刚开始做管理的技术人&#xff0c;很多都和我谈过他们的困惑。总结下来主要是不知道继续晋升需要培养哪方面的能力。技术经理其实是技术人最难做好的管理岗&#xff0c;原因主要有两方面&#…

图的最小生成树和最短路径算法思路总结(Prim,Kruskal,Dijkstra,Floyd)

带权无向图—>最小生成树算法—>Prim算法: 思路: 首先&#xff0c;我们先设置两个集合&#xff0c;U_{}&#xff1a;一个用来放最小生成树的顶点&#xff0c;T_{}&#xff1a;一个用来放最小生成树的边。选取最开始的点V_0&#xff0c;将V_0放入U_{}中&#xff0c;得到U_…

玩转控件:对Dev的GridControl控件扩展

缘由一切实现来源于需求&#xff0c;目的在于不盲目造轮子&#xff0c;有小伙伴儿在看了《玩转控件:对Dev中GridControl控件的封装和扩展》文章后&#xff0c;私信作者说&#xff0c;因公司业务逻辑比较复杂&#xff0c;展示字段比较多&#xff0c;尤其网格列表控件展示数据太多…

二叉排序树(搜索树BST)-详解结点的删除

在二叉排序树中删除一个结点时&#xff0c;需保证删除后的二叉树仍然是二叉排序树。为讨论方便&#xff0c;假定被删除结点为p&#xff0c;其双亲结点为f。删除的过程可按下述的两种情况分别处理。 在这里我们用红色三角形表示我们要删除的结点&#xff0c;蓝色表示我们要改变指…

java调优方法,jvm监控工具

graph LR A-->B性能概述 程序性能表现形式 执行速度&#xff1a;程序响应速度&#xff0c;总耗时是否足够短内存分配&#xff1a;内存分配是否合理&#xff0c;是否过多消耗内存或者存在泄漏启动时间&#xff1a;程序运行到可以正常处理业务需要的时间负载承受能力 性能测…

那位五十多岁的创业者给我的启示!

作者&#xff1a;邹溪源&#xff0c;长沙资深互联网从业者&#xff0c;架构师社区特邀嘉宾&#xff01;一我曾经提到过最终改行从事美缝行业的老w&#xff0c;他靠自己的“不够努力”&#xff0c;最终离开了行业。但是&#xff0c;这个世界其实有点讽刺。在沉迷于安逸小日子的老…

平衡二叉树(AVL树)-详解平衡调整

平衡调整: (注意&#xff1a;平衡调整只是平衡调整&#xff0c;没有进行结点的插入) LL型调整: (带阴影的小框表示插入的结点) 代码如下: AVLNode *AVLTree::LL_Rotate(AVLNode *a) {AVLNode *b;b a->lchild;a->lchild b->rchild;b->rchild a;a->bf b-&g…

初识消息队列/RabbitMQ详解

欢迎大家阅读《朝夕Net社区技术专刊》我们致力于.NetCore的推广和落地&#xff0c;为更好的帮助大家学习&#xff0c;方便分享干货&#xff0c;特创此刊&#xff01;很高兴你能成为忠实读者&#xff0c;文末福利不要错过哦&#xff01;今天来给大家分享关于消息队列的内容&…

zookeeper理解

Zookeeper简介 Zookeeper的数据模型 层次化的目录结构&#xff0c;命名符合常规文件系统规范每个节点在zookeeper中叫做znode&#xff0c;并且有一个唯一的路径标识节点znode可以包含数据和子节点&#xff0c;但是EPHEMERAL类型的节点不能有子节点Znode中的互刷可以有多个版本…

那些年,在MSRA实习过的女孩,现在都怎么样了?

编者按&#xff1a;我们用两周时间回访了五位在 MSRA 实习过的女孩&#xff0c;她们也都是当年“实习派”的主人公。我们本想在更长的时间维度下&#xff0c;看一看 MSRA 给予她们的改变。然而超乎预期的是&#xff0c;在她们身上&#xff0c;坚持的力量比改变更强。变与不变&a…