Mysql中where与on的区别及何时使用详析
作者:跑saber 发布时间:2024-01-21 03:31:19
之前在写连表查询的时候,老是分不清楚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
结果集是两个表的笛卡尔积
2、inner join 连接两个表(有on)
select * from hopegaming_main.test_1234 t1 join hopegaming_main.test_1235 t2 on t1.trade_id = t2.trade_id
结果集是两个表有相同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
结果集是结果集是两个表有相同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
结果集是以左面的表为基础,直接根据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''
结果只会显示符合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');
总结
来源:https://juejin.cn/post/6990283379841171493


猜你喜欢
- 小渣渣复现大佬project发现GPU跑不动,出现如下报错:RuntimeError: CUDA out of memory.看下来最简单粗
- 数据库操作类的优点优点可以说是非常多了,常见的优点就是便于维护、复用、高效、安全、易扩展。例如PDO支持的数据库类型是非常多的,与mysql
- PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE 服务器和其他工具中了,近几年中更多的
- 1、背景我们先谈谈为什么在Python编码过程中强烈推荐使用类型注解 ?Python对于初学者来说是非常好上手,原因是在于对计算机底层原理的
- 背景:这个库的安装不是像其他的一样的直接使用 pip install XXX的形式,而是使用原始的Git方式1、apex这是NVIDIA开发
- QQWry.dat数据可以去百度搜索最新版本<%'======================================
- 介绍flask介绍Flask是一个轻量级的Python Web框架,它基于Werkzeug和Jinja2库构建,因其简洁、灵活、易扩展等特性
- 如今,互联网越来越走近我们的生活,网上冲浪也渐渐成为我们生活不可缺少的一部分。网络世界五彩缤纷,涌现出大量优秀精美的网页。大量网络信息的呈现
- 我们以前介绍过一篇Python加密的文章:Python 加密的实例详解。今天我们看看python中hashlib模块用法示例,具体如下。ha
- 一、在windows环境下修改pip镜像源的方法(以python3.5为例)(1):在windows文件管理器中,输入 %APPDATA%(
- 最近接触到微服务框架go-zero,翻看了整个框架代码,发现结构清晰、代码简洁,所以决定阅读源码学习下,本次阅读的源码位于core/sync
- 利用PIL将图片转换为黑色与白色反转的图片,下面笔者小白介绍如何实现。解决方案一:from PIL import Imageimport P
- python的便利性,使得如今许多软件开发者、黑客都开始使用python打包成exe的方式进行程序的发布,这类exe有个特点,就是可以使用反
- dom0级事件<a href="#" id="hash" onclick="fn()
- 这几天看了Amy老师的用javascript实现瀑布流,我跟着把代码敲出来。发现这样写只能第一次载入时适应屏幕,以后改变窗口大小就不能做到自
- 1、什么是AspJpeg?AspJpeg是一款功能强大的基于Microsoft IIS环境的图片处理组件,AspJpeg可以使用很少的代码在
- 如果网站只开了80端口,你会发现下面的方法是比较有用的,其中用的方法几乎都不是我发现的,文总包括一些注入时的个人经验和技巧方法可以说有4种(
- 这里讲解是图片上传和图片预览。主要是围绕我们常用功能的列子做讲解 ,并且没有格外引入其他js 所以你复制过去做简单修改便可以看到效果效果图:
- 下面给大家介绍远程连接mysql错误代码1130的解决方法:以上所述是小编给大家介绍的远程连接mysql错误代码1130的解决方法网站的支持
- vue在做大型项目时,会用到多状态管理,vuex允许我们将store分割成多个模块,每个模块内都有自己的state、mutation、act