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. 内连接

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

  1. 左外连接

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

  1. 右外连接

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

  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按照查询中表顺序进行关联操作,我们可以用伪代码标识这个过程。
  • 我们用表格的形式来表示关联查询过程,从左到右
t1 t2 结果行
column1=4,column3=1 column3=1,column2=1 column1=4,column3=1
column3=1,column2=2 column1=4,column3=2
column3=1,column2=3 column1=4,column3=3
column1=6,column3=2 column3=2,column2=1 column1=6,column3=1
column3=2,column2=2 column1=6,column3=2
column3=2,column2=3 column1=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得出结果如下:

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

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

MySql 内连接,外连接查询方式区别相关推荐

  1. MySQL 表的增删改查(进阶篇②)· 联合查询 内连接 外连接 · 自连接 · 子查询 exists · 合并查询 union

    接进阶篇①,我们继续学习. 一.联合查询 1.1 内连接 1.2 外连接 1.3 内连接和左右外连接的区别 二.自连接 三.子查询 3.1 单行子查询 3.2 多行子查询 使用 in 范围匹配多行 另 ...

  2. 【mysql】左外连接查询中 on 和 where 的区别

    论点 在使用 mysql 的左外连接(left join)查询时,驱动表(left join 左边的表),亦即数据需要全部被查出表的查询条件建议用 where 设定,被驱动表(left join 右边 ...

  3. Oracle 表连接方式(内连接/外连接/自连接) 详解

    Oracle 表之间的连接分为三种: 1. 内连接(自然连接) 2. 外连接 (1)左外连接 (左边的表不加限制)        (2)右外连接(右边的表不加限制)         (3)全外连接(左 ...

  4. SQL语法 自然连接 外连接 内连接

    文章目录 笛卡尔积 连接 内连接 自连接 自然连接 外连接 左外连接 右外连接 区分连接 自然连接 内连接 内连接.外连接 on 和 where 条件过滤的区别 参考链接 笛卡尔积 结果集数目为多个表 ...

  5. java内连接外连接_SQL中的内连接与外连接--Java学习网

    核心提示:连接运算格式链接运算由两部分构成:连接类型和连接条件连接类型可分为:INNER JOIN 内连接LEFT OUTER JOIN 左外连接RIGHT OUTER JOIN 右外连接FULL O ...

  6. MySQL中的外连接

    MySQL中的外连接 外连接是指查询出符合连接条件的数据同时还包含孤儿数据. 一.孤儿数据 孤儿数据是指被连接的列的值为空的数据. 二.左外连接(left outer join) 左外连接包含左表的孤 ...

  7. MySQL--基础知识点--64--等值连接/自连接/自然连接/外连接

    该篇文章基于以下三个表进行解析 student表 DROP TABLE IFEXISTS `student`;CREATE TABLE student (`sid` INT NOT NULL AUTO ...

  8. 一文完整MySQL连接查询,笛卡尔乘积,内连接外连接交叉连接

    文章目录 笛卡尔乘积 连接查询分类 等值连接 非等值连接 自连接 外连接 交叉连接 连接查询又称为多表查询,当查询的字段来自于多个表时,使用连接查询. 笛卡尔乘积 笛卡尔乘积现象:表1有m行,表2有n ...

  9. mysql创建全外连接的视图_「MySql学习」Mysql学习系列之常用数据库查询语句

    一.简单查询 简单的Transact-SQL查询只包括选择列表.FROM子句和WHERE子句.它们分别说明所查询列.查询的表或视图.以及搜索条件等.10.5pt;font-family:"A ...

最新文章

  1. 测试归测试,自动驾驶向个人全面开放依然长路漫漫
  2. Poj(2488),按照字典序深搜
  3. 源码解析 Netty Channel接口及其实现类
  4. wikipedia_教职员工可以通过Wikipedia进行教学吗?
  5. Struts框架的核心业务
  6. CMS 系统之 iframe 结构
  7. collections模块 :namedtuple、deque、defaultdict、OrderedDict、ChainMap、Counter
  8. web安全day30:人人都要懂的LAMP--apache服务安装和配置
  9. 66岁比尔盖茨突然宣布离婚!27年前与下属恋爱修成正果,现在“无法共同成长”,分割8000亿财产...
  10. 解决jpa和hibernate的json序列化死循环问题
  11. 功能架构图、信息结构图、产品结构图的区别和绘制方法
  12. 实现真正的「人机」对战:引入三方 AI 引擎
  13. 【MOS管】基础知识和简易电路
  14. 流媒体高清视频校园直播点播
  15. k8s容器部署elasticsearch+kibana+cerebro
  16. 课设系列:51单片机制作智能时钟闹钟
  17. FFmpeg在iOS开发中编译并使用
  18. 2021-2022 UCAS PRML 期末回忆
  19. Steamcommunity302使用教程介绍
  20. 鸿蒙系统下矿山! 华为“矿鸿”重磅发布!

热门文章

  1. 小米android系统耗电量大,小米手机耗电快的解决方法,亲测有效~
  2. 个人电脑 公司电脑 代理_这样的电脑谁来用?一体式水冷,磁悬浮风扇!
  3. 2个网页跳来跳去_好人网页同步器,使用教程
  4. 学过物理的人才能看懂的笑话,你能看明白几个?
  5. 【汇总推荐】深度学习、自然语言处理干货笔记汇总
  6. 当你老了,一生最后悔什么?大数据告诉你!
  7. 分析函数在数据分析中的应用
  8. php json.parse,JSON.parse()与JSON.stringify()和eval()使用方法详解
  9. mysql_contents_将MySQLhelpcontents的内容有层次的输出方法推荐
  10. $query php,phpQuery让php处理html代码像jQuery一样方便