Mysql多表查询详解

有目标就不怕路远。年轻人.无论你现在身在何方.重要的是你将要向何处去。只有明确的目标才能助你成功。没有目标的航船.任何方向的风对他来说都是逆风。因此,再遥远的旅程,只要有目标.就不怕路远。没有目标,哪来的劲头?一车尔尼雷夫斯基

导读:本篇文章讲解 Mysql多表查询详解,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

1、多表连接分类:

  • A)内连接:join,inner join

  • B)外连接:left join,left outer join,right join,right outer join,union

  • C)交叉连接:cross join

2、数据表

两张表格如下:

TableA:

id age
1 10
2 11
3 12
4 13

TableB:

id age
2 zhang
3 li
4 zhou
5 chen

3、内连接(inner join 或者join)

select a.*, b.* from tablea a
inner join tableb b
on a.id = b.id

select a.*, b.* from tablea a
join tableb b
on a.id = b.id

结果如下:

id age id age
2 11 2 zhang
3 12 3 li
4 13 4 zhou

4、外连接(六种场景)

4.1 left join 或者left outer join(等同于left join)

select a.*, b.* from tablea a
left join tableb b
on a.id = b.id

或者

select a.*, b.* from tablea a
left outer join tableb b
on a.id = b.id

结果如下,TableB中更不存在的记录填充Null:

id age id age
1 10 Null Null
2 11 2 zhang
3 12 3 li
4 13 4 zhou

4.2 [left join 或者left outer join(等同于left join)] + [where B.column is null]

select a.id aid,a.age,b.id bid,b.name from tablea a
left join tableb b
on a.id = b.id
Where b.id is null

结果如下:

id age id age
1 10 Null Null

4.3 right join 或者fight outer join(等同于right join)

select a.id aid,a.age,b.id bid,b.name from tablea a
right join tableb b
on a.id = b.id

结果如下,TableB中更不存在的记录填充Null:

id age id age
2 11 2 zhang
3 12 3 li
4 13 4 zhou
Null Null 5 chen

4.4 [left join 或者left outer join(等同于left join)] + [where A.column is null]

select a.id aid,a.age,b.id bid,b.name from tablea a
right join tableb b
on a.id = b.id
where a.id is null

结果如下:

id age id age
Null Null 5 chen

4.5 full join (mysql不支持,但是可以用 left join union right join代替)

select a.id aid,a.age,b.id bid,b.name from tablea a
left join tableb b
on a.id = b.id
union
select a.id aid,a.age,b.id bid,b.name from tablea a
right join tableb b
on a.id = b.id

union过后,重复的记录会合并(id为2,3,4的三条记录),所以结果如下:

id age id age
1 10 Null Null
2 11 2 zhang
3 12 3 li
4 13 4 zhou
Null Null 5 chen

4.6 full join + is null(mysql不支持,但是可以用 (left join + is null) union (right join+isnull代替)

select a.id aid,a.age,b.id bid,b.name from tablea a
left join tableb b
on a.id = b.id
where b.id is null
union
select a.id aid,a.age,b.id bid,b.name from tablea a
right join tableb b
on a.id = b.id
where a.id is null

结果如下:

id age id age
1 10 Null Null
Null Null 5 chen

5、交叉连接 (cross join)

5.1 cross join:

实际应用中还有这样一种情形,想得到排列组合,即笛卡儿积,这个就不好用集合和元素来表示了。需要用到cross join

select a.id aid,a.age,b.id bid,b.name from tablea a
cross join tableb b

结果如下:

id age id age
1 10 2 zhang
2 11 2 zhang
3 12 2 zhang
4 13 2 zhang
1 10 3 li
2 11 3 li
3 12 3 li
4 13 3 li
1 10 4 zhou
2 11 4 zhou
3 12 4 zhou
4 13 4 zhou
1 10 5 chen
2 11 5 chen
3 12 5 chen
4 13 5 chen

5.2 cross join指定条件 (where):

select a.id aid,a.age,b.id bid,b.name from tablea a
cross join tableb b
where a.id = b.id

结果如下;

id age id age
2 11 2 zhang
3 12 3 li
4 13 4 zhou

注:这种情况下实际上实现了内连接的效果

6、总结

注意事项:

上面仍然存在遗漏,那就是mysql对sql语句的容错问题,即在sql语句不完全符合书写建议的情况,mysql会允许这种情况,尽可能地解释它:

  • 一般cross join后面加上where条件,但是用cross join+on也是被解释为cross join+where;

  • 一般内连接都需要加上on限定条件,如上面场景2.1;如果不加会被解释为交叉连接;

  • 如果连接表格使用的是逗号,会被解释为交叉连接;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/135655.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!