LEFT JOIN ON AND/WHERE
LEFT JOIN ON AND/WHERE
Question
这两个SQL查询的结果相同吗?
1 | |
Test SQL
Creat Database
1 | |
Creat Table
1 | |
Creat Data
1 | |
Query Result
1 | |
| TableAId | Code | Name | TableBId | AId | Code | Name |
|---|---|---|---|---|---|---|
| 1 | A | A | 1 | 1 | C | C |
| 1 | A | A | 2 | 1 | D | D |
| 2 | B | B | 3 | 2 | E | E |
| 2 | B | B | 4 | 2 | D | D |
| 3 | C | C | NULL | NULL | NULL | NULL |
1 | |
| TableAId | Code | Name | TableBId | AId | Code | Name |
|---|---|---|---|---|---|---|
| 1 | A | A | NULL | NULL | NULL | NULL |
| 2 | B | B | NULL | NULL | NULL | NULL |
| 3 | C | C | NULL | NULL | NULL | NULL |
1 | |
| TableAId | Code | Name | TableBId | AId | Code | Name |
|---|---|---|---|---|---|---|
| 1 | A | A | 1 | 1 | C | C |
| 1 | A | A | 2 | 1 | D | D |
| 2 | B | B | NULL | NULL | NULL | NULL |
| 3 | C | C | NULL | NULL | NULL | NULL |
1 | |
| TableAId | Code | Name | TableBId | AId | Code | Name |
|---|---|---|---|---|---|---|
| 1 | A | A | 1 | 1 | C | C |
| 1 | A | A | 2 | 1 | D | D |
| 2 | B | B | NULL | NULL | NULL | NULL |
| 3 | C | C | NULL | NULL | NULL | NULL |
1 | |
| TableAId | Code | Name | TableBId | AId | Code | Name |
|---|---|---|---|---|---|---|
| 1 | A | A | 1 | 1 | C | C |
| 1 | A | A | 2 | 1 | D | D |
1 | |
| TableAId | Code | Name | TableBId | AId | Code | Name |
|---|---|---|---|---|---|---|
| 1 | A | A | 1 | 1 | C | C |
| 1 | A | A | 2 | 1 | D | D |
ALL

Conclusion
连接多张表查询时会生成临时表,使用
LEFT JOIN时
ON是生成临时表的条件,不管ON的结果是否为真,都会返回左边表的所有数据AND是在ON的基础上进行过滤,但是仍会返回左边表的所有数据WHERE是在临时表生成后,进行过滤,相当于对单表进行过滤
REF
LEFT JOIN ON AND/WHERE