student 表
| id | name |
|---|---|
| 1 | 小明 |
| 2 | 小花 |
| 3 | 小黃 |
score 表
| id | student_id | score |
|---|---|---|
| 1 | 2 | 10 |
| 2 | 3 | 20 |
| 3 | 4 | 30 |
交叉連接
cross join
交叉連接可不帶 on 子句
把表 student 和表 score 的數(shù)據(jù)進(jìn)行一個N*M的組合,即笛卡爾積
如本例會產(chǎn)生3*3=9條記錄
//用法1
select * from student,score;
//用法2;
select * from student cross join score;
查詢結(jié)果:
| id | name | id | student_id | score |
|---|---|---|---|---|
| 1 | 小明 | 1 | 2 | 10 |
| 2 | 小花 | 1 | 2 | 10 |
| 3 | 小黃 | 1 | 2 | 10 |
| 1 | 小明 | 2 | 3 | 20 |
| 2 | 小花 | 2 | 3 | 20 |
| 3 | 小黃 | 2 | 3 | 20 |
| 1 | 小明 | 3 | 4 | 30 |
| 2 | 小花 | 3 | 4 | 30 |
| 3 | 小黃 | 3 | 4 | 30 |
內(nèi)連接
inner join
產(chǎn)生student表和score表的交集
內(nèi)連接可不帶 on 子句,當(dāng)不帶 on子句時相當(dāng)于 交叉連接產(chǎn)生的結(jié)果是 student 和 score 的交集
select * from student as a inner join score as b on a.id=b.student_id;
查詢結(jié)果:
| id | name | id | student_id | score |
|---|---|---|---|---|
| 2 | 小花 | 1 | 2 | 10 |
| 3 | 小黃 | 2 | 3 | 20 |
外連接
外連接必須帶 on 子句
- 左連接
left join
產(chǎn)生student表的完全集,而 score表中匹配的則有值,沒有匹配的則以null值取代
select * from student as a left join score as b on a.id=b.student_id;
查詢結(jié)果:
| id | name | id | student_id | score |
|---|---|---|---|---|
| 2 | 小花 | 1 | 2 | 10 |
| 3 | 小黃 | 2 | 3 | 20 |
| 1 | 小明 | NULL | NULL | NULL |
- 右連接
right join
產(chǎn)生score表的完全集,而 student表中匹配的則有值,沒有匹配的則以null值取代
select * from student as a right join score as b on a.id=b.student_id;
查詢結(jié)果:
| id | name | id | student_id | score |
|---|---|---|---|---|
| 2 | 小花 | 1 | 2 | 10 |
| 3 | 小黃 | 2 | 3 | 20 |
| NULL | NULL | 3 | 4 | 30 |
USING
USING是連接中on 子句的簡寫形式
當(dāng)on子句中關(guān)聯(lián)表的字段相同時可以使用USING
on t1.a = t2.a and t1.b = t2.b 等效于 using(a,b)
使用 * 查詢兩個表的所有字段時 using中的字段只顯示一次
select * from student as a left join score as b using(id);
查詢結(jié)果:
| id | name | student_id | score |
|---|---|---|---|
| 1 | 小明 | 2 | 10 |
| 2 | 小花 | 3 | 20 |
| 3 | 小黃 | 4 | 30 |
select * from student as a left join score as b on a.id=b.id;
查詢結(jié)果:
| id | name | id | student_id | score |
|---|---|---|---|---|
| 1 | 小明 | 1 | 2 | 10 |
| 2 | 小花 | 2 | 3 | 20 |
| 3 | 小黃 | 3 | 4 | 30 |
當(dāng)查詢兩個表的共同字段,并且該字段在using子句中時,不會報錯,但在on會引起歧義報錯
select id,name from student as a left join score as b using(id);
查詢結(jié)果:
| id | name |
|---|---|
| 1 | 小明 |
| 2 | 小花 |
| 3 | 小黃 |
select id,name from student as a left join score as b on a.id=b.id;
查詢結(jié)果:
[Err] 1052 - Column 'id' in field list is ambiguous