mysql 中的左连接,右链接和内连接

左连接,右链接和内连接

在自己做项目的过程中,遇到了相关的数据库的查询的问题,在这里做一下简短的记录和总结
其中左连接和右链接属于外连接:
左连接: left (outer) join
右链接: right (outer) join
外连接的特点是:查询出来结果存在不满足条件的可能

左连接

左连接是先查询出左表(即以左表为主),然后查询右表,右表中满足条件的显示出来,不满足条件的显示NULL

select * from Menu1 m1 left join Menu2 m2 on m1.id = m2.id;

右连接

右连接就是先把右表中所有记录都查询出来,然后左表满足条件的显示,不满足显示NULL。

select * from Menu1 m1 right join Menu2 m2 on m1.id = m2.id;

在这里插入图片描述

内连接

查询结果必须满足条件,返回同时满足两个表的部分

select * from Menu1 m1 inner join Menu2 m2 on m1.id = m2.id;

在这里插入图片描述

举个栗子

已知员工的rid,通过rid去表hr_role中去查询hrid,通过查询到的hrid去表menu_role中去查询mid,最后通过mid查询menu表中的符合条件的项,并且通过parentId和其父级条目平成一个项
在这里插入图片描述
目前的有两种想法:
(1)通过右连接 加 子查询:

select * from menu as m1 
inner join 
(select id id2, component component2,  name name2, iconCls iconCls2, keepAlive keepAlive2, requireAuth requireAuth2, parentId parentId2, Enabled enabled2, path path2 from menu where menu.id in 
(select mid from menu_role where menu_role.rid in 
(select rid from hr_role where hr_role.hrid = 10))) 
as m2 
on m1.id = m2.parentId2 ;

(2)通过笛卡尔积的方式,再加上需要的条件:

select distinct m1.*,m2.`id` as id2,m2.`component` as component2,m2.`enabled` as enabled2,m2.`iconCls` as iconCls2,m2.`keepAlive` as keepAlive2,m2.`name` as name2,m2.`parentId` as parentId2,m2.`requireAuth` as requireAuth2,m2.`path` as path2 
from menu m1,menu m2,hr_role hrr,menu_role mr 
where m1.`id`=m2.`parentId` and hrr.`hrid`= 10 and hrr.`rid`=mr.`rid` and mr.`mid`=m2.`id` and m2.`enabled`=true 
order by m1.`id`,m2.`id`

补充

笛卡尔积:没有连接条件的表关系返回的结果是笛卡尔积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。

猜你喜欢

转载自blog.csdn.net/suandyanr/article/details/106695245