之前实习遇到过相关问题,使用 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,'销售部');
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 = '人力部';
| eid | ename | deptid | pid | pname |
|---|
| 1 | 张三 | 1 | 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 e.DEPTID = p.ID
and p.name = '人力部';
| eid | ename | deptid | pid | pname |
|---|
| 1 | 张三 | 1 | 1 | 人力部 |
| 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 = '人力部';
| eid | ename | deptid | pid | pname |
|---|
| 1 | 张三 | 1 | 1 | 人力部 |
| 2 | 李四 | 2 | 1 | 人力部 |
| 3 | 王五 | 3 | 1 | 人力部 |
左连接(不管on条件是否满足,左侧表所有记录都会返回)
- 使用
on and该组合条件过滤右侧表记录
- 根据组合过滤条件对左侧表与过滤出的右侧表记录连接,满足关联条件则返回左侧表和右侧表字段内容
- 不满足则只返回左侧表字段信息,右侧表字段显示NULL
- 连接结果集存入临时表中
- where条件对临时表中数据过滤