Sql关联查询之inner join、left join、 right join、outer join
数据库查询inner join、left join 、right join的区别和应用!
一、先来两个表
- t_person表:
| number(pr_key) | name | class |
|---|---|---|
| 001 | 张三 | 三班 |
| 002 | 李四 | 三班 |
| 003 | 王五 | 三班 |
| 004 | 刘六 | 三班 |
- t_grade_list表:
| id (pr_key) | num | name | grade |
|---|---|---|---|
| a | 001 | 张三 | 99 |
| b | 002 | 李四 | 21 |
| c | 003 | 王五 | 88 |
| g | 101 | 马七 | 66 |
二、inner join(内连接)、left join(左连接) 、right join(右连接):
1、内连接(inner join):又叫等值连接,结果返回的是两个表中连接字段相等的行。
例如:
select tp.* , tg.grade from t_person tp
inner join t_grade tg on tp.number = tg.num
where 1 = 1
ORDER BY tg.grade desc
description: 查询出有成绩学员的信息和成绩并降序排列,两个表中都存在的数据才会返回,结果如下:

2、左连接(left join) :又叫左外连接,返回的结果是返回左表中所有的记录以及右表中连接字段相等的记录,没有匹配结果使用NULL填补,即左表全部行+右表匹配的行。(a left join b 默认 a为左表)
例如:
select tp.* , tg.grade from t_person tp
left join t_grade tg on tp.number = tg.num
where 1 = 1
ORDER BY tg.grade desc
description: 查询出人员表中所有学员的信息、有成绩的就加上、没成绩的就null填充。并以成绩降序排列,以左表为主表,结果如下:

3、右连接(right join): 返回右表中所有的记录以及左表中连接字段相等的记录,没有匹配结果使用NULL填补,即右边全部行+左边匹配的行。(a left join b 默认 b为右表、以右为主)
例如:
select tp.* , tg.grade from t_person tp
right join t_grade tg on tp.number = tg.num
where 1 = 1
ORDER BY tg.grade desc
description: 查询出人员表中所有成绩单里学员的成绩和信息、有信息的就加上、没信息的null填充,并以成绩降序排列,以右表为主表,左右连接刚好相反。结果如下:

- 补充:还有个外连接 (outer join):博主主要用的是mysql、据悉mysql没有外连接。外连接可以用左右union实现,如下:
select tp.* , tg.grade from t_person tp left join t_grade tg on tp.number = tg.num
union
select tp.* , tg.grade from t_person tp right join t_grade tg on tp.number = tg.num
where 1 = 1
ORDER BY grade desc
description: 外连接就是左右结合的效果,结果如下:

- 很久没写博客了、数据库查询之连接相对于是比较简单的东西,就当写个日记吧。如果对你有帮助、记得点个赞喔。如有错误还望指正哈。

浙公网安备 33010602011771号