当前位置: 首页 > news >正文

JAVA常用知识总结(十一)——数据库(一)

  • 项目中用到的不常见sql语法

  1:空值不在前的排序

  select a.* from WZX_SCZY A order by SCZY_START_TIME desc nulls last (不加nulls last的时候 空值会在前面)      --oracle  

2:Oracle数据库查询两个表中差异值的优秀解法(MINUS)

表A中记录为1 2 3 9
表B中记录为2 3 4 5

现在要查询出1 9,可以用下面三个语句
(1)select a.num from A a where a.num not in (select b.num from B b); -- 注意:如果 not in 里面的值为null 则返回空
(2)select a.num from A a minus select b.num from B b -- 注意:(这里a.num和b.num前不需要加distinct也会自动列出不重复的数据,要求两个查询出的列数相同,字段类型相同)
(3)select a.num from A a where not exists (select b.num from B b where b.num=a.num) -- 用时最短

SELECT A.Pipe_No AS GX_TDCLBH FROM WZX_JC_FFCPSD A GROUP BY A.Pipe_No
MINUS
select a.gx_tdclbh from WZX_GX_GX a

3:两个ID相同时间,不同的数据,怎么取出时间最大的那个值

优秀解法:
select a.* from 表名 a,
(select id,max(time) time from 表名 group by id) b
where a.id=b.id and a.time=b.time;

4:如果该字段前面两位是DE  就去掉

select replace(a.pipe_diameter,'DE','') from risk_pe_line a where substr(a.pipe_diameter,0,2) = 'DE';

ps:instr(a.pipe_diameter,'DE')>0 意思是包含DE 但不能确保DE就在前两位

5:oracle 的行转列 

