mysql中内连接和外连接on后的条件何时生效说明

本文通过实例演示了SQL中外连接时ON条件的正确使用方法,揭示了主表条件不生效的问题,并提供了有效的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

工作中,由于看到错误使用的外连接后on的条件,所以写此文章进行总结.

1.首先创建用户表t_user,手机号表t_phone.

#创建用户表
CREATE TABLE t_user(
user_id VARCHAR(36) PRIMARY KEY COMMENT'主键id',
user_name VARCHAR(255) COMMENT '用户姓名',
d TINYINT(2) DEFAULT 0 COMMENT '删除标识:0-表示未删除,1-表示删除'
) ENGINE=INNODB DEFAULT CHARSET=utf8;


#创建手机号表
CREATE TABLE t_phone(
id VARCHAR(36) PRIMARY KEY COMMENT'主键id',
phone_number VARCHAR(11) COMMENT'手机号',
user_id VARCHAR(36) COMMENT '用户id',
d TINYINT(2) DEFAULT 0 COMMENT '删除标识:0-表示未删除,1-表示删除'
) ENGINE=INNODB DEFAULT CHARSET=utf8;

2.给表中插入数据.

#用户表插入数据
INSERT INTO t_user(user_id,user_name,d)VALUES(UUID(),'张三',0);#1ae72fe7-b6e8-11e7-b728-222222222222
INSERT INTO t_user(user_id,user_name,d)VALUES(UUID(),'李四',1);#1af5ec06-b6e8-11e7-b728-222222222222
INSERT INTO t_user(user_id,user_name,d)VALUES(UUID(),'王五',0);#1b045552-b6e8-11e7-b728-222222222222

#手机号表插入数据
INSERT INTO t_phone(id,phone_number,user_id,d)VALUES(UUID(),'13678547895','1ae72fe7-b6e8-11e7-b728-222222222222',0);
INSERT INTO t_phone(id,phone_number,user_id,d)VALUES(UUID(),'12278547895','1ae72fe7-b6e8-11e7-b728-222222222222',1);

3.写连接查询sql进行验证.

#用户表做外连接手机号表
SELECT
*
FROM t_user tu
LEFT JOIN t_phone tp ON tp.user_id=tu.user_id AND tu.d=0;#通过结果可知主表t_user的d=0条件没有生效


SELECT
*
FROM t_user tu
LEFT JOIN t_phone tp ON tp.user_id=tu.user_id AND tp.d=0;#通过结果可知副表t_phone的d=0条件生效


4.结论:对于外连接而言,on后的只是属于主表的条件不会生效,要想生效,需要放置到where 条件后;对于inner join由于不存在主副表的概念,on后的条件都会生效(inner join请用本例的表自行进行验证).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值