MYSQL LEFT JOIN 的怪异行为
理论 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 的怪异行为相关推荐
- 我想说:mysql 的 join 真的很弱
(给视学算法加星标,提高Java技能) 转自:ITPUB博客,作者:e71hao blog.itpub.net/30393770/viewspace-2650450/ 一. 问题提出: <阿里巴 ...
- mysql right join实例_MySQL表LEFT JOIN左连接与RIGHT JOIN右连接的实例教程
LEFT JOIN 语法用法与实例MySQL LEFT JOIN 语法 SQL(MySQL) LEFT JOIN 会取得左表(table1)全部记录,即使右表(table2)并无对应匹配记录.LEFT ...
- MySQL的JOIN(一):用法
JOIN的含义就如英文单词"join"一样,连接两张表,大致分为内连接,外连接,右连接,左连接,自然连接.这里描述先甩出一张用烂了的图,然后插入测试数据. 复制代码 CREATE ...
- mysql natural join用法_MySQL NATURAL JOIN
NATURAL JOIN 也叫自然连接,实际是属于 JOIN 的一种. MySQL NATURAL JOIN 语法如下: ... FROM table1 NATURAL JOIN table2 ... ...
- mysql的join语句使用_在MySQL中使用JOIN语句进行连接操作的详细教程
到目前,我们已经学习了从一个表中获取数据.这是简单的需要,但在大多数现实MySQL的使用,经常需要将数据从多个表中的一个单一的查询. 可以使用多个表中的单一SQL查询.在MySQL中联接(join)行 ...
- mysql默认join是什么类型_MySQL:join语句类型
MySQL:join语句类型 join从句的类型有以下几种: 内链接(inner) 右外连接(right outer) 左外连接(left outer) 全外连接(full outer) 交叉链接(c ...
- 一文搞懂MySQL的Join
点击上方 "程序员小乐" ,关注公众号 8点20分,第一时间与你相约 每日英文 A single hand that wipes tears during failures is ...
- mysql inner join where_详解mysql 使用left join添加where条件的问题分析
当前需求: 有group和factor两张表,一个group对应多个factor,现在想查询有效的group和对应的有效的factor,两个表都有isDel逻辑删除标志. 最开始的错误写法一: SEL ...
- 我想说:mysql 的 join 真的很弱|文末福利
转自:ITPUB博客,作者:e71hao blog.itpub.net/30393770/viewspace-2650450/ 一. 问题提出: <阿里巴巴JAVA开发手册>里面写超过三张 ...
- MySQL的JOIN用法
全文共925个字,10张图,预计阅读时间6分钟. 数据库中的JOIN称为连接,连接的主要作用是根据两个或多个表中的列之间的关系,获取存在于不同表中的数据.连接分为三类:内连接.外连接.全连接.另外还有 ...
最新文章
- 和12岁小同志搞创客开发:手撕代码,做一款密室自动门
- 【直播】耿远昊:Pandas入门讲解(安泰第四届数据科学训练营)
- python3 列表_Python3 列表生成
- 无界限设计加持!魅族手环正式亮相
- 设计模式(6)-装饰器(认识程序中的装饰器)
- php 是否包含 大写,PHP检查字符串中是否包含大写字符
- python源码脚本实例_python编写一个会算账的脚本的示例代码
- 2018暑期做题部分整合
- [Leetcode] single number ii 找单个数
- 单层感知器->BP算法详细推导
- 通过算法为宝宝选保姆,数据辅助决策靠谱吗?
- 一文搞懂数据结构之 递归-八皇后问题
- guid分区怎么装win7_gpt分区无法安装win7原因分析及解决方法(完美解决)
- C++11中的原子操作(atomic operation)和自旋锁
- 【SAP GUI Scripting】 入门系列(1)_基本设置
- unity通过鼠标滑轮控制物体大小
- 如何使用idea 连接达梦数据库?
- 实战 | 电信客户流失分析与预测
- IT运维服务外包管理的两种模式
- 2021-05-26