7种join理论
实际操作
select a.*,b.name as rolename from `users` a left JOIN `roles` b on b.id=a.role_id
查询用户拥有的权限
select * from role_node as a LEFT JOIN `nodes` as b on a.node_id=b.id WHERE a.role_id=(select role_id FROM `users` where `id`=4)
或者
select c.name from `users` a left JOIN `role_node` b on a.role_id=b.role_id LEFT JOIN `nodes` as c on b.node_id=c.id WHERE a.id=4 ;
在实际开发中
最常用的就是left join
其次right join、inner join
七种join理论。
内连接(两表的共有部分)
SELECT * FROM tbl_dep d INNER JOIN tbl_emp e ON d.id
=e.deptId
;
左连接(左表的全部,右表不满足补NULL)
SELECT * FROM tbl_dep d LEFT JOIN tbl_emp e ON d.id
=e.deptId
;
右连接(右表的全部,左表不满足的补NULL)
SELECT * FROM tbl_dep d RIGHT JOIN tbl_emp e ON d.id
=e.deptId
;
特殊的左连接,(显示为左表的独有的数据)
说明:查询tbl_dep 表中跟tbl_emp 表无关联关系的数据,即tbl_dep 独占,且tbl_emp 表的显示列补NULL;
SELECT * FROM tbl_dep d LEFT JOIN tbl_emp e ON d.id
=e.deptId
WHERE e.deptId
IS NULL;
特殊的右连接(显示为右表的独有的数据 )
说明:查询tbl_emp 表中跟tbl_dep 表无关联关系的数据,即tbl_emp 独占,且tbl_dep 表的显示列补NULL;
SELECT * FROM tbl_dep d RIGHT JOIN tbl_emp e ON d.id
=e.deptId
WHERE d.id
IS NULL;
全连接(显示全部数据)(mysql 不支持 full outer join)
UNION :有去重的功能。
SELECT * FROM tbl_dep d LEFT JOIN tbl_emp e ON d.id
=e.deptId
UNION
SELECT * FROM tbl_dep d RIGHT JOIN tbl_emp e ON d.id
=e.deptId
;
显示两表的独有的数据
SELECT * FROM tbl_dep d LEFT JOIN tbl_emp e ON d.id
=e.deptId
WHERE e.deptId
IS NULL UNION
SELECT * FROM tbl_dep d RIGHT JOIN tbl_emp e ON d.id
=e.deptId
WHERE d.id
IS NULL;
了解即可
左外连接:得到的结果,显示所有公共部分数据,显示所有左表数据,左表没有的用null补充
跟左连接一样
select * from dept left outer join emp on dept.id=emp.dept_id
同理右外连接也一样推
在 SQL 的 JOIN
语句中,通常可以这样理解:
JOIN
关键字左边的表是左表(Left Table)。JOIN
关键字右边的表是右表(Right Table)。