Oracle——Mybatis的使用与sql优化总结

序言

    写在最前,此博客会不断更新,整理总结开发工作(实战过程)中的sql优化问题;因笔者在大数据部门工作,所以数据量基本都是非常多的,也就更加关注大数据下的性能(但是对于有些操作可能在数据少的情况下,具有更高的效能)。同时,部门是用的mybatis,所以这里也会分享一些实用的但可能不常用的语句。也欢迎大家讨论补充。

1.insert dates(插入多条数据)

insert into(union all拼接)

insert into 表达式

insert into pager (PAG_ID,PAG_PARENT,PAG_NAME,PAG_ACTIVE)
          select 8000,0,'Multi 8000',1 from dual
union all select 8001,0,'Multi 8001',1 from dual
`

insert into mybatis应用

INSERT INTO table(
			colum1,colum2,...
		) 
		(
		<foreach collection="list" item="keyData" index="" separator="union all">
			select 
				#{keyData.colum1},#{keyData.colum2},...
		 	from dual
		</foreach>
		)

merge into

    对于插入多条数据的时候,如果要同时判断,对已有的数据进行更新操作,没有的数据进行新增操作,可食用merge into;

merge into 表达式

MERGE INTO [目标表] A USING [源表] B ON([conditional expression] and [...]...) 
WHEN MATCHED THEN
  [UPDATE sql] 
WHEN NOT MATCHED THEN
  [INSERT sql]

merge into mybatis应用

merge into table1 a
		using (
		<foreach collection="list" item="keyData" index="" separator="union all">
			select 
				#{keyData.seqId} AS SEQ_ID,#{keyData.dataDate} AS DATA_DATE,'1' AS STATUS
			 from dual
		</foreach>
		) b
		on(a.SEQ_ID=b.SEQ_ID)  
		 
		when matched then update set a.STATUS='0'
 
		when  not matched then insert  
			(a.SEQ_ID,a.DATA_DATE,STATUS)
		values
			(b.SEQ_ID,b.DATA_DATE,b.STATUS)

2.case when

    case when 表达式是一个通用条件的表达式,可以在表达式有效的任何位置使用。

原语句在现

SELECT * FROM( 
	SELECT t.*,
  (case --1
        when t.flag='01' then 'BankCode1' 
        when t.flag='02' then 'BankCode2'
        else 
              (--2
              select BANK_CODE from table1 b 
              where t.BANK_NO = b.BANK_NO)
        end ) col1,
        (case 
        when t.flag='01' then 'BankType1' 
        when t.flag='02' then 'BankType2'
        when t.flag='04' and t.BANK_NO IN 
          (SELECT BANK_NO from table1
              WHERE BANK_NAME in ('item')
              ) then 'BankType3'
            else 'BankType4' 
        end )  col2,
	row_number()over(partition by CON_NUM order by SIGN_DATE desc) cn 
	FROM table2 t --3
	WHERE t.CREATE_TIME = '201912' 
	AND t.CODE IN ( 'item' ) 
	) t 
WHERE cn = 1 

decode函数

    在数据量非常大的时候,decode函数要比case when速率提升百分之四十多。但是decode只能对字段的值进行判断,无法判断表达式。如下:
decode(条件,值1,返回值1,值2,返回值2,…….,缺省值)
使用decode函数来实现案例:

decode(flag, 10, '01', 20, '02', 30, '04', 'other')  from table2 

查出来的结果和用case when作用是一样的,但decode看起来简洁得多了

DECODE 与CASE WHEN 的比较

  1. DECODE 只有Oracle 才有,其它数据库不支持;
  2. CASE WHEN的用法, Oracle、SQL Server、 MySQL 都支持;
  3. DECODE 只能用做相等判断,但是可以配合sign函数进行大于,小于,等于的判断,CASE when可用于=,>=,<,<=,<>,is null,is not null 等的判断;
  4. DECODE 使用其来比较简洁,CASE 虽然复杂但更为灵活;
  5. 另外,在decode中,null和null是相等的,但在case when中,只能用is null来判断。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值