表结构如下
表Table_A:
| id | name |
|---|---|
| 1 | 张三 |
| 2 | 赵四 |
| 3 | 王五 |
表Table_B:
| id | type |
|---|---|
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
想查询出A表中所有的结果并关联B中特定字段,如下表
| id | name | type |
|---|---|---|
| 1 | 张三 | 1 |
| 2 | 赵四 | null |
| 3 | 王五 | null |
错误SQL:
SELECT A.* ,B.type FROM Table_A A LEFT JOIN Table_B B ON A.id=B.id WHERE B.type=1
结果:
| id | name | type |
|---|---|---|
| 1 | 张三 | 1 |
正确SQL:
SELECT A.* ,B.type FROM Table_A A LEFT JOIN Table_B B ON A.id=B.id AND B.type=1
结果:
| id | name | type |
|---|---|---|
| 1 | 张三 | 1 |
| 2 | 赵四 | null |
| 3 | 王五 | null |
原因:
sql1是在SELECT A.* ,B.type FROM Table_A A LEFT JOIN Table_B B ON A.id=B.id查询后执行WHERE B.type=1,所以过滤掉了type不为1的数据
sql2可以理解为是在A关联B时对比B进行了筛选
本文通过一个具体的例子展示了如何正确使用SQL的左连接(LEFT JOIN)与WHERE子句来获取所需的数据。错误的SQL语句会导致部分数据被误删,而正确的用法能够保留所有相关记录。
1636

被折叠的 条评论
为什么被折叠?



