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

news2024/10/7 13:24:20

前言:

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

场景:

当从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 DESC
      limit #{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_log
           where id <= (
           select id from (
           select max(id) as id from yx_test_log
	   where 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.coloradmin.cn/o/704135.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实现firebase FCM和Analytics

前提&#xff1a;1.需要vpn 2.带有google 服务的手机 注意&#xff01;&#xff01;&#xff01; 这个在2023年6月30日时还是测试版&#xff0c;所以手机有概率接收不到消息 编写代码前需要在https://console.firebase.google.com/ 配置好参数 这里的token值需要填写代码内的i…

macOS 系统 安装 Kafka 快速入门

博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客&#x1f466;&#x1f3fb; 《java 面试题大全》 &#x1f369;惟余辈才疏学浅&#xff0c;临摹之作或有不妥之处&#xff0c;还请读者海涵指正。☕&#x1f36d; 《MYSQL从入门到精通》数据库是开发者必会基础之…

神策(Android)- 集成基础埋点的整个过程

记得最早以前都是用友盟全家桶&#xff0c;埋点是用友盟&#xff0c;推送也是用友盟&#xff1b;但是近俩年我参与开发的app&#xff0c;埋点都是用神策、推送都是用极光私服&#xff0c;分享都是去对应集成对应平台的SDK 神策篇 神策&#xff08;Android&#xff09;- 集成基…

2023-6-30-第十二式组合模式

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…

Linux的tmux的使用

0.前言 您好&#xff0c;这里是limou3434&#xff0c;本次我将给您带来Linux下tmux的使用。 如果您感兴趣也可以看看我的其他内容。 1.tmux的基础概念 tmux是一款在Linux里运行在终端上的软件&#xff0c;可以使得终端具有强大的多任务管理功能&#xff08;以下是在Ubuntu环…

CSS知识点汇总(八)--Flexbox

1. flexbox&#xff08;弹性盒布局模型&#xff09;是什么&#xff0c;适用什么场景&#xff1f; 1. flexbox&#xff08;弹性盒布局模型&#xff09;是什么 Flexible Box 简称 flex&#xff0c;意为”弹性布局”&#xff0c;可以简便、完整、响应式地实现各种页面布局。采用…

Python高级教程:简单爬虫实践案例

学习目标 能够知道Web开发流程 能够掌握FastAPI实现访问多个指定网页 知道通过requests模块爬取图片 知道通过requests模块爬取GDP数据 能够用pyecharts实现饼图 能够知道logging日志的使用 一、基于FastAPI之Web站点开发 FastAPI是一个高性能、易于使用、快速编写API的…

新品亮相丨美格智能高性能Cat.1 bis模组SLM332X上市

6月29日&#xff0c;2023 MWC 上海世界移动通信大会火热进行中。展会现场&#xff0c;美格智能正式发布基于芯翼信息科技XY4100芯片平台研发的高性能4G LTE Cat.1 bis模组SLM332X。该产品可广泛应用于智能支付、智慧表计、共享经济、公网对讲机、定位追踪、智能穿戴、安防监控等…

Web3本地搭建truffle智能合约开发环境

之前的几篇文章 我们是成功的操作了我们本地区块链的 那么 本文 我们就来说说智能合约 啊 不容易啊 扯了这么久 终于到这了 智能合约是部署在区块链上 不可逆的 一种去中心化的程序&#xff0c;他没有任何第三方公司来管理这个程序和数据 然后 还有就是怎么连接到区块链上的智能…

基于Java星空游戏购买下载平台设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

浅谈基于微电网的智慧校园能耗监测系统的设计与产品应用

摘 要&#xff1a;针对高校教学建筑能效监管效率低的问题&#xff0c;从系统总体设计、分层设计、硬件系统设计、软件系统设计、功能测试等方面阐述了一种基于物联网技术的智慧校园建筑能效监管系统。通过对能耗监管系统关键功能的测试&#xff0c;测试效果良好&#xff0c;结果…

处理开发者账号到期导致APP下架的方处理开发者账号到期导致APP下架的方法

处理开发者账号到期导致APP下架的方处理开发者账号到期导致APP下架的方法 开发人员账号到期时&#xff0c;应采取以下步骤处理APP被下架问题&#xff1a; 登录开发者账号。点击右上角的"账户"&#xff0c;选择"续费"。输入信用卡信息&#xff0c;确保使用…

Android应用卡顿监控方案原理和对比

作者&#xff1a;天才木木木木 0 介绍 要监控应用界面是否发生卡顿&#xff0c;需要先了解一下Android应用主线程的渲染机制&#xff1a; Android 系统提供一个稳定的帧率输出机制&#xff0c;让软件层和硬件层可以以共同的频率一起工作,使我们可以享受稳定帧率的画面。 大部…

多元分类预测 | Matlab鲸鱼算法(WOA)优化混合核极限学习机(HKELM)分类预测,多特征输入模型,WOA-HKELM分类预测

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元分类预测 | Matlab鲸鱼算法(WOA)优化混合核极限学习机(HKELM)分类预测,多特征输入模型,WOA-HKELM分类预测 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matlab…

超级实用!详解Node.js中的mongodb模块和socket.io模块

文章目录 9. mongodb 模块安装和引入连接数据库操作集合获取集合插入文档查询文档更新文档删除文档 关闭连接 10. socket.io 模块安装和引入监听连接事件监听自定义事件在服务器端监听事件在客户端触发事件 广播消息在服务器端广播消息在客户端监听广播消息 断开连接完整示例 9…

WPF 零基础入门笔记(3):数据绑定详解

文章目录 文章合集数据绑定数据绑定实战事件通知型数据驱动&#xff0c;双向绑定资源绑定数据源绑定全局数据源后端和前端绑定问题继承事件通知&#xff0c;刷新数据事件通知强制刷新&#xff08;无效&#xff09;结论&#xff1a; 文章合集 WPF基础知识博客专栏 WPF微软文档 …

365天深度学习训练营-第T4周:猴痘病识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 我的环境&#xff1a; 语言环境&#xff1a;Python3.10.7编译器&#xff1a;VScode深度学习环境&#xff1a;TensorFlow2 一、前期工作&#xff1a; 1、导入…

小白开酒吧前要知道的几个知识(一)

第一、团队建设如果决定开酒吧&#xff0c;除非你的资金充裕&#xff0c;否则都该寻找合伙人。共同的目标会让你和合伙人之间合作的更愉快&#xff0c;所以合伙人应该选择善于沟通交流的。选定靠谱的合伙人之后&#xff0c;应该建立一个大致的团队体系&#xff0c;在团队内做好…

CAD怎么转成清晰的图片?分享几种好用的转换方法

CAD文件通常需要特定软件才能打开和编辑&#xff0c;而将其转换为图片格式可以使其更加普遍地被浏览和共享。此外&#xff0c;由于图片通常具有较小的文件大小&#xff0c;因此转换为图片格式可以更快地上传和下载&#xff0c;可以方便地用于演示和分享。那么我们怎么把CAD文件…

Python进行单元测试是怎么做的?

前言 在我的日常工作中&#xff0c;我是一名专业程序员。我使用c、c#和Javascript。我是一个开发团队的一员&#xff0c;他们使用单元测试来验证我们的代码是否按照它应该的方式工作。 在本文中&#xff0c;我将通过讨论以下主题来研究如何使用Python创建单元测试。 单元测试…