理论 MYSQL的LEFT JOIN 有时候会变的不一样

如果LFET JOIN B WHERE 条件部分有B的条件,那么它跟主表不再是LEFT

JOIN ,而是变成了 INNER JOIN!

我们创建两个父子表

mysql> show create table children;+----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| Table    | Create Table                                                                                                                                                                                                                                                                                                                           |+----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| children | CREATE TABLE `children` (  `ID` bigint unsigned NOT NULL AUTO_INCREMENT,  `NAME` varchar(45) DEFAULT NULL,  `SEX` char(1) DEFAULT NULL,  `AGE` tinyint DEFAULT NULL,  `FATHER_ID` bigint DEFAULT NULL,  PRIMARY KEY (`ID`)) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='孩子'   |+----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+1 row in set (0.01 sec)
mysql> show create table FATHER;+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| Table  | Create Table                                                                                                                                                                                                                                                              |+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| FATHER | CREATE TABLE `FATHER` (  `ID` bigint unsigned NOT NULL AUTO_INCREMENT,  `NAME` varchar(45) DEFAULT NULL,  `MONY` decimal(10,0) DEFAULT NULL,  PRIMARY KEY (`ID`)) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='父亲'   |+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+1 row in set (0.00 sec)

生成必要的数据

mysql> select * from FATHER;+----+--------+------+| ID | NAME   | MONY |+----+--------+------+|  1 | 王五   | 3000 ||  2 | 张三   | 3500 ||  3 | 李四   | 5000 ||  4 | 刘二   | 8000 ||  5 | 陈七   | 5500 ||  6 | 杨八   | 7500 |+----+--------+------+6 rows in set (0.00 sec)
mysql> select * from children;+----+-----------+------+------+-----------+| ID | NAME      | SEX  | AGE  | FATHER_ID |+----+-----------+------+------+-----------+|  1 | 王八      | 男   |   38 |         1 ||  2 | 王高      | 男   |   28 |         1 ||  3 | 王艳      | 女   |   18 |         1 ||  4 | 张雪      | 女   |   33 |         2 ||  5 | 张亮      | 男   |   25 |         2 ||  6 | 李贵      | 男   |   27 |         3 ||  7 | 李丽      | 女   |   25 |         3 ||  8 | 杨莉      | 女   |   23 |         6 ||  9 | 杨雪      | 女   |   22 |         6 || 10 | 杨七郎    | 男   |   35 |         6 |+----+-----------+------+------+-----------+10 rows in set (0.00 sec)

实验一   没有条件的时候

mysql> SELECT A.NAME,A.MONY,B.NAME,B.AGE,B.SEX    -> FROM books.FATHER A    -> LEFT JOIN books.children B ON A.ID=B.FATHER_ID    -> ORDER BY A.ID ASC;+--------+------+-----------+------+------+| NAME   | MONY | NAME      | AGE  | SEX  |+--------+------+-----------+------+------+| 王五   | 3000 | 王艳      |   18 | 女   || 王五   | 3000 | 王高      |   28 | 男   || 王五   | 3000 | 王八      |   38 | 男   || 张三   | 3500 | 张亮      |   25 | 男   || 张三   | 3500 | 张雪      |   33 | 女   || 李四   | 5000 | 李丽      |   25 | 女   || 李四   | 5000 | 李贵      |   27 | 男   || 刘二   | 8000 | NULL      | NULL | NULL || 陈七   | 5500 | NULL      | NULL | NULL || 杨八   | 7500 | 杨七郎    |   35 | 男   || 杨八   | 7500 | 杨雪      |   22 | 女   || 杨八   | 7500 | 杨莉      |   23 | 女   |+--------+------+-----------+------+------+12 rows in set (0.00 sec)

认为非常正常,没有孩子的要展现出来的!

执行计划也很正常

+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+--------------------------------------------+| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra                                      |+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+--------------------------------------------+|  1 | SIMPLE      | A     | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    6 |   100.00 | Using temporary; Using filesort            ||  1 | SIMPLE      | B     | NULL       | ALL  | NULL          | NULL | NULL    | NULL |   10 |   100.00 | Using where; Using join buffer (hash join) |+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+--------------------------------------------+

实验二 带条件的

mysql> SELECT A.NAME,A.MONY,B.NAME,B.AGE,B.SEX    -> FROM books.FATHER A    -> LEFT JOIN books.children B ON A.ID=B.FATHER_ID    -> WHERE B.SEX='男'    -> ORDER BY A.ID ASC;+--------+------+-----------+------+------+| NAME   | MONY | NAME      | AGE  | SEX  |+--------+------+-----------+------+------+| 王五   | 3000 | 王八      |   38 | 男   || 王五   | 3000 | 王高      |   28 | 男   || 张三   | 3500 | 张亮      |   25 | 男   || 李四   | 5000 | 李贵      |   27 | 男   || 杨八   | 7500 | 杨七郎    |   35 | 男   |+--------+------+-----------+------+------+

