oracle常规使用(一)
oracle和mysql目前数据库中的巨头,之前公司一直使用的是mysql,今年对oracle有了初步的接触,简单介绍使用过程中的一些总结
特殊sql
distinct
- 通过distinct关键字针对字段去重。 正常后面跟一个字段。就已该字段去重。
项目中遇到表中无主键,但是某个字段不能重复。
正常sql:
select t.*,t.rowid from stage t where t.intersection_id=2;

去重sql:
select tt.*
from stage tt
where tt.rowid in (select
max(t.rowid)
from stage t
where t.intersection_id = 2
group by t.stage_id)

需要匹配id串里的内容
select
*
from stage
where stage_id in (1,9,10,5)
and intersection_id = 1031739143323648;
现在需要按照stage_id 1,9,10,5的顺序排列 '1,1,9,2,10,3,5,4'奇偶分离得到'1,9,10,5'和'1,2,3,4'前者是stageid后者是顺序序号
select
*
from stage
where stage_id in (1,9,10,5)
and intersection_id = 1031739143323648
order by decode(stage_id , 1,1,9,2,10,3,5,4);
批量更新,但是批量成功返回的是-1
开始认为很是奇怪,批量更新成功了,按照道理来说应该是返回批量操作的条数.
返回负数,是由于mybatis的defaultExecutorType的引起的,defaultExecutorType有三个执行器SIMPLE、REUSE和BATCH。
其中BATCH可以批量更新操作缓存SQL以提高性能,但是有个缺陷就是无法获取update、delete返回的行数
如果确定要拿到更新条数,defaultExecutorTypes设置成SIMPLE就可以
<update id="updateBatch" parameterType="java.util.List">
<foreach collection="list" item="item" index="index" open="begin" close=";end;" separator=";">
update T_CITY_INDEX t
set
t.city_name= #{item.cityName,jdbcType=VARCHAR} ,
t.district_name= #{item.districtName,jdbcType=VARCHAR} ,
where t.id = #{item.id,jdbcType=NUMERIC}
</foreach>
</update>
时间格式化
oracle 和 mysql 中对时间格式化都是这样,和我们Java中的格式化时间格式有所不同,YYYY-MM-DD hh24:mi:ss , 不区分大小写
to_char(t.start_time , 'YYYYMMDDHH24mmss')<=to_char(#{endTime},'YYYYMMDDHH24mmss') 将date格式时间格式化字符串比较
to_number() 将数字型字符串格式化成数字
行列互转
- 在实际开发中我们可能遇到行列互转的情况,这个时候如果先查出来通过Java做转换,最终是可以实现效果,但是效率将会大大降低.
oracle提供了 pivot 和 unpivot 关键字 ,mysql中没有尝试过 , 有兴趣的可以尝试下mysql中是否有这两个关键字 .下面看看实际的操作
应用场景
列转行
首先我们看下图中的sql查出来的数据是我再业务开发中需要的一个汇总数据.

但是这个数据不是完全符合我们的需求.我们在外层(Java)中是用实体接受onlineCount,offlineCount数据的,我们提供到web端也是通过这两个字段.但是
现在的情况我们Java接受到的是个集合,集合中的实体的属性是state,count这个两个数据,state的值是onlineCount或offlineCount.这很明显不符合业务需求.
但是我们发现只需要将列转成行我们就很容易完成实体的映射.下面的格式才是我们需要的

那么如何列转行呢,oracle提供了我们方式(pivot),我们通过这个关键字可以将列名转成行名.默认是会将列的值加上"",这个时候我们正常都需要为行名(属性名)添加别名
具体sql
select *
from (select case t.state
when 0 then
'onlineCount'
else
'offlineCount'
end as state,
count(1) as count
from rfid_device t
group by t.state
order by t.state)
pivot(sum(count)
for state in('onlineCount' onlineCount, 'offlineCount' offlineCount))

ps: pivot(func for field in ("col1" col1,"col2" col2,...,"coln" coln))
着我们可以理解成语法来记忆
pivot : 关键字
for : 关键字 (固定语法)
field : 列名(原本的属性名)
in : 关键字
coln : 是源数据中的field属性的具体值,就是我们转换后的属性值
func : 是个聚合函数(聚合函数里的对象正常就是转换后的内容)
建议大家对照数据查看,这样比较容易理解 , 上面的coln 是 "coln" 的别名
行转列
上面通过pivot关键字我们是实现了列转行,有来必有往,所以我们有必要了解一下行转列的情况,oracle提供的也很有意思unpivot , 顾名思义就是列转行的反向-->行转列

总结
我们通过上面两个案例可以发现,这两个是通用的.意思是说可以通过unpivot 将pivot的数据转回去.因为pivot后的属性其实是列值,而unpivot就是将属性名转成列值
oracle常规使用(一)的更多相关文章
- oracle常规任务
# su - oracle oracle> sqlplus "/as sysdba" SQL> exec dbms_scheduler.disable('MONDA ...
- oracle常规操作
dbms_job.broken(job1,true);
- Toad for Oracle 使用文档
Toad®for Oracle 版本 12.0.1 发行说明 30 July 2013 目录 欢迎使用 Toad for Oracle 版本更新 解决的问题和改进 已知问题 第三方已知问题 升级和兼容 ...
- Oracle排错总结
一.Oracle常规恢复之不安全恢复 http://www.cnblogs.com/jyzhao/p/4723994.html#2.11
- Oracle联合注入总结
Oracle常规联合注入 Oracle Database,又名Oracle RDBMS,或简称Oracle.是甲骨文公司的一款关系数据库管理系统. Oracle对于MYSQL.MSSQL来说意味着更大 ...
- Oracle Recovery 01 - 常规恢复之完全恢复
背景:这里提到的常规恢复指的是数据库有完备可用的RMAN物理备份. 实验环境:RHEL6.4 + Oracle 11.2.0.4 DG primary. 一.常规恢复之完全恢复:不丢失数据 1.1 单 ...
- Oracle Recovery 02 - 常规恢复之不完全恢复
背景:这里提到的常规恢复指的是数据库有完备可用的RMAN物理备份. 实验环境:RHEL6.4 + Oracle 11.2.0.4 单实例. 二.常规恢复之不完全恢复:部分数据丢失 2.1 重做日志文件 ...
- 本文将详细介绍oracle 10g OEM常规错误
本文将详细介绍oracle 10g OEM常规错误-------Unknown host specified解决方法,需要了解的朋友可以参考下 详细出处参考:http://www.jb51.net/a ...
- MySQL、Oracle、DB2等数据库常规排序、自定义排序和按中文拼音字母排序
MySQL常规排序.自定义排序和按中文拼音字母排序,在实际的SQL编写时,我们有时候需要对条件集合进行排序. 下面给出3中比较常用的排序方式,mark一下 1.常规排序ASC DESC ASC 正序 ...
随机推荐
- redis RDB 和AOF
参考文献 Redis源码学习-AOF数据持久化原理分析(0) Redis源码学习-AOF数据持久化原理分析(1) Redis · 特性分析 · AOF Rewrite 分析 深入剖析 redis AO ...
- 接口文档注解:@ApiOperation
@ApiOperation不是spring自带的注解是swagger里的 com.wordnik.swagger.annotations.ApiOperation; @ApiOperation和@Ap ...
- tomcat问题解决
tomcat问题解决 运行tomcat环境下,idea中出现 error running 项目名address localhost1099 is already in use 的时候,如何解决? 1, ...
- Java内存模型以及线程安全的可见性问题
Java内存模型 VS JVM运行时数据区 首先Java内存模型(JMM)和JVM运行时数据区并不是一个东西,许多介绍Java内存模型的文章描述的堆,方法区,Java虚拟机栈,本地方法栈,程序计数器这 ...
- .Net微信网页开发之JSSDK使用步骤和配置信息timestamp(时间戳),nonceStr(随机串),signature(签名),access_token(接口调用凭据)的生成获取讲解
前言: 因为接下来会有几篇关于微信JS-SDK功能使用的文章,主要会对微信分享,获取设备信息,获取地理位置,微信扫一扫这几个功能进行讲解.而这几个功能都是围绕着微信JS-SDK实现的,首先使用微信JS ...
- 关于下载安装Photoshop CS6遇到的一些问题
关于安装Photoshop CS6顺带安装AdobeBridge CS6和Aobe Extension Manager CS6的问题 Bridge是PS的一款插件,它能兼容大多数AODBE公司的软件, ...
- 什么是常量?变量? if语句介绍
1.python 的历史 2004 年 Django 的产生 phyton2与 python3 的区别 Python2:源码不统一,有重复的代码功能 Python3:源码统一,没有有重复的代码功能 2 ...
- Excel催化剂开源第39波-json字符串解释的超能类库
对一般VBA开发群体来说,处理json.xml结构的数据源,在VB6的世界里,是一件非常不容易的事情,隐约记得当年自己从哪里找到了一个使用字典实现的json解释的函数,实在非常稀有. 在.Net的世界 ...
- SpringBoot2.0集成WebSocket,实现后台向前端推送信息
感谢作者,支持原创: https://blog.csdn.net/moshowgame/article/details/80275084 什么是WebSocket? WebSocket协议是基于TCP ...
- APP爬虫(2)把小姐姐的图片down下来
APP爬虫(1)想学新语言,又没有动力,怎么办? 书接上文.使用appium在帖子列表界面模拟上划动作,捕捉不到列表的规律.上划结束后,列表只能获取到屏幕呈现的部分,而且下标还是从0开始的. 根据酸奶 ...