delete from删除几张表关联和mysql几种连接查询总结

一、delete from删除几张表关联

① 在多表连接时删除数据(错误删除示例):

delete  from 
	sys_role_menu s left join sys_menu m ON s.menu_id = m.menu_id 		
where 
m.sys_type=1 
and s.role_id in 		
<foreach item="roleId" collection="array" open="(" separator="," close=")">
 			#{roleId} 		
</foreach>

②这样会报错的。 而我没看出来哪里有错,改成查询(正确的查询示例):

 select * from 
sys_role_menu s left join sys_menu m ON s.menu_id = m.menu_id 		
where m.sys_type=1 
 and s.role_id in 		
<foreach item="roleId" collection="array" open="(" separator="," close=")">
			#{roleId} 		
</foreach> 

③这样是正确的。 那么问题呢? 原因是多张表关联时要指明删除的是哪张表,把别名写在delete后面。(正确删除示例)

 delete s from sys_role_menu s 
 left join sys_menu m ON s.menu_id = m.menu_id 		
 where m.sys_type=1 
 and s.role_id in 		
 <foreach item="roleId" collection="array" open="(" separator="," close=")">
		#{roleId} 	
</foreach> 

二、mysql中的内连接、左连接、右连接的区别

2.1、内连接

inner join(等值连接) 只返回两个表中联结字段相等的行

SELECT * from A INNER JOIN B ON A.Aid=B.Bname;
等同于:
SELECT * from A,B WHERE A.Aid=B.Bname;

在这里插入图片描述

2.2、left join(左联接)

返回包括左表中的所有记录和右表中联结字段相等的记录 左链接就是公共交集加上左边的A。这就意味着左边A拥有的数据全部会显示出来,但是在B中却未必有数据对应,对应不上的则为null.

SELECT * FROM A LEFT JOIN B ON A.Aid=B.Bname;

在这里插入图片描述

2.3、right join(右联接)

返回包括右表中的所有记录和左表中联结字段相等的记录。右连接就是公共交集加上右边的B

SELECT * from A RIGHT JOIN B ON A.Aid=B.Bname;

在这里插入图片描述

左连接和右连接的表述方式差不多,需要注意的是,左和右是相对来说的,根据在查询语句中表出现的先后顺序,可以分别用left join
和right join 起到相同的效果

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