MySQL, Oracle, Linux, 软件架构及大数据技术知识分享平台

网站首页 > 数据库 / 正文

oracle迁移mysql时in和exists如何迁移及为什么不建议使用子查询

2024-11-26 20:38 huorong 数据库 5 ℃ 0 评论

大家知道么,之前在oracle中随便使用的子查询语句,在mysql中虽然语法上支持,但是是不建议使用的。那如果涉及到迁移的时候,如何处理呢?

可以使用join的方式。

比如 in或者exists的改造:

select * from wentian1 t1 where exists(select id from wentian2 t2 where t1.id = t2.id and t2.name = '张三')

可以修改成:

select t1.* from wentian1 t1 join (select id from wentian2 t2 where t2.name = '张三') on t1.id = t2.id

not in和not exists的改造

select * from wentian1 t1 where not exists(select id from wentian2 t2 where t1.id = t2.id and t2.name = '张三')

可以修改成:

select t1.* from wentian1 t1 left join (select id from wentian2 t2 where t2.name = '张三') t3 on t1.id = t3.id where t3.id is null

那剩下的问题是为什么不建议使用子查询呢?

核心原因还是虽然mysql貌似使用范围很广,但是它在很多方面的优化确实距离商业化数据库oracle还是有差距的。oracle的缺点就是贵,且是国外的,且是不开源的。除此之外,一切都好,在使用的时候不需要考虑那么多,用就行了。

而mysql就需要考虑的很多了。比如在mysql中就不建议使用子查询主要的原因是在mysql中子查询会生成一张临时表,而创建和销毁这个临时表就会消耗额外的资源。而且对子查询的查询范围是没有限制的,如果关联的表数据量多了,也会成为瓶颈。

所以最优的方案其实不是上面的关联,最优的方案是单表查询一张表,查询出结果之后在应用层面循环查询另外一张表,这样的好处是可以在应用层面进行抽象,加入缓存层之类的。当然如果业务逻辑上不允许的话,上面的迁移方案也是一种选择。

------------------------

欢迎访问个人网站:

https://lessthinker.com

欢迎关注个人公众号:虾响

Tags:oracle in select

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言