数据行数减少
- A表数据
aid | name | a_id |
---|---|---|
1 | 张三 | 1 |
2 | 李四 | 2 |
3 | 王二麻 | 3 |
4 | 周一 | 4 |
- B表数据
bid | name | b_id |
---|---|---|
1 | 语文 | 1 |
2 | 数学 | 2 |
3 | 物理 | 3 |
4 | 英语 | 4 |
4 | 化学 | 5 |
SQL:
SELECT * FROM a LEFT JOIN b ON a.a_id=b.b_id WHERE b.b_id > 3
结果:
aid | name | a_id | id(1) | name(1) | b_id |
---|---|---|---|---|---|
4 | 周一 | 4 | 4 | 英语 | 4 |
结论:
当where 条件在外,会先聚合后过滤,所以结果会变少
数据行数增多
- A表数据
aid | name | a_id |
---|---|---|
1 | 张三 | 1 |
2 | 李四 | 2 |
3 | 王二麻 | 3 |
4 | 周一 | 4 |
- B表数据
bid | name | b_id |
---|---|---|
1 | 语文 | 1 |
2 | 数学 | 2 |
3 | 物理 | 3 |
4 | 英语 | 4 |
4 | 化学 | 4 |
SQL:
SELECT * FROM a LEFT JOIN b ON a.a_id=b.b_id WHERE b.b_id > 3
结果:
aid | name | a_id | id(1) | name(1) | b_id |
---|---|---|---|---|---|
4 | 周一 | 4 | 4 | 英语 | 4 |
4 | 周一 | 4 | 5 | 化学 | 4 |
结论:
因为这个时候B表有重复的b_id,如果这时候计算A表值的count 或者sum ,结果会比预想的大。
虽然很简单,但是很容易犯错误
数据重复 解决方案
- 使用distinct去重
SELECT DISTINCT a.* FROM a LEFT JOIN b ON a.a_id=b.b_id WHERE b.b_id > 3
查询结果:
aid | name | a_id |
---|---|---|
4 | 周一 | 4 |
SELECT DISTINCT * FROM a LEFT JOIN b ON a.a_id=b.b_id WHERE b.b_id > 3
aid | name | a_id | id(1) | name(1) | b_id |
---|---|---|---|---|---|
4 | 周一 | 4 | 4 | 英语 | 4 |
4 | 周一 | 4 | 5 | 化学 | 4 |
结论:
distinct用于多个字段时,需要这些字段都相同的时候才会达到滤重的目的。
- 使用group by去重(推荐使用)
SELECT * FROM a LEFT JOIN b ON a.a_id=b.b_id WHERE b.b_id > 3 GROUP BY a.id
查询结果:
aid | name | a_id | id(1) | name(1) | b_id |
---|---|---|---|---|---|
4 | 周一 | 4 | 4 | 英语 | 4 |