工作中,由于看到错误使用的外连接后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请用本例的表自行进行验证).