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 设置boolean类型的操作
Jun 04 MySQL
Mysql数据库值的添加、修改、删除及清空操作实例
Jun 20 MySQL
MySQL系列之一 MariaDB-server安装
Jul 02 MySQL
sql注入教程之类型以及提交注入
Aug 02 MySQL
MySQL分库分表详情
Sep 25 MySQL
MySQL七种JOIN类型小结
Oct 24 MySQL
Mysql中有关Datetime和Timestamp的使用总结
Dec 06 MySQL
深入讲解数据库中Decimal类型的使用以及实现方法
Feb 15 MySQL
详细聊一聊mysql的树形结构存储以及查询
Apr 05 MySQL
为什么MySQL8新特性会修改自增主键属性
Apr 18 MySQL
pt-archiver 主键自增
Apr 26 MySQL
MySQL中正则表达式(REGEXP)使用详解
Jul 07 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
海贼王动画变成“真人”后,凯多神还原,雷利太帅了!
2020/04/09 日漫
探讨方法的重写(覆载)详解
2013/06/08 PHP
php操作xml入门之cdata区段
2015/01/23 PHP
Javascript获取窗口(容器)的大小及位置参数列举及简要说明
2012/12/09 Javascript
JS批量修改PS中图层名称的方法
2014/01/26 Javascript
jQuery scroll事件实现监控滚动条分页示例
2014/04/04 Javascript
Javascript实现的常用算法(如冒泡、快速、鸽巢、奇偶等)
2014/04/29 Javascript
通过js来制作复选框的全选和不选效果
2014/05/22 Javascript
推荐10个2014年最佳的jQuery视频插件
2014/11/12 Javascript
基于jQuery的网页影音播放器jPlayer的基本使用教程
2016/03/08 Javascript
JS实现用户注册时获取短信验证码和倒计时功能
2016/10/27 Javascript
js验证手机号、密码、短信验证码代码工具类
2020/06/24 Javascript
JS实现微信里判断页面是否被分享成功的方法
2017/06/06 Javascript
JS身份证信息验证正则表达式
2017/06/12 Javascript
详解node服务器中打开html文件的两种方法
2017/09/18 Javascript
echarts学习笔记之图表自适应问题详解
2017/11/22 Javascript
浅谈React Event实现原理
2018/09/20 Javascript
微信小程序 腾讯地图显示偏差问题解决
2019/07/27 Javascript
详解基于Vue/React项目的移动端适配方案
2019/08/23 Javascript
对layui初始化列表的CheckBox属性详解
2019/09/13 Javascript
vue.js 实现a标签href里添加参数
2019/11/12 Javascript
[01:14:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS Orenda
2014/05/22 DOTA
python求列表交集的方法汇总
2014/11/10 Python
Python双精度浮点数运算并分行显示操作示例
2017/07/21 Python
Python实现的质因式分解算法示例
2018/05/03 Python
Python脚本导出为exe程序的方法
2020/03/25 Python
Python 3.9的到来到底是意味着什么
2020/10/14 Python
Html5内唤醒百度、高德APP的实现示例
2019/05/20 HTML / CSS
英国最受信任的在线眼镜商之一:Fashion Eyewear
2019/10/31 全球购物
与UNIX有关的几个名词
2015/09/17 面试题
超市营业员岗位职责
2013/12/20 职场文书
工业自动化专业自荐信范文
2014/04/10 职场文书
信息技术研修心得体会
2016/01/08 职场文书
2019年中学生的思想品德评语集锦
2019/12/19 职场文书
教你使用pyinstaller打包Python教程
2021/05/27 Python
MySQL 如何设计统计数据表
2021/06/15 MySQL