Left Join 有关 On And Where 的问题

70 阅读1分钟

之前实习遇到过相关问题,使用 left join使用and进行多条件查询存在问题,特此记录

CREATE TABLE EMPLOYEE( 
    ID INT PRIMARY KEY , 
    NAME VARCHAR(20) ,
    DEPTID INT 
); 
INSERT INTO EMPLOYEE VALUES (1,'张三',1); 
INSERT INTO EMPLOYEE VALUES (2,'李四',2); 
INSERT INTO EMPLOYEE VALUES (3,'王五',3); 
CREATE TABLE DEPT( 
   ID INT PRIMARY KEY , 
   NAME VARCHAR(20) 
); 
INSERT INTO DEPT VALUES (1,'人力部');
INSERT INTO DEPT VALUES (2,'产品部'); 
INSERT INTO DEPT VALUES (3,'销售部');
  • left joinon where
SELECT
	e.id eid, 
	e.name ename,
	e.deptid deptid,
	p.id pid,
	p.name pname
FROM
	EMPLOYEE e
LEFT JOIN DEPT p 
ON e.DEPTID = p.ID 
where p.name = '人力部';
eidenamedeptidpidpname
1张三11人力部
  • left joinon and
SELECT
	e.id eid, 
	e.name ename,
	e.deptid deptid,
	p.id pid,
	p.name pname
FROM
	EMPLOYEE e
LEFT JOIN DEPT p 
ON e.DEPTID = p.ID 
and p.name = '人力部';
eidenamedeptidpidpname
1张三11人力部
2李四2(NULL)(NULL)
3王五3(NULL)(NULL)
INSERT INTO DEPT VALUES (1,'风控部');
SELECT
	e.id eid, 
	e.name ename,
	e.deptid deptid,
	p.id pid,
	p.name pname
FROM
	EMPLOYEE e
LEFT JOIN DEPT p 
ON p.name = '人力部';
eidenamedeptidpidpname
1张三11人力部
2李四21人力部
3王五31人力部

左连接(不管on条件是否满足,左侧表所有记录都会返回)

  • 使用 on and该组合条件过滤右侧表记录
  • 根据组合过滤条件对左侧表与过滤出的右侧表记录连接,满足关联条件则返回左侧表和右侧表字段内容
  • 不满足则只返回左侧表字段信息,右侧表字段显示NULL
  • 连接结果集存入临时表中
  • where条件对临时表中数据过滤