oracle 小结

求最大值

greatest()求的是某几列的最大值,横向求最大;
max()通常用于返回列中的最大值,纵向求最大。

TRUNC函数用于对值进行截断。

用法有两种:TRUNC(NUMBER)表示截断数字,TRUNC(date)表示截断日期。

(1)截断数字:

格式:TRUNC(n1,n2),n1表示被截断的数字,n2表示要截断到那一位。n2可以是负数,表示截断小数点前。注意,TRUNC截断不是四舍五入。

SQL> select TRUNC(15.79) from dual;

TRUNC(15.79) ------------ 15

SQL> select TRUNC(15.79,1) from dual;

TRUNC(15.79,1) -------------- 15.7

SQL> select trunc(15.79,-1) from dual;

TRUNC(15.79,-1) --------------- 10

(2)截断日期:

先执行命令:alter session set nls_date_format='yyyy-mm-dd hh24:mi:hh';

1、截取今天:

SQL> select sysdate,trunc(sysdate,'dd') from dual;

SYSDATE TRUNC(SYSDATE,‘DD’) ------------------- 2009-03-24 21:31:17 2009-03-24 00:00:00

2、截取本周第一天:

SQL> select sysdate,trunc(sysdate,'d') from dual;

SYSDATE TRUNC(SYSDATE,‘D’) ------------------- 2009-03-24 21:29:32 2009-03-22 00:00:00

3、截取本月第一天:

SQL> select sysdate,trunc(sysdate,'mm') from dual;

SYSDATE TRUNC(SYSDATE,‘MM’)------------------- 2009-03-24 21:30:30 2009-03-01 00:00:00

4、截取本年第一天:

SQL> select sysdate,trunc(sysdate,'y') from dual;

SYSDATE TRUNC(SYSDATE,‘Y’)------------------- 2009-03-24 21:31:57 2009-01-01 00:00:00

5、截取到小时:

SQL> select sysdate,trunc(sysdate,'hh') from dual;

SYSDATE TRUNC(SYSDATE,‘HH’) ------------------- 2009-03-24 21:32:59 2009-03-24 21:00:00

6、截取到分钟:

SQL> select sysdate,trunc(sysdate,'mi') from dual;

SYSDATE TRUNC(SYSDATE,‘MI’) ------------------- 2009-03-24 21:33:32 2009-03-24 21:33:00

7、获取上月第一天:
SQL> select TRUNC(add_months(SYSDATE,-1),'MM') from dual

MERGE INTO

语法

MERGE INTO语句的基本语法如下:

MERGE INTO target_table [alias]
USING source_table [alias]
ON (join_condition)
WHEN MATCHED THEN
    UPDATE SET column1 = value1, column2 = value2, ...
    [DELETE WHERE (delete_condition)]
WHEN NOT MATCHED THEN
    INSERT (column1, column2, ...) VALUES (value1, value2, ...)

其中:

  • target_table:目标表的名称或别名。
  • source_table:源表的名称或别名。
  • join_condition:连接条件,用于将目标表和源表进行关联。
  • WHEN MATCHED THEN:当目标表和源表的行匹配时,执行更新操作。
  • UPDATE SET:指定需要更新的目标表的列和对应的值。
  • DELETE WHERE:在更新之前,可选择性地删除目标表的行。
  • WHEN NOT MATCHED THEN:当目标表和源表的行不匹配时,执行插入操作。
  • INSERT:指定需要插入目标表的列和对应的值。

需要注意的是,MERGE INTO语句必须在目标表和源表有相同的列名和数据类型时才能执行成功。此外,还可以使用其他选项和子句来进行更复杂的合并操作。

减一天

ADD_MONTHS(E.RE_DATE, 12) - INTERVAL '1' DAY

自增序列

创建(CREATE)Sequence

创建(CREATE)Sequence
CREATE SEQUENCE [schema_name.]{sequence_name}    -- schema_name为将存储序列的模式名,sequence_name 为自定义名称;
	START WITH      n    -- n 为序列的初始值,默认为1;
	INCREMENT BY    n    -- n 为序列步长(序列增加的幅度),默认为1,如果是负则按此步长递减;
	[MINVALUE n | NOMINVALUE ]    -- 如果序列递减,定义序列生成器能产生的最小值,默认为1
	[MAXVALUE n | NOMAXVALUE ]    -- 定义序列生成器能产生的最大值,默认无限制(1e28 - 1)
	[CACHE n | NOCACHE]    -- value 是存放序列的内存块大小,默认20。对序列进行内存缓存可以改善序列性能。
	[ORDER | NOORDER]    -- 表示序列号是按照请求的顺序生成的。如果使用时间戳的序列号会有用。
	[CYCLE | NOCYCLE]    -- 值达到限制值后是否循环,如果不循环,达到限制值后,继续产生新值会发生错误 ;

Oracle 索引

创建Btree索引(B树索引)

