sql点滴

1. 使用like别忘了escape like '%/s' escape '/'
2. 使用行表达式查询条件 where a.id = '1' and a.name='user' 可以写成
where (a.id,a.name)=('1','user') 可能会走索引,速度会快
3. with s1 as
(select * from table t where t.date=date'201503' order by t.id),
s2 as
(select * from table t where t.date=date'201504' order by t.id)
select * from s1
union all
select * from s2;
可以将数据order by后再拼接。单纯union all 不能带order by
4. 带null值得列不走索引,可以建复合索引
create index idx_t1 on t1(object_Id,1);
而不是create index idx_t1 on t1(object_Id);
5. 用函数索引避免全表扫描
select object_id,object_name from t1 where reverse(object_name)like reverse('%EMP');
create index idx_fun_t1 on t1(reverse(object_name));
而不是
select object_id,object_name from t1 where object_name like '%EMP';
create index idx_fun_t1 on t1(object_name);
5. 大数据量表先限定条件查询出来,在关联其它表,可避免大量全表扫描。
用户表user(user_id,user_name) 消费表spending(user_id,消费积分score,日期date)统计8月份消费积分排在前10的数据。
select u.user_name,s.score from user u,(select s.user_id,sum(s.score) score from spend s where trunc(s.date,'yyyymm')='201408') s where u.user_id = s.user_id group by u.user_id,s.score having count(u.user_id) <=10
6.char是定长的,varchar2是变长的,同样定义一列,如果是用char(10),则存储'0'会占用10个byte;如果是用varchar2(10),则存储'0'只会占用1个byte,varchar2更省存储。
SQL> create table t1(c1 char(10),c2 varchar2(10));
Table created
SQL> insert into t1 values('0','0');
1 row inserted
SQL> commit;
Commit complete
SQL> select lengthb(c1),lengthb(c2) from t1;
LENGTHB(C1) LENGTHB(C2)
———– ———–
10 1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值