主表的被屏蔽掉了,而执行计划是B表为主表,驱动表

详情见阅读原文

MYSQL LEFT JOIN 的怪异行为相关推荐

  1. 我想说:mysql 的 join 真的很弱

    (给视学算法加星标,提高Java技能) 转自:ITPUB博客,作者:e71hao blog.itpub.net/30393770/viewspace-2650450/ 一. 问题提出: <阿里巴 ...

  2. mysql right join实例_MySQL表LEFT JOIN左连接与RIGHT JOIN右连接的实例教程

    LEFT JOIN 语法用法与实例MySQL LEFT JOIN 语法 SQL(MySQL) LEFT JOIN 会取得左表(table1)全部记录,即使右表(table2)并无对应匹配记录.LEFT ...

  3. MySQL的JOIN(一):用法

    JOIN的含义就如英文单词"join"一样,连接两张表,大致分为内连接,外连接,右连接,左连接,自然连接.这里描述先甩出一张用烂了的图,然后插入测试数据. 复制代码 CREATE ...

  4. mysql natural join用法_MySQL NATURAL JOIN

    NATURAL JOIN 也叫自然连接,实际是属于 JOIN 的一种. MySQL NATURAL JOIN 语法如下: ... FROM table1 NATURAL JOIN table2 ... ...

  5. mysql的join语句使用_在MySQL中使用JOIN语句进行连接操作的详细教程

    到目前,我们已经学习了从一个表中获取数据.这是简单的需要,但在大多数现实MySQL的使用,经常需要将数据从多个表中的一个单一的查询. 可以使用多个表中的单一SQL查询.在MySQL中联接(join)行 ...

  6. mysql默认join是什么类型_MySQL:join语句类型

    MySQL:join语句类型 join从句的类型有以下几种: 内链接(inner) 右外连接(right outer) 左外连接(left outer) 全外连接(full outer) 交叉链接(c ...

  7. 一文搞懂MySQL的Join

    点击上方 "程序员小乐" ,关注公众号 8点20分,第一时间与你相约 每日英文 A single hand that wipes tears during failures is ...

  8. mysql inner join where_详解mysql 使用left join添加where条件的问题分析

    当前需求: 有group和factor两张表,一个group对应多个factor,现在想查询有效的group和对应的有效的factor,两个表都有isDel逻辑删除标志. 最开始的错误写法一: SEL ...

  9. 我想说:mysql 的 join 真的很弱|文末福利

    转自:ITPUB博客,作者:e71hao blog.itpub.net/30393770/viewspace-2650450/ 一. 问题提出: <阿里巴巴JAVA开发手册>里面写超过三张 ...

  10. MySQL的JOIN用法

    全文共925个字,10张图,预计阅读时间6分钟. 数据库中的JOIN称为连接,连接的主要作用是根据两个或多个表中的列之间的关系,获取存在于不同表中的数据.连接分为三类:内连接.外连接.全连接.另外还有 ...

最新文章

  1. 和12岁小同志搞创客开发:手撕代码,做一款密室自动门
  2. 【直播】耿远昊:Pandas入门讲解(安泰第四届数据科学训练营)
  3. python3 列表_Python3 列表生成
  4. 无界限设计加持!魅族手环正式亮相
  5. 设计模式(6)-装饰器(认识程序中的装饰器)
  6. php 是否包含 大写,PHP检查字符串中是否包含大写字符
  7. python源码脚本实例_python编写一个会算账的脚本的示例代码
  8. 2018暑期做题部分整合
  9. [Leetcode] single number ii 找单个数
  10. 单层感知器->BP算法详细推导
  11. 通过算法为宝宝选保姆,数据辅助决策靠谱吗?
  12. 一文搞懂数据结构之 递归-八皇后问题
  13. guid分区怎么装win7_gpt分区无法安装win7原因分析及解决方法(完美解决)
  14. C++11中的原子操作(atomic operation)和自旋锁
  15. 【SAP GUI Scripting】 入门系列(1)_基本设置
  16. unity通过鼠标滑轮控制物体大小
  17. 如何使用idea 连接达梦数据库?
  18. 实战 | 电信客户流失分析与预测
  19. IT运维服务外包管理的两种模式
  20. 2021-05-26

热门文章

  1. 八个程序员常用的接单平台推荐
  2. 云计算安全需求分析与网络
  3. matlab直方图均衡化代码
  4. C语言——解四元一次方程组
  5. ArcGIS操作系列(一)之地理配准
  6. 在python中datetime使用中如何识别上月同期日期
  7. 猿创征文|2022全球程序员薪资排行一览
  8. 郁闷,俺被S3C2416 狠狠的暗算了一把。
  9. 对JavaScript中 this 关键词的理解
  10. OA发展建议有奖调研内容