數(shù)據(jù)行數(shù)減少
- A表數(shù)據(jù)
| aid | name | a_id |
|---|---|---|
| 1 | 張三 | 1 |
| 2 | 李四 | 2 |
| 3 | 王二麻 | 3 |
| 4 | 周一 | 4 |
- B表數(shù)據(jù)
| bid | name | b_id |
|---|---|---|
| 1 | 語文 | 1 |
| 2 | 數(shù)學(xué) | 2 |
| 3 | 物理 | 3 |
| 4 | 英語 | 4 |
| 4 | 化學(xué) | 5 |
SQL:
SELECT * FROM a LEFT JOIN b ON a.a_id=b.b_id WHERE b.b_id > 3
結(jié)果:
| aid | name | a_id | id(1) | name(1) | b_id |
|---|---|---|---|---|---|
| 4 | 周一 | 4 | 4 | 英語 | 4 |
結(jié)論:
當where 條件在外,會先聚合后過濾,所以結(jié)果會變少
數(shù)據(jù)行數(shù)增多
- A表數(shù)據(jù)
| aid | name | a_id |
|---|---|---|
| 1 | 張三 | 1 |
| 2 | 李四 | 2 |
| 3 | 王二麻 | 3 |
| 4 | 周一 | 4 |
- B表數(shù)據(jù)
| bid | name | b_id |
|---|---|---|
| 1 | 語文 | 1 |
| 2 | 數(shù)學(xué) | 2 |
| 3 | 物理 | 3 |
| 4 | 英語 | 4 |
| 4 | 化學(xué) | 4 |
SQL:
SELECT * FROM a LEFT JOIN b ON a.a_id=b.b_id WHERE b.b_id > 3
結(jié)果:
| aid | name | a_id | id(1) | name(1) | b_id |
|---|---|---|---|---|---|
| 4 | 周一 | 4 | 4 | 英語 | 4 |
| 4 | 周一 | 4 | 5 | 化學(xué) | 4 |
結(jié)論:
因為這個時候B表有重復(fù)的b_id,如果這時候計算A表值的count 或者sum ,結(jié)果會比預(yù)想的大。
雖然很簡單,但是很容易犯錯誤
數(shù)據(jù)重復(fù) 解決方案
- 使用distinct去重
SELECT DISTINCT a.* FROM a LEFT JOIN b ON a.a_id=b.b_id WHERE b.b_id > 3
查詢結(jié)果:
| 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 | 化學(xué) | 4 |
結(jié)論:
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
查詢結(jié)果:
| aid | name | a_id | id(1) | name(1) | b_id |
|---|---|---|---|---|---|
| 4 | 周一 | 4 | 4 | 英語 | 4 |