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ù)進行一個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 子句,當不帶 on子句時相當于 交叉連接產(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 子句的簡寫形式
當on子句中關聯(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 |
當查詢兩個表的共同字段同波,并且該字段在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