inner join和left join之间的区别详解
前言
关于innerjoin与leftjoin之间的区别,以前以为自己搞懂了,今天从前端取参数的时候发现不是预想中的结果,才知道问题出在innerjoin上了。
需求是从数据库查数据,在前端以柱形图的形式展现出来,查到的数据按行业分组,显示每个行业的户数及户数占比,涉及到的字段有A表的用户数、总用户数和B表的行业名称。本来是不管查不查的到数据,在X轴都应该显示行业名称的,结果是X、Y轴都没有任何数据显示。问题就是我用错了联结方式。
一、sql的leftjoin、rightjoin、innerjoin之间的区别
leftjoin(左联接)返回包括左表中的所有记录和右表中联结字段相等的记录
rightjoin(右联接)返回包括右表中的所有记录和左表中联结字段相等的记录
innerjoin(等值连接)只返回两个表中联结字段相等的行
举例如下:
--------------------------------------------
表A记录如下:
aIDaNum
1a20050111
2a20050112
3a20050113
4a20050114
5a20050115
表B记录如下:
bIDbName
12006032401
22006032402
32006032403
42006032404
82006032408
--------------------------------------------
1.leftjoin
sql语句如下:
select*fromA leftjoinB onA.aID=B.bID
结果如下:
aIDaNumbIDbName
1a2005011112006032401
2a2005011222006032402
3a2005011332006032403
4a2005011442006032404
5a20050115NULLNULL(所影响的行数为5行)
结果说明:
leftjoin是以A表的记录为基础的,A可以看成左表,B可以看成右表,leftjoin是以左表为准的.
换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为:A.aID=B.bID).
B表记录不足的地方均为NULL.
--------------------------------------------
2.rightjoin
sql语句如下:
select*fromA rightjoinB onA.aID=B.bID
结果如下:
aIDaNumbIDbName
1a2005011112006032401
2a2005011222006032402
3a2005011332006032403
4a2005011442006032404
NULLNULL82006032408(所影响的行数为5行)
结果说明:
仔细观察一下,就会发现,和leftjoin的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充.
--------------------------------------------
3.innerjoin
sql语句如下:
select*fromA innerjoinB onA.aID=B.bID
结果如下:
aIDaNumbIDbName
1a2005011112006032401
2a2005011222006032402
3a2005011332006032403
4a2005011442006032404
结果说明:
很明显,这里只显示出了A.aID=B.bID的记录.这说明innerjoin并不以谁为基础,它只显示符合条件的记录.
总结
到此这篇关于innerjoin和leftjoin之间的区别详解的文章就介绍到这了,更多相关innerjoin和leftjoin区别内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!