有用的sql整理(不定时更新)
2015-11-10 17:58 D_L 阅读(403) 评论(0) 编辑 收藏 举报1.关于日期条件作为where子句时需要注意的点。
select 字段 from 表 where 时间字段 > date'2012-12-31' + 0.99999 and 时间字段 < date'2013-02-01';
上面这个时间判断的时间段就是2013年1月1日零点到2013年1月31日二十三点五十九分五十九秒,前方加上的0.99999
就是屏蔽掉由时分秒造成的查询不准确问题。
2.在oracle中查询条件如果采用like的方式那么匹配条件中如果是'%*'以百分号开始则不会执行索引。
3.在where子句中使用is null和is not null作为条件的不会执行索引。不建议使用。可以用nvl函数进行代替。
4.查找重复数据:
SELECT 字段 FROM 表a WHERE (字段a,字段b) IN (SELECT 字段a,字段b FROM 表a GROUP BY 字段a,字段b HAVING(COUNT(1)) > 1);
以上这种形式可以把表a中所有字段a和字段b重复的数据查询出来。
5.删除重复数据:
DELETE FROM 表a 别名a WHERE 别名a.rowid > (SELECT MIN(别名b.rowid) FROM 表a 别名b WHERE 别名a.重复字段a = 别名b.重复字段a);
上述语句可以删除其重复的数据保留一条数据,因为用到了rowid所以效率还是很高的。
这里需要注意的是删除的表和后面where子句中的表是一张表只不过是别名为了区分开所以不一样,后面的重复字段可以是一个也可以是多个。
6.数据库闪回
有些时候因为我们的不当操作执行了update或者delete语句,这个时候我们发现本来数据时不应该被修改的,如果这样闪回机制给我们提供了
一个很好的帮助,不过首先需要确定你所操作的oracle服务是否开启了闪回机制,执行如下语句:
select flashback_on from V$database;
如果结果为:
FLASHBACK_ON
------------
NO
恭喜你,可以使用闪回的功能来拯救你的数据,下面语句:
select * from 表名 as of timestamp (systimestamp - interval '15' minute);
获取这张表15分钟之前的状态。