网站首页 > 数据库 / 正文
大家知道么,之前在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
猜你喜欢
- 2024-11-26 oracle使用rownum分页
- 2024-11-26 oracle索引(index)信息--笔记
- 2024-11-26 oracle数据库中INITCAP()、LOWER()与UPPER()函数的用法
- 2024-11-26 EXISTS真的比IN快吗?
- 2024-11-26 FIND_IN_SET 及IN 处理逗号间隔的字符串参数
- 2024-11-26 Spark+Kafka实时监控Oracle数据预警
- 2024-11-26 oracle update 批量更新数据提示单行子查询返回多个行如何解决
- 2024-11-26 Oracle中查找阻塞与被阻塞SID的方法
- 2024-11-26 「Burpsuite练兵场」SQL注入之带外通信