create index OBJECT_ID_idx on table_index(OBJECT_ID);

创建bitmap索引(位图索引)

create bitmap index OBJECT_TYPE_idx on table_index(OBJECT_TYPE);

bitmap应用场景:

重复率很高的键值;位图索引由于只存储键值的起止Rowid和位图,占用的空间非常少,且在bitmap index中一个dml操作,影响的是一个位图段(同一键值)。严重影响频繁的DML(极其容易造成会话hang住),造成死锁。

函数的索引
 

CREATE INDEX EMP_SUM_IDX ON hr.EMPLOYEES (SUBSTR(PHONE_NUMBER, 0, 3));

创建索引


 

create index BBS_IDX_ACCOUNTCENTER_CODE on BBS_ENTITY (ENTITY_CODE)
  tablespace IFRSUSER  --指定索引存储的表空间
  pctfree 10           --意味着当往索引数据块中插入新的索引条目时,每个数据块会预留 10% 的空间                                                                            
                         不被初始填满,以便后续对该数据块中的索引条目进行更新
  initrans 2           --这里设置为 2,表示每个索引数据块在创建时会预留 2 个入口供并发事务访问
                         该数据块中的索引数据,以适应一定程度的并发操作场景,确保在多个事务同时
                         访问该索引数据块时能够正常进行处理。
  maxtrans 255         --设置为 255,表示一个索引数据块最多可以同时处理 255 个并发事务对其中的
                         索引数据进行访问、更新等操作。
  storage              --这部分主要用于详细规定索引数据存储的一些参数
  (
    initial 64K        --指定了索引在创建时最初分配的存储空间大小为 64K 字节
    next 1M            --表示当最初分配的 64K 存储空间用完后,后续每次为索引扩展存储空间时增加
                         的大小为 1M 字节
    minextents 1       --MINEXTENTS 规定了索引所占用的最小存储扩展数量。这里设置为 1,表示索引
                         至少会占用一次初始分配的存储空间(即前面提到的 64K),并且后续扩展存储
                         时也至少会有一次扩展操作(按照 NEXT 参数指定的大小)。
    maxextents unlimited --MAXEXTENTS 用于设定索引所能占用的最大存储扩展数量。设置为 UNLIMITED         
                           意味着索引在存储增长方面没有上限限制,只要数据库所在的存储设备有足够
                           的空间,索引可以不断地按照 NEXT 参数指定的方式扩展存储空间以适应数据
                           量的增加和索引自身的增长。
  );

创建表
 

-- Create/Recreate primary, unique and foreign key constraints 
alter table BBS_ENTITY
  add constraint PK_BPL_CONFIGCENTER_ID primary key (ENTITY_ID)
  using index 
  tablespace IFRSUSER
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );

LISTAGG()

LISTAGG 函数介绍

listagg 函数是 Oracle 11.2 推出的新特性。
其主要功能类似于 wmsys.wm_concat 函数, 即将数据分组后, 把指定列的数据再通过指定符号合并。

LISTAGG 使用

listagg 函数有两个参数:
		1、 要合并的列名
		2、 自定义连接符号

☆LISTAGG 函数既是分析函数,也是聚合函数
所以,它有两种用法:
		1、分析函数,如: row_number()、rank()、dense_rank() 等,用法相似
		listagg(合并字段, 连接符) within group(order by 合并的字段的排序) over(partition by 分组字段)
		2、聚合函数,如:sum()、count()、avg()等,用法相似
		listagg(合并字段, 连接符) within group(order by 合并字段排序)		--后面跟 group by 语句


一部分聚合函数其实也可以写成分析函数的形式。

分析函数和聚合函数本质上都是对数据进行分组,二者最大的不同便是:
	对数据进行分组分组之后,
	聚合函数只会每组返回一条数据,
	而分析函数会针对每条记录都返回,
		一部分分析函数还会对同一组中的数据进行一些处理(比如:rank() 函数对每组中的数据进行编号);
		还有一部分分析函数不会对同一组中的数据进行处理(比如:sum()、listagg()),这种情况下,分析函数返回的数据会有重复的,distinct 处理之后的结果与对应的聚合函数返回的结果一致。



分析(窗口)函数:NTH_VALUE

NTH_VALUE 返回 analytic_clause 定义的窗口中第 n 行的 measure_expr 值。返回的值具有 measure_expr 的数据类型。

NTH_VALUE (measure_expr, n) [ FROM { FIRST | LAST } ][ { RESPECT | IGNORE } NULLS ]
 OVER (analytic_clause)

SELECT  deptno
       ,ename
	   ,sal
	   ,nth_value(sal, 3)OVER (PARTITION BY deptno ORDER BY sal DESC 
rows BETWEEN unbounded preceding AND unbounded following)  AS third_most_sal 
FROM emp_msg ORDER BY deptno,sal DESC;-- 默认为当前行





 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值