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

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');

总结

来源:https://juejin.cn/post/6990283379841171493

标签:mysql,on,where
0
投稿

猜你喜欢

  • 数组任意位置插入元素,删除特定元素的实例

    2024-05-05 09:18:22
  • Python Flask-Login模块使用案例详解

    2021-10-14 21:01:17
  • 解决Pytorch在测试与训练过程中的验证结果不一致问题

    2022-08-18 03:50:13
  • ASP中模拟PHP的关联数组

    2009-12-25 16:31:00
  • 手把手教你如何使python变为可执行文件

    2021-09-12 04:26:36
  • Python学习笔记之抓取某只基金历史净值数据实战案例

    2021-08-14 20:28:13
  • Js 按照MVC模式制作自定义控件

    2008-10-12 12:11:00
  • python3中int(整型)的使用教程

    2021-12-29 19:51:31
  • 使用uni-app开发微信小程序的实现

    2024-05-13 09:10:42
  • 史上最简单的MySQL数据备份与还原教程(中)(三十六)

    2024-01-24 08:40:56
  • python根据照片获取地理位置及泄露防御

    2022-03-23 11:16:54
  • python排序函数sort()与sorted()的区别

    2023-09-08 23:38:08
  • 解决seaborn在pycharm中绘图不出图的问题

    2023-11-29 02:22:52
  • Go语言init函数详解

    2024-05-11 09:18:31
  • SQL Server 压缩日志与减少SQL Server 文件大小的方法

    2024-01-22 04:26:45
  • Numpy实现卷积神经网络(CNN)的示例

    2022-10-06 17:44:17
  • Python数字比较与类结构

    2023-07-29 13:33:51
  • Mysql binlog日志文件过大的解决

    2024-01-19 09:49:15
  • Python中turtle库常用代码汇总

    2021-02-24 06:50:38
  • numpy.transpose对三维数组的转置方法

    2023-10-11 07:32:36
  • asp之家 网络编程 m.aspxhome.com