SQL常用命令
Oracle下查看索引的语句
- 查询一张表里面索引
select * from user_indexes where table_name=upper('bills');
select * from all_indexes where table_name=upper('bills');
- 查询被索引字段
字段保留在 user_ind_columns视图中
select * from user_ind_columns where index_name=('in_bills');
select * from all_ind_columns where index_name=('in_bills');
上面两连起来就是
select a.uniqueness 索引类型,b.index_name 索引名称,b.column_name 字段 from user_indexes a ,user_ind_columns b
where a.table_name=b.table_name and a.index_name = b.index_name
and a.table_owner=upper('SAPSR3') and a.table_name='ANLU' order by a.uniqueness desc;
- 给某一字段创建索引
create index in_bills on bills(account_id);
查看建表语句
select dbms_metadata.get_ddl('TABLE',upper('a')) from dual; //其中a为表名;
存在一个表而不在另一个表中的数据
A、B两表,找出ID字段中,存在A表,但是不存在B表的数据。A表总共13w数据,去重后大约3W条数据,B表有2W条数据,且B表的ID字段有索引。
方法一
使用 not in ,容易理解,效率低 执行时间为:1.395秒
1 select distinct A.ID from A where A.ID not in (select ID from B)
方法二
使用 left join...on... , "B.ID isnull" 表示左连接之后在B.ID 字段为 null的记录 执行时间:0.739秒
1 select A.ID from A left join B on A.ID=B.ID where B.ID is null
图解
方法三
逻辑相对复杂,但是速度最快 ~执行时间: 0.570秒~
1 select * from B
2 where (select count(1) as num from A where A.ID = B.ID) = 0
按分组数量排序
select 种类,sum(数量) from 表名 group by 种类 order by sum(数量) desc
Oracle将查询结果存入临时表的写法
有时候因为查询结果很大且需要再跟其它表进行不同形式的连表查询,这是如果整个sql写下来不仅看起来臃肿而且查询效率也很低,Oracle提供了一种将查询结果存入到
临时表的写法可以讲查询结果存储到临时表中待用,我这里只记一种会话级别的用法,在当前会话中查询的结果会在临时表中存储数据,结束(关闭)会话数据就被清除掉。
CREATE GLOBAL TEMPORARY TABLE tmptable
ON COMMIT PRESERVE ROWS
AS
SELECT *
FROM tablename
oracle中时间常用算法
sysdate+1 加一天
sysdate+1/24 加1小时
sysdate+1/(2*60) 加1分钟*
sysdate+1/(24*60*60) 加1秒钟
select add_months(date'2019-5-15',-12) from dual; -- 2018-5-15 通过add_months(x,y)函数,在给定的时间x+固定的月份y
select date'2019-5-15' + interval '-1' year from dual; --2018-5-15 通过interval函数,这个用来表示一段时间间隔,有固定的格式,这里用来加一年,还可以加天、小时等(不过如果这里是闰年2-29的话会报错)