MYSQL 表左连接 ON AND 和ON WHERE 的区别
首先是针对左右连接,这里与inner join区分
在使用left join时,on and 和on where会有区别
1. on的条件是在连接生成临时表时使用的条件,以左表为基准 ,不管on中的条件真否,都会返回左表中的记录
2.where条件是在临时表生成好后,再对临时表过滤。此时 和left join有区别(返回左表全部记录),条件不为真就全部过滤掉,on后的条件来生成左右表关联的临时表,
where后的条件是生成临时表后对临时表过滤
on and是进行韦恩运算时 连接时就做的动作,where是全部连接完后,再根据条件过滤
CREATE TABLE `a` ( `id` int(11) NOT NULL AUTO_INCREMENT, `sid` int(11) NOT NULL, `type` char(10) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `a` (`id`, `sid`, `type`) VALUES (1, 1, 'a'); INSERT INTO `a` (`id`, `sid`, `type`) VALUES (2, 1, 'b'); INSERT INTO `a` (`id`, `sid`, `type`) VALUES (3, 2, 'c'); INSERT INTO `a` (`id`, `sid`, `type`) VALUES (4, 3, 'd'); CREATE TABLE `b` ( `sid` int(11) NOT NULL, `remark` char(10) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `b` (`sid`, `remark`) VALUES (1, 'A'); INSERT INTO `b` (`sid`, `remark`) VALUES (2, 'B'); INSERT INTO `b` (`sid`, `remark`) VALUES (3, 'C'); INSERT INTO `b` (`sid`, `remark`) VALUES (4, 'D');
mysql> select * from a; +----+-----+------+ | id | sid | type | +----+-----+------+ | 1 | 1 | a | | 2 | 1 | b | | 3 | 2 | c | | 4 | 3 | d | +----+-----+------+ 4 rows in set mysql> select * from b; +-----+--------+ | sid | remark | +-----+--------+ | 1 | A | | 2 | B | | 3 | C | | 4 | D | +-----+--------+ 4 rows in set mysql> select * from a left join b on a.sid=b.sid; +----+-----+------+-----+--------+ | id | sid | type | sid | remark | +----+-----+------+-----+--------+ | 1 | 1 | a | 1 | A | | 2 | 1 | b | 1 | A | | 3 | 2 | c | 2 | B | | 4 | 3 | d | 3 | C | +----+-----+------+-----+--------+ mysql> select * from a left join b on a.sid=b.sid and a.sid=1; +----+-----+------+------+--------+ | id | sid | type | sid | remark | +----+-----+------+------+--------+ | 1 | 1 | a | 1 | A | | 2 | 1 | b | 1 | A | | 3 | 2 | c | NULL | NULL | | 4 | 3 | d | NULL | NULL | +----+-----+------+------+--------+ mysql> select * from a left join b on a.sid=b.sid where a.sid=1; +----+-----+------+-----+--------+ | id | sid | type | sid | remark | +----+-----+------+-----+--------+ | 1 | 1 | a | 1 | A | | 2 | 1 | b | 1 | A | +----+-----+------+-----+--------+
对于inner join
mysql> select * from a inner join b on a.sid=b.sid and a.sid=1; +----+-----+------+-----+--------+ | id | sid | type | sid | remark | +----+-----+------+-----+--------+ | 1 | 1 | a | 1 | A | | 2 | 1 | b | 1 | A | +----+-----+------+-----+--------+ mysql> select * from a inner join b on a.sid=b.sid where a.sid=1; +----+-----+------+-----+--------+ | id | sid | type | sid | remark | +----+-----+------+-----+--------+ | 1 | 1 | a | 1 | A | | 2 | 1 | b | 1 | A | +----+-----+------+-----+--------+
on and和on where结果一致
在使用inner join时,不管是对左表还是右表进行筛选,on and和on where都会对生成的临时表进行过滤
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~