mysql left join中on后加条件判断和where中加条件的区别
left join中关于where和on条件的几个知识点:
1.多表left join是会生成一张临时表,并返回给用户
2.where条件是针对最后生成的这张临时表进行过滤,过滤掉不符合where条件的记录,是真正的不符合就过滤掉。
3.on条件是对left join的右表进行条件过滤,但依然返回左表的所有行,右表中没有的补为NULL
4.on条件中如果有对左表的限制条件,无论条件真假,依然返回左表的所有行,但是会影响右表的匹配值。也就是说on中左表的限制条件只影响右表的匹配内容,不影响返回行数。
结论:
1.where条件中对左表限制,不能放到on后面
2.where条件中对右表限制,放到on后面,会有数据行数差异,比原来行数要多 测试:
创建两张表:
CREATE TABLE t1(id INT,name VARCHAR(20));
insert into `t1`(`id`,`name`) values (1,'a11');
insert into `t1`(`id`,`name`) values (2,'a22');
insert into `t1`(`id`,`name`) values (3,'a33');
insert into `t1`(`id`,`name`) values (4,'a44'); CREATE TABLE t2(id INT,local VARCHAR(20));
insert into `t2`(`id`,`local`) values (1,'beijing');
insert into `t2`(`id`,`local`) values (2,'shanghai');
insert into `t2`(`id`,`local`) values (5,'chongqing');
insert into `t2`(`id`,`local`) values (6,'tianjin'); 测试01:返回左表所有行,右表符合on条件的原样匹配,不满足条件的补NULL
root@localhost:cuigl 11:04:25 >SELECT t1.id,t1.name,t2.local FROM t1 LEFT JOIN t2 ON t1.id=t2.id;
+------+------+----------+
| id | name | local |
+------+------+----------+
| 1 | a11 | beijing |
| 2 | a22 | shanghai |
| 3 | a33 | NULL |
| 4 | a44 | NULL |
+------+------+----------+
4 rows in set (0.00 sec) 测试02:on后面增加对右表的限制条件:t2.local='beijing'
结论02:左表记录全部返回,右表筛选条件生效
root@localhost:cuigl 11:19:42 >SELECT t1.id,t1.name,t2.local FROM t1 LEFT JOIN t2 ON t1.id=t2.id and t2.local='beijing';
+------+------+---------+
| id | name | local |
+------+------+---------+
| 1 | a11 | beijing |
| 2 | a22 | NULL |
| 3 | a33 | NULL |
| 4 | a44 | NULL |
+------+------+---------+
4 rows in set (0.00 sec) 测试03:只在where后面增加对右表的限制条件:t2.local='beijing'
结论03:针对右表,相同条件,在where后面是对最后的临时表进行记录筛选,行数可能会减少;在on后面是作为匹配条件进行筛选,筛选的是右表的内容。
root@localhost:cuigl 11:20:07 >SELECT t1.id,t1.name,t2.local FROM t1 LEFT JOIN t2 ON t1.id=t2.id where t2.local='beijing';
+------+------+---------+
| id | name | local |
+------+------+---------+
| 1 | a11 | beijing |
+------+------+---------+
1 row in set (0.01 sec) 测试04:t1.name='a11' 或者 t1.name='a33'
结论04:on中对左表的限制条件,不影响返回的行数,只影响右表的匹配内容
root@localhost:cuigl 11:24:46 >SELECT t1.id,t1.name,t2.local FROM t1 LEFT JOIN t2 ON t1.id=t2.id and t1.name='a11';
+------+------+---------+
| id | name | local |
+------+------+---------+
| 1 | a11 | beijing |
| 2 | a22 | NULL |
| 3 | a33 | NULL |
| 4 | a44 | NULL |
+------+------+---------+
4 rows in set (0.00 sec)
root@localhost:cuigl 11:25:04 >SELECT t1.id,t1.name,t2.local FROM t1 LEFT JOIN t2 ON t1.id=t2.id and t1.name='a33';
+------+------+-------+
| id | name | local |
+------+------+-------+
| 1 | a11 | NULL |
| 2 | a22 | NULL |
| 3 | a33 | NULL |
| 4 | a44 | NULL |
+------+------+-------+
4 rows in set (0.00 sec) 测试05:where t1.name='a33' 或者 where t1.name='a22'
结论05:where条件是在最后临时表的基础上进行筛选,显示只符合最后where条件的行
root@localhost:cuigl 11:25:15 >SELECT t1.id,t1.name,t2.local FROM t1 LEFT JOIN t2 ON t1.id=t2.id where t1.name='a33';
+------+------+-------+
| id | name | local |
+------+------+-------+
| 3 | a33 | NULL |
+------+------+-------+
1 row in set (0.00 sec)
root@localhost:cuigl 11:27:27 >SELECT t1.id,t1.name,t2.local FROM t1 LEFT JOIN t2 ON t1.id=t2.id where t1.name='a22';
+------+------+----------+
| id | name | local |
+------+------+----------+
| 2 | a22 | shanghai |
+------+------+----------+
1 row in set (0.00 sec)
mysql left join中on后加条件判断和where中加条件的区别的更多相关文章
- Linux centosVMware 自动化运维Ansible介绍、Ansible安装、远程执行命令、拷贝文件或者目录、远程执行脚本、管理任务计划、安装rpm包/管理服务、 playbook的使用、 playbook中的循环、 playbook中的条件判断、 playbook中的handlers、playbook实战-nginx安装、管理配置文件
一.Ansible介绍 不需要安装客户端,通过sshd去通信 基于模块工作,模块可以由任何语言开发 不仅支持命令行使用模块,也支持编写yaml格式的playbook,易于编写和阅读 安装十分简单,ce ...
- Word中选择中内容后变成C,VMware 虚拟中Ctrl键一直被按住了
Word中选择中内容后变成C: 解决办法:关闭金山词霸的[划词翻译]功能即可. VMware 虚拟中Ctrl键一直被按住了: 解决办法:关闭金山词霸的[取词翻译]功能即可.
- Shell条件判断(6)- 多重条件判断
多重条件判断 多个条件判断一起使用 测试选项 作用 判断1 -a 判断2 逻辑与,判断1和判断2都成立,最终的结果才为真 判断1 -o 判断2 逻辑或,判断1和判断2有一个成立,最终的结果就为真 ! ...
- 图片懒加载--判断div ul中的li是否已经滑动到可视区域里
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- PHP和JS在循环、条件判断中的不同之处
一.条件判断: php中算 false 的情况 1. boolean:false 2. 整形:0 3.浮点型:0 4.字符串:"" "0"(其他都对) 5.空 ...
- Linux入门第五天——shell脚本入门(中)基础语法之判断与条件
一.判断式 利用 test 命令进行执行结果的判断(例如判断是否存在该文件):关于test test:test 示例:结合回传值 $? 进行判断:关于$?:$? [root@localhost tm ...
- SDUT-2804_数据结构实验之二叉树八:(中序后序)求二叉树的深度
数据结构实验之二叉树八:(中序后序)求二叉树的深度 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 已知一颗二叉树的中序 ...
- (6)javascript的程序控制结构及语句-----(1)条件判断
程序控制结构及语句 编程就是将现实应用,转换为程序能够读得懂的语法语句.Javascript编程中对程序流程控制主要是通过条件判断语句.循环控制语句及continue.break来完成的,其中条件判断 ...
- Ansible系列(六):循环和条件判断
本文目录:1. 循环 1.1 with_items迭代列表 1.2 with_dict迭代字典项 1.3 with_fileglob迭代文件 1.4 with_lines迭代行 1.5 with_ne ...
随机推荐
- [译]为什么pandas有些命令用括号结尾,有些则没有?
文章来源:https://nbviewer.jupyter.org/github/justmarkham/pandas-videos/blob/master/pandas.ipynb 方法:用括号调用 ...
- Unity属性——AddComponentMenu
字面理解:添加 组件选项菜单 分析:可能是添加一个脚本或者组件到一个物体上 验证: 新建一个脚本:AttributeTest 提示:添加一个组件菜单属性,允许你放一个脚本在Compoent菜单下,来代 ...
- 逆序对(inversion)
逆序对(inversion) 题目描述 对于序列AA,它的逆序对数定义为满足i<ji<j,且Ai>AjAi>Aj 的数对i,ji,j的个数. 现给你11到nn的一个排列,并按照 ...
- git下载其他人分支的代码
1. 在工作空间,右键,打开Git Bash 2. clone主分支的代码(即下载主分支代码的过程) 执行命令: git clone xxx.git 3. 进入工程目录 cd xxx 4. 切换到 ...
- [暑假集训--数论]poj3518 Prime Gap
The sequence of n − 1 consecutive composite numbers (positive integers that are not prime and not eq ...
- 序列操作(bzoj 1858)
Description lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询问操作: 0 a b 把[a, b]区间内的所有数全变成0 ...
- bat文件【java调用】
Runtime.getRuntime().exec("cmd /c del c:\\a.doc"); //Runtime.getRuntime().exec("not ...
- POJ2478 Farey Sequence
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15023 Accepted: 5962 Description The ...
- POJ1595 Prime Cuts
Prime Cuts Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 11961 Accepted: 4553 Descr ...
- Push pull, open drain circuit, pull up, pull down resistor
Push pull 就以下面這個 電路來說, 因為沒有 pull up resistor, 所以 output voltage 由 low 往 high 的速度會較快. 有兩個電晶體,一個on,一個 ...