SQL内连接外连接

记录一个因为SQL连接查询的导致空指针的异常
在业务系统中有文件信息表和文件存储表A,因为代码逻辑处理是删除文件信息只做标记处理,而删除文件存储表的时候是直接删除了数据,然后通过A LEFT JOIN B ON A.id = B.id 导致查询数据含有空数据,导致后续程序代码中空指针异常。
解决方法:

  1. 查询后加上非空判断
  2. 更换查询的主表,原先是A left join B, 修改为B left join A,或者改为右连接
  3. 使用内连接inner join

内连接:只有包含
外连接:外连接会保留所有的悬浮组,悬浮组其他字段则为NULL
左外连接:保留主表A也就是左边表的悬浮组 A LEFT JOIN B
右外连接:保留主表B也就是右边表的悬浮组 A RIGHT JOIN B

外连接的ON 过滤的是 次表的条件,主表的过滤条件应该写在where中

CREATE TABLE `file_info` (
  `id` int(11) DEFAULT NULL,
  `file_name` varchar(10) DEFAULT NULL,
  `file_size` varchar(10) DEFAULT NULL,
  `is_delete` varchar(2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8


CREATE TABLE `file_store` (
  `id` int(11) DEFAULT NULL,
  `file_path` varchar(10) DEFAULT NULL,
  `file_data` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

file_info
在这里插入图片描述
file_store
在这里插入图片描述
id=3的文件记录file_info被标记,文件数据file_store被删除


1. select * from file_info info left join file_store store on info.id = store.id
    -- 只保留了主表file_info的悬浮组

在这里插入图片描述

2.  select * from file_info info left join file_store store on info.id = store.id WHERE store.id != ''
     使用where对主表进行过滤

在这里插入图片描述

3. select * from file_store store left join file_info info on info.id = store.id
   -- 因为要查询的是file_store的数据,所以将这张表作为主表,或改为右连接
   select * from file_info info right join file_store store on info.id = store.id 

在这里插入图片描述

4. 使用内连接,无论谁做主表都不会产生悬浮组,结果一致,只是字段顺序不同
   select * from file_info info inner join file_store store on info.id = store.id 
   select * from file_store store inner join file_info info on info.id = store.id 

在这里插入图片描述
在这里插入图片描述

参考SQL内连接 外连接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值