java常用的数据库_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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值