测试
下面以staff_info
和staff_score
两张表为例,演示过滤条件放在where和on之间的区别
建表语句
1、员工基本信息表
CREATE TABLE `staff_info` (
`staff_id` varchar(10) NOT NULL COMMENT '员工编号',
`staff_name` varchar(10) DEFAULT NULL COMMENT '员工姓名',
PRIMARY KEY (`staff_id`)
) ENGINE=InnoDB DEFAULT COMMENT='员工基本信息表';
2、员工得分表
CREATE TABLE `staff_score` (
`staff_id` varchar(10) DEFAULT NULL COMMENT '员工编号',
`score` int DEFAULT NULL COMMENT '得分'
) ENGINE=InnoDB COMMENT='员工得分表';
插入数据后,得到的表为
1、员工基本信息表
2、员工得分表
on 和 where 具体分析条件
1、放在on后
筛选得分大于50分的人员信息
SELECT
si.staff_id,
si.staff_name,
ss.score
FROM
staff_info si
LEFT JOIN staff_score ss ON ss.staff_id = si.staff_id AND ss.score > 50
不符合筛选条件的左表数据还在,但关联的右表数据中score那一栏为Null
2、放在where后
筛选得分大于50分的人员信息
SELECT
si.staff_id,
si.staff_name,
ss.score
FROM
staff_info si
LEFT JOIN staff_score ss ON ss.staff_id = si.staff_id
WHERE
ss.score > 50
只显示了符合筛选条件的左表数据
总结
1、使用left join时,若右表的数据想要影响左表的数据时(即右表条数减少,关联的左表条数也随之减少),就把条件写在where后
2、当把条件写在on后时,此时条件只会影响右表,不会影响左表(即右表条数减少,关联的左表条数不变),左表的数据查不到右表数据时,不影响左表的数据条数,会将关联的右表数据补成null