SQL方言:传统关系型数据库下的方言对比

前言:

技术多元化是一个趋势,多语言并存,多数据库适配,多环境兼容><

场景:

当从SQL Server数据库迁移到MySql数据库或者Oracle数据库,甚至国产化数据库,不同数据库之间可以自定义切换?

此时,在不同版本类型的数据库下,各自独有的SQL方言,并不能同时在多个数据库中共用,那如何能够做到尽可能复用,毕竟你不能改变ta,那只有适配。而如何适配又能够做到最小改造量?

SQL方言对比:

这里,我们来看看各大数据库厂商下分页SQL的写法,其中pageNo表示页码数,pageSize表示一页包含的记录数,

SQL Server (row_number 关键字)

select top pageSize * 
from (select row_number() 
over(order by id asc) as rownumber,* 
from yx_test) temp_row
where rownumber>((pageNo-1)*pageSize);例:分页查询第二页,每页展示10条记录
select top 10 * 
from (select row_number() 
over(order by id asc) as rownumber,* 
from yx_test) temp_row
where rownumber > 10;

MySql (limit 关键字分页-结合mybatis-xml写法)

limit (pageNo-1),pageSize<select id="pageRecords" resultMap="BaseResultMap" databaseId="mysql">select<include refid="base_column"><property name="alias" value="T."/></include>from Test T<where><if test="null != idCard and '' != idCard">and T.ID_CARD = #{idCard, jdbcType=VARCHAR}</if>and t.CANCEL_FLAG = '0'</where>order by T.ID DESClimit #{start},#{end}
</select>

