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 起到相同的效果