unpivot 是oracle 11g 后推出的功能
select sum(decode(PIPE_ADDR,'正常',1,0))管道位置异常,sum(decode(PIPE_ZX,'正常',1,0))管道走向异常,
sum(decode(PIPE_ZX,'正常',1,0))管道埋深异常,sum(decode(GDLL_DESC,'有',1,0))管道裸露,
sum(decode(PIPE_ZX,'有',1,0))施工破坏,sum(decode(PIPE_ZX,'有',1,0))高后果区 from (#MAIN_SQL#))A
unpivot (DATA_RESULT for ZLSC in(管道位置异常,管道走向异常,管道埋深异常,管道裸露,施工破坏,高后果区)

其中 DATA_RESULT 和 ZLSC都是列名,ZLSC对应 in 后面的数据 DATA_RESULT对应sum后的值

6:oracle的add_months函数

oracle add_months(time,months)函数可以得到某一时间之前或之后n个月的时间
如 select add_months(sysdate,-6) from dual;
该查询的结果是当前时间半年前的时间

7:sql把特定数据行排在最前面

第一法】
select * from table where name='D'
UNION ALL
select * from table where name<>'D'

第二法】

SELECT CASE WHEN [name]='D' THEN 0 ELSE 1 END FLAG,* FROM TABLE
order by flag asc

第三法】
不改变原sql的前提下,自定义的排序 后面加上

order by case when RISK_APP_STATE =5 then 1 else 2 end asc
order by decode(col,'一',1,'二',2,'三',3,'四',4,'五',5,'六',6,'七',7,'八',8,'九',9,'零',0)   (此方法最好)

8:PARTITION:分割

row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组(此处的分组是多个的分组。切记),在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的) partition 分割,划分

与rownum的区别在于:使用rownum进行排序的时候是先对结果集加入伪列rownum然后再进行排序,而此函数在包含排序从句后是先排序再计算行号码.

---查询所有姓名,如果同名,则按年龄降序
SELECT NAME ,AGE,DETAILS,ROW_NUMBER() OVER(PARTITION BY NAME ORDER BY AGE DESC) FROM TEST_Y;
----通过上面的语句可知,ROW_NUMBER() OVER(PARTITION BY COL1 ORDER BY COL2)中是按照NAME字段分组,按AGE字段排序的。
----如果只需查询出不重复的姓名即可,则可使用如下的语句
SELECT * FROM (SELECT NAME,AGE,DETAILS ,ROW_NUMBER() OVER( PARTITION BY NAME ORDER BY AGE DESC)RN FROM TEST_Y )WHERE RN= 1;

9:for update nowait 与 for update 的目的和区别

目的:

锁定表的所有行,排斥其他针对这个表的写操作。确保只有当前事务对指定表进行写操作。
区别:
别的事务要对这个表进行写操作时,是等待一段时间还是马上就被数据库系统拒绝而返回.制定采用nowait方式来进行检索,所以当发现数据被别的session锁定中的时候,就会迅速返回ORA-00054错误,内容是资源正忙, 但指定以 NOWAIT 方式获取资源。所以在程序中我们可以采用nowait方式迅速判断当前数据是否被锁定中,如果锁定中的话,就要采取相应的业务措施进行处理。
如何理解上面的话.
开启一会话 (就是开一个sqlwindow)
select empno,ename from emp where empno='7369' for update nowait ;
得到下面结果集:
empno ename
7369 smith
开启另一会话
select empno,ename from emp where empno='7369' for update nowait ;
返回RA-00054错误,内容是资源正忙, 但指定以 NOWAIT 方式获取资源
上面会话都提交commit;

10:start with connect by prior 递归查询用法

SELECT a.*,level
FROM left_condition_item a
START WITH a.condition_item_id in
(select b.condition_item_id
from left_layer_condition b
where scheduling_window_no = 'inspectionCycle'
and b.is_use = '1')
CONNECT BY PRIOR a.condition_item_id = a.parent_id

递归调用 关键词prior,prior跟父节点列parentid放在一起,就是往父结点方向遍历;prior跟子结点列subid放在一起,则往叶子结点方向遍历, ( CONNECT BY a.condition_item_id = PRIOR a.parent_id)

parentid、subid两列谁放在“=”前都无所谓,关键是prior跟谁在一起。 用于有父子级关系的结构

11:主次排序  两个字段的排序    譬如让第一行还是第一行  剩余的按主键大小排序

select * from (
(select *,1 as sunxu from time_record where record_id = 1)
union
(select *,2 as sunsu from time_record where record_id != 1) )a order by a.sunxu asc,a.record_id desc

12:从数据库中随机取10条

· ORACLE
   - select * from (select * from tableName order by dbms_random.value) where rownum <= 10
· MYSQL
   -  select * from tableName order by rand() limit 10


 

人是有思想的,这是人与动物本质的区别。人的社会属性要求我们在操守的规范下实现自我价值。
因此,我们要实现自己的社会价值 。这些都离不开坚定的信仰,有无信仰是一个在精神层面状态好坏的体现,不能觉得一切都无所谓。
生活是一面镜子,自己是什么样子很快现行。 用知识武装自己,用信仰升华自己,用爱好装点自己,用个性标识自己。MISS

 

 

 

转载于:https://www.cnblogs.com/king-brook/p/10065425.html

相关文章:

  • ARM入门笔记(2)
  • LeetCode:191. 位1的个数
  • 51cto开博
  • 5-6 可变参数
  • js内置数据类型
  • 网络安全英语词汇
  • Linux中安装JDK1.8
  • 在Windows 2000下优化Oracle9i性能
  • 股票买卖问题
  • 2003的服务器终端服务器超出最大连接数的解决办法-转载
  • vue项目首页形成原理
  • ArcGIS Server(详细介绍)转
  • linux 修改MTU值
  • 游园作文
  • [WebMethod] 是什么意思?
  • php的引用
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • Druid 在有赞的实践
  • iOS 颜色设置看我就够了
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • Java 内存分配及垃圾回收机制初探
  • NSTimer学习笔记
  • php中curl和soap方式请求服务超时问题
  • QQ浏览器x5内核的兼容性问题
  • React+TypeScript入门
  • React-flux杂记
  • session共享问题解决方案
  • spring + angular 实现导出excel
  • Spring Cloud Feign的两种使用姿势
  • Webpack 4x 之路 ( 四 )
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 规范化安全开发 KOA 手脚架
  • 讲清楚之javascript作用域
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 前端代码风格自动化系列(二)之Commitlint
  • 前嗅ForeSpider采集配置界面介绍
  • 微信小程序:实现悬浮返回和分享按钮
  • 为什么要用IPython/Jupyter?
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • 通过调用文摘列表API获取文摘
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​Linux·i2c驱动架构​
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • #define,static,const,三种常量的区别
  • (1)(1.13) SiK无线电高级配置(六)
  • (4.10~4.16)
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (WSI分类)WSI分类文献小综述 2024
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (篇九)MySQL常用内置函数
  • (转)菜鸟学数据库(三)——存储过程