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 相关文章推荐
mysql 8.0.24版本安装配置方法图文教程
May 12 MySQL
Mysql数据库命令大全
May 26 MySQL
MYSQL(电话号码,身份证)数据脱敏的实现
May 28 MySQL
mysql 带多个条件的查询方式
Jun 05 MySQL
Mysql中一千万条数据怎么快速查询
Dec 06 MySQL
MySQL中rank() over、dense_rank() over、row_number() over用法介绍
Mar 23 MySQL
Mysql分析设计表主键为何不用uuid
Mar 31 MySQL
数据分析数据库ClickHouse在大数据领域应用实践
Apr 03 MySQL
MySQL库表太大怎么办? 数据库分库分表项目实践
Apr 11 MySQL
深入理解mysql事务隔离级别和存储引擎
Apr 12 MySQL
MySQL 数据库范式化设计理论
Apr 22 MySQL
MySQL查询日期时间
May 15 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 Sql Server连接失败问题及解决办法
2009/08/07 PHP
file_get_contents("php://input", "r")实例介绍
2013/07/01 PHP
PHP的变量类型和作用域详解
2014/03/12 PHP
php中使用key,value,current,next和prev函数遍历数组的方法
2015/03/17 PHP
php处理单文件、多文件上传代码分享
2016/08/24 PHP
mac系统下安装多个php并自由切换的方法详解
2017/04/21 PHP
jQuery Tab插件 用于在Tab中显示iframe,附源码和详细说明
2011/06/27 Javascript
jquery实现一个简单的表单验证实例
2016/03/30 Javascript
Angular.js中控制器之间的传值详解
2017/04/24 Javascript
Vue.js 中的 $watch使用方法
2017/05/25 Javascript
js中document.write和document.writeln的区别
2018/03/11 Javascript
在微信小程序中渲染HTML内容的方法示例
2018/09/28 Javascript
微信小程序带动画弹窗组件使用方法详解
2018/11/27 Javascript
微信小程序学习笔记之目录结构、基本配置图文详解
2019/03/28 Javascript
[56:56]VG vs LGD 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.22
2019/09/05 DOTA
举例详解Python中的split()函数的使用方法
2015/04/07 Python
基于Python实现的百度贴吧网络爬虫实例
2015/04/17 Python
python opencv 直方图反向投影的方法
2018/02/24 Python
Python之time模块的时间戳,时间字符串格式化与转换方法(13位时间戳)
2019/08/12 Python
python使用celery实现异步任务执行的例子
2019/08/28 Python
Python Lambda函数使用总结详解
2019/12/11 Python
Flask框架搭建虚拟环境的步骤分析
2019/12/21 Python
解决jupyter运行pyqt代码内核重启的问题
2020/04/16 Python
Windows环境下Python3.6.8 importError: DLLload failed:找不到指定的模块
2020/11/01 Python
详解CSS3中Media Queries的相关使用
2015/07/17 HTML / CSS
CSS3实现超酷的黑猫警长首页
2016/04/26 HTML / CSS
西班牙汉普顿小姐:购买帆布鞋和太阳镜
2016/10/23 全球购物
介绍一下XMLHttpRequest对象的常用方法和属性
2013/05/24 面试题
英文求职信结束语大全
2013/10/26 职场文书
化工专业个人的求职信范文
2013/11/28 职场文书
出售房屋协议书范本
2014/10/06 职场文书
小学科学教学计划
2015/01/21 职场文书
2019最新版试用期劳动合同模板!
2019/07/04 职场文书
网络安全倡议书(3篇)
2019/09/18 职场文书
Redis实现订单自动过期功能的示例代码
2021/05/08 Redis
为什么mysql字段要使用NOT NULL
2021/05/13 MySQL