Mysql中where与on的区别及何时使用详析


Posted in MySQL onAugust 04, 2021

之前在写连表查询的时候,老是分不清楚where和on的区别,导致有时写的SQL会出现一点小的问题,这里专门写篇文章做下记录,如果你也分不清,那么请参考

二者的区别及什么时候使用

说明:区分on和where首先我们将连接分为内部连接和非内部连接,内部连接时on和where的作用是一样的,通常我们分不清它们的区别说的是非内部连接

一般on用来连接两个表,只的是连接的条件,在内部连接时,可以省略on,此时它表示的是两个表的笛卡尔积;使用on连接后,mysql会生成一张临时表,而where就是在临时表的基础上,根据where子句来筛选出符合条件的记录,因此where是用来筛选的

内部连接(inner join)

说明:join默认为inner join,当为内部连接时,on和where的作用你可以看做是一样的

非内部连接(left join、right join、full join等)

一般分不清区别就是在使用非内部连接时,

实例说明

下面我们建两张表(每个表中插入4条数据,两个表通过trade_id来关联),来说明它们的区别,此文章的最下面附有SQL脚本,然后我们通过连表查询来说明on和where的区别

1、inner join 连接两个表(无on和where)

select * from hopegaming_main.test_1234 join hopegaming_main.test_1235

等价于

select * from hopegaming_main.test_1234,hopegaming_main.test_1235

Mysql中where与on的区别及何时使用详析

结果集是两个表的笛卡尔积

2、inner join 连接两个表(有on)

select * from hopegaming_main.test_1234 t1 join hopegaming_main.test_1235 t2 on t1.trade_id = t2.trade_id

Mysql中where与on的区别及何时使用详析

结果集是两个表有相同trade_id的数据

3、inner join 连接两个表(有where)

select * from hopegaming_main.test_1234 t1 join hopegaming_main.test_1235 t2 where t1.trade_id = t2.trade_id

Mysql中where与on的区别及何时使用详析

结果集是结果集是两个表有相同trade_id的数据

从2和3的结果中我们可以看出,在使用inner join连接时,on和where的作用相等

4、left join(下面以left join为例来连接两个表) 连接两个表

select * from hopegaming_main.test_1234 t1 left join hopegaming_main.test_1235 t2 on t1.trade_id = t2.trade_id

Mysql中where与on的区别及何时使用详析

结果集是以左面的表为基础,直接根据trade_id去右边查询相等的值然后连接,如果右表没有符合的数据,则都显示为null

5、left join(下面以left join为例来连接两个表) 连接两个表,连接条件中有常量等式

select * from hopegaming_main.test_1234 t1 left join hopegaming_main.test_1235 t2 on t1.trade_id = t2.trade_id  and t2.nick_name = 'wangwu'

结果集是以左面的表为基础,如果on连接条件最后没有找到匹配的记录,则都显示null

6、left join(下面以left join为例来连接两个表) 连接两个表,将常量表达式放入where子句中

select * from hopegaming_main.test_1234 t1 left join hopegaming_main.test_1235 t2 on t1.trade_id = t2.trade_id    where t2.nick_name = 'wangwu''

Mysql中where与on的区别及何时使用详析

结果只会显示符合where子句的数据,只要没有符合的都不会显示,因为它是筛选连接后的临时表中的数据,而on
只是连接,如果右边没有符合的数据,就显示null,而左边的数据都会显示,不会被过滤,这就是where和on最大的区别

建表和插入数据的脚本:

CREATE TABLE `hopegaming_main`.`test_1234` (
  `id` varchar(30) NOT NULL COMMENT '身份证号',
  `name` varchar(100) DEFAULT NULL COMMENT '姓名',
  `trade_id` varchar(100) DEFAULT NULL COMMENT '交易id',
  `gender` tinyint(4) DEFAULT NULL COMMENT '性别',
  `birthday` timestamp(6) NOT NULL COMMENT '出生日期',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `idx_trade_id` (`trade_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

INSERT INTO hopegaming_main.test_1234
(id, name, trade_id, gender, birthday)
VALUES('1', 'zhangsan', '123', 0, CURRENT_TIMESTAMP(6)),
('2', 'zhaosi', '124', 0, CURRENT_TIMESTAMP(6)),
('3', 'wangwu', '125', 0, CURRENT_TIMESTAMP(6)),
('4', 'maqi', '126', 0, CURRENT_TIMESTAMP(6));


CREATE TABLE `hopegaming_main`.`test_1235` (
  `id` varchar(30) NOT NULL COMMENT '身份证号',
  `nick_name` varchar(100) DEFAULT NULL COMMENT '别名',
  `trade_id` varchar(100) DEFAULT NULL COMMENT '交易id',
  `address` varchar(100) DEFAULT NULL COMMENT '地址',
  `email` varchar(6) NOT NULL COMMENT '出生日期',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `idx_trade_id` (`trade_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

INSERT INTO hopegaming_main.test_1235
(id, nick_name, trade_id, address, email)
VALUES('1', 'zhangsan', '123', 'beijing', '0000'),
('2', 'wangwu', '123', 'tianjin', '1111'),
('3', 'maqi', '124', 'shanghai', '2222'),
('4', 'yangliu', '127', 'shanxi', '3333');

总结

到此这篇关于Mysql中where与on的区别及何时使用的文章就介绍到这了,更多相关Mysql中where与on区别内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
虚拟机linux端mysql数据库无法远程访问的解决办法
May 26 MySQL
mysql 如何获取两个集合的交集/差集/并集
Jun 08 MySQL
详解MySQL多版本并发控制机制(MVCC)源码
Jun 23 MySQL
MySQL系列之八 MySQL服务器变量
Jul 02 MySQL
MySQL七大JOIN的具体使用
Feb 28 MySQL
Mysql外键约束的创建与删除的使用
Mar 03 MySQL
分享几个简单MySQL优化小妙招
Mar 31 MySQL
MySQL磁盘碎片整理实例演示
Apr 03 MySQL
mysql查询结果实现多列拼接查询
Apr 03 MySQL
MySQL脏读,幻读和不可重复读
May 11 MySQL
MySQL数据库简介与基本操作
May 30 MySQL
MySql数据库触发器使用教程
Jun 01 MySQL
SQL实现LeetCode(178.分数排行)
Aug 04 #MySQL
SQL实现LeetCode(177.第N高薪水)
Aug 04 #MySQL
MySQL千万级数据表的优化实战记录
Aug 04 #MySQL
SQL实现LeetCode(176.第二高薪水)
Aug 04 #MySQL
Mysql8.0递归查询的简单用法示例
Aug 04 #MySQL
SQL之各种join小结详细讲解
SQL实现LeetCode(175.联合两表)
Aug 04 #MySQL
You might like
php empty,isset,is_null判断比较(差异与异同)
2010/10/19 PHP
md5 16位二进制与32位字符串相互转换示例
2013/12/30 PHP
PHP缓存机制Output Control详解
2014/07/14 PHP
thinkPHP5框架auth权限控制类与用法示例
2018/06/12 PHP
js传值 判断
2006/10/26 Javascript
Firefox中autocomplete="off" 设置不起作用Bug的解决方法
2011/03/25 Javascript
JS动态增加删除UL节点LI及相关内容示例
2014/05/21 Javascript
ff chrome和ie下全局动态定位的异同及全局高度的取法
2014/06/30 Javascript
JS根据年月获得当月天数的实现代码
2014/07/03 Javascript
jquery实现图片水平滚动效果代码分享
2015/08/26 Javascript
JavaScript中this的9种应用场景及三种复合应用场景
2015/09/12 Javascript
深入浅出讲解ES6的解构
2016/08/03 Javascript
jQuery实现输入框邮箱内容自动补全与上下翻动显示效果【附demo源码下载】
2016/09/20 Javascript
JS点击某个图标或按钮弹出文件选择框的实现代码
2016/09/27 Javascript
jQuery实现删除li节点的方法
2016/12/06 Javascript
用js屏蔽被http劫持的浮动广告实现方法
2017/08/10 Javascript
bootstrap响应式导航条模板使用详解(含下拉菜单,弹出框)
2017/11/17 Javascript
JS实现4位随机验证码
2020/10/19 Javascript
python使用Berkeley DB数据库实例
2014/09/26 Python
Python实现字典去除重复的方法示例
2017/07/31 Python
Python第三方Window模块文件的几种安装方法
2018/11/22 Python
详解Appium+Python之生成html测试报告
2019/01/04 Python
python中的函数递归和迭代原理解析
2019/11/14 Python
python 经典数字滤波实例
2019/12/16 Python
解决Jupyter notebook更换主题工具栏被隐藏及添加目录生成插件问题
2020/04/20 Python
使用darknet框架的imagenet数据分类预训练操作
2020/07/07 Python
html5指南-7.geolocation结合google maps开发一个小的应用
2013/01/07 HTML / CSS
意大利在线购买隐形眼镜网站:VisionDirect.it
2019/03/18 全球购物
Nike澳大利亚官网:Nike.com (AU)
2019/06/03 全球购物
2014年教师批评与自我批评思想汇报
2014/09/20 职场文书
2014年房产经纪人工作总结
2014/12/08 职场文书
公务员年度考核评语
2014/12/31 职场文书
雷锋观后感
2015/06/10 职场文书
2016猴年开门红标语口号
2015/12/26 职场文书
详解PHP用mb_string处理windows中文字符
2021/05/26 PHP
nginx 添加http_stub_status_module模块
2022/05/25 Servers