Oracle (rownum 伪列分页-结合mybatis-xml写法)

    <select id="pageRecords" resultMap="BaseResultMap" databaseId="oracle">select * from (select row_.*, rownum rownum_from (select t.* from (select<include refid="base_column"><property name="alias" value="T."/></include>from yx_test T<where><if test="null != idCard and '' != idCard">and T.ID_CARD = #{idCard, jdbcType=VARCHAR}</if>and t.CANCEL_FLAG = '0'</where>order by T.ID DESC)t where rownum <![CDATA[<=]]> #{end}) row_)where rownum_ <![CDATA[>=]]> #{start}</select>

上述,仅仅给出了部分的分页SQL方言写法,还有,像我们常用的一些日期函数,更多请参考->多数据库适配 | 记一次数据源从Oracle到MySQL兼容切换历程

MySql (date()函数、date_sub()函数)

例:删除一周前创建的历史数据,仅保留最近一周的日志数据
delete from yx_test_logwhere id <= (select id from (select max(id) as id from yx_test_logwhere date(create_time) <= date(date_sub(now(), interval 7 day))) as a);

SQL Server (DateDiff()函数、getdate()函数)

例:删除一周前创建的历史数据,仅保留最近一周的日志数据
delete from yx_test_log where DateDiff(dd,create_time,getdate()) > #{day}

SQL方言适配:

通过对比各大DBMS数据库厂商,由此可见各自的函数并不能相互兼容。这里,我们就来给一些多数据库适配的一些CASE:

自定义指定 databaseId:

1685351762480.jpg

自定义SQL拦截器:

image.png

最后:

不论是基于ORM关系映射框架去构造SQL,还是基于Mybatis插件的思想->根据当前数据库databaseId,拦截SQL,加入各自数据库的SQL方言函数兼容,我们需要能够做到支持业务灵活配置-不同环境可走不同配置,并且可插拔式-在需要时开启。

诚然,在技术多元化的今天,多语言并存,多数据库适配,多环境兼容,这已是趋势!这无不都告诉我们各位开发者,在书写SQL不仅需要规范,比较生僻且独有的SQL语法尽量规避,CRUD等操作都尽量基于框架去开发。尤其是在BI报表业务中,很多需要对数据层面的过滤、组装、转换其实可以根据实际情况放在业务代码层面去处理->或许Lambda表达式值得一试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/7307.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于物联网、云计算建设的智慧校园云平台源码

电子班牌作为班级文化展示交流的窗口&#xff0c;可以让更多的人看到校园信息建设与班级风格相结合&#xff0c;及时传递校园信息。学生也可以通过电子班牌看到学校近期重要事件的发布&#xff0c;也可以参与回复&#xff0c;让学生及时掌握校园和班级动态。同时&#xff0c;还…

Middleware ❀ Zookeeper功能与使用详解

文章目录 1、功能简述1.1 服务目标1.2 文件系统 - 树状结构1.3 数据节点Znode类型1.4 变更通知 - Watcher1.4.1 工作机制1.4.1.1 Client注册1.4.1.2 Server处理1.4.1.3 Client回调 1.4.2 监听特性 1.5 权限控制 - ACL1.5.1 模式 - scheme1.5.2 权限 - Permission 1.6 选举机制1…

Python获取某品牌加盟数据采集实现可视化数据分析

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 开发环境 : python 3.8 运行代码 pycharm 2022.3 辅助敲代码 jupyter 数据分析使用软件 模块使用 &#xff1a; requests 数据请求模块 需要安装 parsel 数据解析模块 csv pandas pyecharts 第三方模块安装&#xf…

小程序开发:了解主流的开发框架

小程序是一种不需要下载安装&#xff0c;即点即用的应用程序&#xff0c;可以在微信小程序商店下载。如果你使用过微信的公众号和小程序&#xff0c;你会发现&#xff0c;小程序的使用和公众号、小程序是一样的。因此&#xff0c;从某种程度上说&#xff0c;小程序也是公众号的…

mac上使用brew安装mysql5.7

使用Homebrew进行MySQL数据库的安装需要MacOS系统中已经安装了相关环境 1.查询软件信息 首先使用search命令搜索MySQL数据库完整名称&#xff1a; brew search mysql可以看到5.7版本的MySQL数据库完整名称是mysql5.7 2. 执行安装命令 使用install命令进行软件安装&#xf…

中国信通院联合腾讯安全发布《数据安全治理与实践白皮书》

6月26日&#xff0c;由中国通信标准化协会和中国信息通信研究院联合主办的“2023大数据产业发展大会”在北京启幕&#xff0c;大会发布了多项中国信息通信研究院及相关机构在数智化领域最新研究和实践成果。 腾讯云安全总经理李滨出席了数据安全高质量发展论坛&#xff0c;分享…

赛效:如何将PDF文件免费转换成Word文档

1&#xff1a;在网页上打开wdashi&#xff0c;默认进入PDF转Word页面&#xff0c;点击中间的上传文件图标。 2&#xff1a;将PDF文件添加上去之后&#xff0c;点击右下角的“开始转换”。 3&#xff1a;稍等片刻转换成功后&#xff0c;点击绿色的“立即下载”按钮&#xff0c;将…

【书】《Python全栈测试开发》——浅谈我所理解的『自动化』测试

目录 1. 自动化测试的What and Why?1.1 What1.2 Why2. 自动化的前戏需要准备哪些必备技能?3. 自动化测试类型3.1 Web自动化测试3.1.1 自动化测试设计模式3.1.2 自动化测试驱动方式3.1.3 自动化测试框架3.2 App自动化测试3.3 接口自动化测试4. 自动化调优《Python全栈测试开发…

教你如何将纬地数据与实景三维模型进行叠加

概述&#xff1a; 纬地是公路设计的常用软件&#xff0c;在国内的普及率很高。传统的纬地数据文件以二维线条形式呈现在CAD中。本文提出了一种新思路、新方法&#xff0c;即将纬地的设计成果与无人机航拍的高精度倾斜摄影模型叠加在一起&#xff0c;辅助设计方案复核。 ​纬地…

【SpringMVC】统一异常处理 前后台协议联调 拦截器

1&#xff0c;统一异常处理 1. 问题描述 在讲解这一部分知识点之前&#xff0c;我们先来演示个效果&#xff0c;修改BookController类的getById方法 GetMapping("/{id}") public Result getById(PathVariable Integer id) {//手动添加一个错误信息if(id1){int i …

计算机毕业论文内容参考|基于Python的手机订餐系统的设计与实现

文章目录 导文摘要前言绪论1课题背景2国内外现状与趋势3课题内容相关技术与方法介绍系统分析系统设计系统实现系统测试总结与展望1本文总结2后续工作展望导文 计算机毕业论文内容参考|基于Python的手机订餐系统的设计与实现 摘要 本文基于Python语言,设计并实现了一个手机订餐…

Python 集合探索:解密高效数据操作和快速算法的奇妙世界

前言 在 Python 的众多数据结构中&#xff0c;集合&#xff08;Sets&#xff09;是一个引人注目且实用的概念。集合提供了一种存储无顺序、唯一元素的数据结构&#xff0c;它们不仅可以帮助我们高效处理数据&#xff0c;还能应用于各种算法和问题。 本博客将带您踏上一段关于…