零.总述
- JOIN命令主要用来:基于表之间的共同字段,将多个表连接起来
- 常见的JOIN命令有:INNER JOIN(即,JOIN)、LEFT JOIN、RIGHT JOIN、FULL JOIN
- 示例表
table_a
| student_id | name | score |
|---|---|---|
| 1 | 小张 | 86 |
| 2 | 小王 | 90 |
| 3 | 小李 | 76 |
| 4 | 小张 | 93 |
| 5 | 小牛 | 86 |
table_b
| teacher_id | school | teacher |
|---|---|---|
| 1 | 一中 | Lisa |
| 3 | 师范附中 | Shirly |
| 5 | 三中 | Tom |
| 6 | 三中 | Sherry |
| 8 | 一零一中学 | Lisa |
一.INNER JOIN
-
INNER JOIN一般也简写为JOIN,是内连接,返回两个表的交集部分
-
句式:select a.xx a.yy b.zz from table_a a inner join table_b b on a.m=b.n
-
示例
select * from table_a a inner join table_b b on a.student_id=b.teacher_id
student_id name score teacher_id school teacher 1 小张 86 1 一中 Lisa 3 小李 76 3 师范附中 Shirly 5 小牛 86 5 三中 Tom
二.LEFT JOIN
-
LEFT JOIN 会读取左侧数据表的全部数据,即使右侧表中无对应数据
-
句式:select a.xx a.yy b.zz from table_a a left join table_b b on a.m=b.n
-
示例
select * from table_a a left join table_b b on a.student_id=b.teacher_id
student_id name score teacher_id school teacher 1 小张 86 1 一中 Lisa 2 小王 90 NULL NULL NULL 3 小李 76 3 师范附中 Shirly 4 小张 93 NULL NULL NULL 5 小牛 86 5 三中 Tom
三.RIGHT JOIN
-
RIGHT JOIN 会读取右侧数据表的全部数据,即使左侧表中无对应数据
-
句式:select a.xx a.yy b.zz from table_a a right join table_b b on a.m=b.n
-
示例
select a.name b.teacher_id b.school from table_a a right join table_b b on a.student_id=b.teacher_id
name teacher_id school 小张 1 一中 小李 3 师范附中 小牛 5 三中 NULL 6 三中 NULL 8 一零一中学
四.FULL JOIN
- FULL JOIN 显示左右两张表的全部数据,返回左表和右表中的所有行,当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值
- Oracle数据库支持full join,mysql是不支持full join的
五.on和where的区别
- 示例:select a.xx a.yy b.zz from table_a a left join table_b b on a.m=b.n where a.m=mmm
- on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录
- where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