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 infobright的安装步骤
Apr 07 MySQL
MySQL Innodb关键特性之插入缓冲(insert buffer)
Apr 08 MySQL
Mysql官方性能测试工具mysqlslap的使用简介
May 21 MySQL
新手入门Mysql--概念
Jun 18 MySQL
SQL实现LeetCode(197.上升温度)
Aug 07 MySQL
mysql如何能有效防止删库跑路
Oct 05 MySQL
weblogic服务建立数据源连接测试更新mysql驱动包的问题及解决方法
Jan 22 MySQL
MySQL 分区表中分区键为什么必须是主键的一部分
Mar 17 MySQL
MySQL数据库之存储过程 procedure
Jun 16 MySQL
浅谈MySql update会锁定哪些范围的数据
Jun 25 MySQL
MySQL生成千万测试数据以及遇到的问题
Aug 05 MySQL
postgresql如何找到表中重复数据的行并删除
May 08 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企业级应用之常见缓存技术篇
2011/01/27 PHP
php中批量删除Mysql中相同前缀的数据表的代码
2011/07/01 PHP
php 生成唯一id的几种解决方法
2013/03/08 PHP
php+jQuery+Ajax实现点赞效果的方法(附源码下载)
2020/07/21 PHP
php 使用curl模拟登录人人(校内)网的简单实例
2016/06/06 PHP
alixixi runcode.asp的代码不错的应用
2007/08/08 Javascript
jQuery EasyUI API 中文文档 - ComboTree组合树
2011/10/11 Javascript
jquery validate poshytip 自定义样式
2012/11/26 Javascript
使用js 设置url参数
2013/07/08 Javascript
JQuery对id中含有特殊字符的转义处理示例
2013/09/06 Javascript
学习Javascript闭包(Closure)知识
2016/08/07 Javascript
用JavaScript实现让浏览器停止载入页面的方法
2017/01/19 Javascript
Angular.Js中过滤器filter与自定义过滤器filter实例详解
2017/05/08 Javascript
jQuery zTree树插件动态加载实例代码
2017/05/11 jQuery
ionic2自定义cordova插件开发以及使用(Android)
2017/06/19 Javascript
jquery根据name取得select选中的值实例(超简单)
2018/01/25 jQuery
AngularJS中重新加载当前路由页面的方法
2018/03/09 Javascript
使用vuex缓存数据并优化自己的vuex-cache
2018/05/30 Javascript
axios异步提交表单数据的几种方法
2019/08/11 Javascript
JS替换字符串中指定位置的字符(多种方法)
2020/05/28 Javascript
[45:17]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第三场 1月9日
2021/03/11 DOTA
python下函数参数的传递(参数带星号的说明)
2010/09/19 Python
Python处理JSON时的值报错及编码报错的两则解决实录
2016/06/26 Python
Python基于回溯法子集树模板解决野人与传教士问题示例
2017/09/11 Python
Python使用base64模块进行二进制数据编码详解
2018/01/11 Python
Python实现OpenCV的安装与使用示例
2018/03/30 Python
Python使用pandas对数据进行差分运算的方法
2018/12/22 Python
使用Python计算玩彩票赢钱概率
2019/06/26 Python
pytorch中的自定义反向传播,求导实例
2020/01/06 Python
tensorflow实现测试时读取任意指定的check point的网络参数
2020/01/21 Python
如何基于pandas读取csv后合并两个股票
2020/09/25 Python
CSS3中新增的对文本和字体的设置
2020/02/03 HTML / CSS
银行营业厅大堂经理岗位职责
2014/01/06 职场文书
学校会议通知范文
2015/04/15 职场文书
JAVA SpringMVC实现自定义拦截器
2022/03/16 Python
使用CSS实现六边形的图片效果
2022/08/05 HTML / CSS