Oracle 数据库操作

1.创建数据库文件:

create tablespace [database_name] logging datafile 'F:\oracle\database_name.dbf' size 500m autoextend on next 500m maxsize 10240m extent management local;

2.创建数据库临时文件:

create temporary tablespace database_name_temp tempfile 'F:\oracle\database_name_temp.dbf' size 500m autoextend on next 500m maxsize 10240m extent management local;

3.创建用户与上述两个文件形成映射关系:

create user username identified by password default tablespace database_name temporary tablespace database_name_temp;

通过授权方式来创建用户:

grant connect,resource to test identified by test;

4.添加用户权限:

grant connect,resource,dba to username;//角色权限
grant create session to username;//登录权限

5.删除数据库:

conn username/password sysdba;
drop tablespace database_name including contents and datafiles;
drop tablespace database_name_temp including contents and datafiles;

6.删除用户:

drop user username cascade;

7.导入数据库:

imp username/password@localhost:1521/orcl file='database_file.dmp' full=y;
imp username/password@localhost:1521/orcl file=f:\databasename.dmp full=y ignore=y statistics=none buffer=819200;//ignore:忽视错误;statistics=none:exp和imp的版本存在差异;full=y:全部导入;buffer:设置缓冲区,默认为4k

impdp test/test@localhost:1521/orcl directory=dir_dmp dumpfile=skct_20200805.dmp remap_schema=skct:test

如果要导入的数据库没有表空间,则在impdp语句后加上参数:TRANSFORM=segment_attributes:n
关键字 说明 默认
USERID 用户名/口令
FULL 导入整个文件 (N)
BUFFER 数据缓冲区大小
FROMUSER 所有人用户名列表
FILE 输入文件 (EXPDAT.DMP)
TOUSER 用户名列表
SHOW 只列出文件内容 (N)
TABLES 表名列表
IGNORE 忽略创建错误 (N)
RECORDLENGTH IO记录的长度
GRANTS 导入权限 (Y)
INCTYPE 增量导入类型
INDEXES 导入索引 (Y)
COMMIT 提交数组插入 (N)
ROWS 导入数据行 (Y)
PARFILE 参数文件名
LOG 屏幕输出的日志文件
CONSTRAINTS 导入限制 (Y)
DESTROY 覆盖表空间数据文件 (N)
INDEXFILE 将表/索引信息写入指定的文件
SKIP_UNUSABLE_INDEXES 跳过不可用索引的维护 (N)
FEEDBACK 每 x 行显示进度
TOID_NOVALIDATE 跳过指定类型 ID 的验证
FILESIZE 每个转储文件的最大大小
STATISTICS 始终导入预计算的统计信息
RESUMABLE 在遇到有关空间的错误时挂起
RESUMABLE_NAME 用来标识可恢复语句的文本字符串
RESUMABLE_TIMEOUT RESUMABLE 的等待时间
COMPILE 编译过程, 程序包和函数 (Y)
STREAMS_CONFIGURATION 导入 Streams 的一般元数据 (Y)
STREAMS_INSTANITATION 导入 Streams 的实例化元数据 (N)
TRANSPORT_TABLESPACE 导入可传输的表空间元数据
TABLESPACES 将要传输到数据库的表空间
DATAFILES 将要传输到数据库的数据文件
TTS_OWNERS 拥有可传输表空间集中数据的用户

8.导出数据库:

导出数据库:

exp username/password@orcl file=d:/a.dmp full=y;//本地库
exp username/password@orcl file=d:/a.dmp owner=username;//本地库(根据用户名导出数据库)
exp username/password@IP:1521/orcl file=d:/a.dmp full=y;//远程库
exp username/password@orcl file=d:\t_20200611.dmp owner='username' statistics=none indexes=n buffer=5120000

--如果导出出现问题,可以使用以下方法:
--1.创建 DIRECTORY
create directory dir_dp as 'd:/dmp';
--2.导出
expdp username/password@localhost:1521/orcl directory=dir_dp dumpfile=a.dmp schemas=username;
关键字 说明 默认
USERID 用户名/口令
FULL 导出整个文件 (N)
BUFFER 数据缓冲区的大小
OWNER 导出指定的所有者用户名列表
FILE 输出文件 (EXPDAT.DMP)
TABLES 导出指定的表名列表
COMPRESS 是否压缩导出的文件 (Y)
RECORDLENGTH IO 记录的长度
GRANTS 导出权限 (Y)
INCTYPE 增量导出类型
INDEXES 导出索引 (Y)
RECORD 跟踪增量导出 (Y)
ROWS 导出数据行 (Y)
PARFILE 参数文件名
CONSTRAINTS 导出限制 (Y)
CONSISTENT 交叉表一致性
LOG 屏幕输出的日志文件
STATISTICS 分析对象(ESTIMATE)
DIRECT 直接路径 (N)
TRIGGERS 导出触发器 (Y)
FEEDBACK 显示每 x 行 (0) 的进度
FILESIZE 各转储文件的最大尺寸
QUERY 选定导出表子集的子句
TRANSPORT_TABLESPACE 导出可传输的表空间元数据 (N)
TABLESPACES 导出指定的表空间列表

运行 sql 文件:

@f:\oracle-all.sql
start f:\oracle-all.sql

9.查看数据库表 user 中有哪些字段:

select * from user_col_comments where table_name='user';

10.查看当前用户的所有视图:

select * from user_views;

创建带有错误的视图:

create force view viewName as select * from userTable;//此 userTable 可以不存在

11.查看视图 test 定义语句:

select dbms_metadata.get_ddl('VIEW','test') from dual;
select text from all_views where view_name='test';

12.添加列

alter table tablename add (field VARCHAR2(50) NULL,field VARCHAR(2) NULL,...);

13.删除列

ALTER TABLE tablename DROP(field1,field2);

14.设置列可以为空

alter table tablename modify field null;

15.查看约束

select * from user_constraints;

-- 删除唯一约束条件
 alter table [tablename] DROP CONSTRAINT [CONSTRAINT_NAME]

16.创建序列

create sequence hq01_seq start with 1 increment by 1;

17.查看序列

select * from user_sequences;

18.创建触发器

create or replace trigger [triggername]
   before insert on [tablename]
      for each row
         when(new.[primaryKey] is null)
   begin
      select [createNewSequence].nextval into:NEW.[primaryKey] from dual;
end;

-- 删除触发器
DROP TRIGGER trigger_name;

19.比较两个时间段是否有重叠

SELECT COUNT(*) FROM HQ02 WHERE AHQ022=#ahq022#
		AND  (AHQ025,AHQ026)
		OVERLAPS
		(TO_DATE(#传入的开始时间参数#,'yyyy-MM-dd hh24:mi:ss'),TO_DATE(#传入的结束时间参数#,'yyyy-MM-dd hh24:mi:ss'))//需要注意的是时间的格式转换
 SELECT * FROM dual
     WHERE 
        (to_date('20170101','YYYYMMDD'),to_date('20190101','YYYYMMDD'))
     OVERLAPS
        (to_date('20160101','YYYYMMDD'),to_date('20170101','YYYYMMDD'));
//包体中数据的判断
SELECT COUNT(*) FROM HQ02 WHERE AHQ022=PRM_AHQ022 AND (AHQ025,AHQ026) OVERLAPS 	(PRM_AHQ025,PRM_AHQ026)

20.CREATE TYPE 定义新的用户定义数据类型。

CREATE OR REPLACE TYPE TABLE_AAC002_ISJY IS TABLE OF TYPE_AAC002_ISJY;

21.常见单行函数

分类:字符串相关,数字相关,日期相关,类型转换相关,NVL 函数。

字符串相关函数:

length(str) 			  --获得字符串 str 的字符长度(按字符计,汉字、英文、数字都是1个字符)
lengthb(str)              --获得字符串 str 的字符长度(按字节计,汉字是3个字节,英文1个字节)
concat(str1,str2)		  --相当于 str1||str2 的功能,字符串拼接
CONVERT( string1, char_set_to [, char_set_from] )  --返回特定字符集中的字符串值
INITCAP( string1 ) --string1 :字符串参数,其中每个单词中的第一个字符将转换为大写字母,其余所有字符转换为小写字母。
substr(str,begin,length)  --截取字符串,从下标 begin 开始,截取 length 位
substr(str,begin,length) --按字节截取,不足1个汉字长度的,返回两个空格;多余1个汉字少于2个汉字,返回截取值+空格
instr(str1,str2,begin)    --在 str1 里查找 str2 ,从下标 begin 开始查找,找到返回 str2 首字母所在的下标,否则返回 -1
lower(str)/upper(str) 	   --将 str 转换成小写/大写
trim  					  --去除左右两边指定字符串
ltrim 					  --去除左边指定字符串
rtrim 					  --去除右边指定字符串
replace(str,old,new)  	    --替换字符串中指定字符为新的字符串
函数 说明 案例 结果
ASCII(X) 求字符X的ASCII码 select ASCII(‘A’) FROM DUAL; 65
CHR(X) 求ASCII码对应的字符 select CHR(65) FROM DUAL; ‘A’
LENGTH(X) 求字符串X的长度 select LENGTH(‘ORACLE技术圈’)from DUAL; 9
CONCATA(X,Y) 返回连接两个字符串X和Y的结果 select CONCAT(‘ORACLE’,‘技术圈’) from DUAL; ORACLE技术圈
INSTR(X,Y[,START]) 查找字符串X中字符串Y的位置,可以指定从Start位置开始搜索,不填默认从头开始 SELECT INSTR(‘ORACLE技术圈’,‘技术’) FROM DUAL; 7
LOWER(X) 把字符串X中大写字母转换为小写 SELECT LOWER(‘ORACLE技术圈’) FROM DUAL; oracle技术圈
UPPER(X) 把字符串X中小写字母转换为大写 SELECT UPPER(‘Oracle技术圈’) FROM DUAL; ORACLE技术圈
INITCAP(X) 把字符串X中所有单词首字母转换为大写,其余小写。 SELECT INITCAP('ORACLE is good ') FROM DUAL; Oracle Is Good
LTRIM(X[,Y]) 去掉字符串X左边的Y字符串,Y不填时,默认的是字符串X左边去空格 SELECT LTRIM(’–ORACLE技术圈’,’-’) FROM DUAL; ORACLE技术圈
RTRIM(X[,Y]) 去掉字符串X右边的Y字符串,Y不填时,默认的是字符串X右边去空格 SELECT RTRIM(‘ORACLE技术圈–’,’-’) FROM DUAL; ORACLE技术圈
TRIM(X[,Y]) 去掉字符串X两边的Y字符串,Y不填时,默认的是字符串X左右去空格 SELECT TRIM(’–ORACLE技术圈–’,’-’) FROM DUAL; ORACLE技术圈
REPLACE(X,old,new) 查找字符串X中old字符,并利用new字符替换 SELECT REPLACE(‘ORACLE技术圈’,‘技术圈’,‘技术交流’) FROM DUAL; ORACLE技术交流
SUBSTR(X,start[,length]) 截取字符串X,从start位置(其中start是从1开始)开始截取长度为length的字符串,length不填默认为截取到字符串X末尾 SELECT SUBSTR(‘ORACLE技术圈’,1,6) FROM DUAL; ORACLE
RPAD(X,length[,Y]) 对字符串X进行右补字符Y使字符串长度达到length长度 SELECT RPAD(‘ORACLE’,9,’-’) from DUAL; ORACLE—
LPAD(X,length[,Y]) 对字符串X进行左补字符Y使字符串长度达到length长度 SELECT LPAD(‘ORACLE’,9,’-’) from DUAL; —ORACLE

CONVERT 函数返回特定字符集中的字符串值。 可用的字符集是:

字符集 描述
US7ASCII 美国 7 位 ASCII 字符集
WE8DEC 西欧 8 位字符集
WE8HP 惠普西欧 Laserjet 8 位字符集
F7DEC DEC 法语 7 位字符集
WE8EBCDIC500 IBM 西欧 EBCDIC 代码第 500 页
WE8PC850 IBM PC 代码第 850 页
WE8ISO8859P1 ISO 8859-1 西欧 8 位字符集

22.日期相关函数

sysdate 						 --表示当前系统时间
add_months(myDate,num) 			 --对 myDate 做月份的算数运算
last_day(myDate) 				 --月份最后一天函数:获取 myDate 所在月份的最后1天
NEXT_DAY(r,c)                    --指定日期后一周的日期函数::返回指定R日期的后一周的与r日期字符(c:表示星期几)对应的日期。
months_between(myDate1,myDate2)  --返回两个日期间的月份数:计算两个日期之间相隔几个月,返回值为小数
ADD_MONTHS(r,n)                --给日期加上指定的月份函数:该函数返回在指定日期r上加上一个月份数n后的日期。
trunc(myDate,日期格式字符串) 	    --根据指定日期格式对 myDate 日期做截断【可选日期格式字符串:year-按年截断,month-按月截断,day-星期,省略格式字符串表示截断时分秒】
ROUND(r[,f]--日期截取函数:将日期r按f的格式进行四舍五入。如果f不填,则四舍五入到最近的一天。
EXTRACT(time--返回指定日期中特定部分的函数:返回指定time时间当中的年、月、日、分等日期部分。

日期的四舍五入:

round(date,format) 	--date 为指定日期,format 为指定格式,默认为 format 为 ddd 四舍五入到某天
year 				--四舍五入到某年的1月1日
month 				--四舍五入到某月的1日
ddd 				--四舍五入到某天
day 				--四舍五入到某周的周日

23.数字相关函数

mod(num1,num2) 		  --取模,num1 % num2
trunc(n,length) 	  --对数字 n 进行截断,精度到小数点后 length 位
round(n1,length) 	  --对数字 n 四舍五入精度到小数点后 length 位
abs(num) 			  --对 num 取绝对值
dbms_random.random()  --获取随机数,产生一个很大的随机数(可正,可负)
函数 解释 案例 结果
ABS(X) 求数值X的绝对值 select abs(-9) from dual; 9
COS(X) 求数值X的余弦 select cos(1) from dual; 0.54030230586814
ACOS(X) 求数值X的反余弦 select acos(1) from dual; 0
CEIL(X) 求大于或等于数值X的最小值 select ceil(7.8) from dual; 8
FLOOR(X) 求小于或等于数值X的最大值 select floor(7.8) from dual; 7
log(x,y) 求x为底y的对数 select log(2,8) from dual; 3
mod(x,y) 求x除以y的余数 select mod(13,4) from dual; 1
power(x,y) 求x的y次幂 select power(2,4) from dual; 16
sqrt(x) 求x的平方根 select sqrt(16) from dual; 4
round(x[,y]) 求数值x在y位进行四舍五入。y不填时,默认为y=0;当y>0时,是四舍五入到小数点右边y位。当y<0时,是四舍五入到小数点左边|y|位。 select round(7.816, 2), round(7.816), round(76.816, -1) from dual; 7.82 / 8 / 80
trunc(x[,y]) 求数值x在y位进行直接截取y不填时,默认为y=0;当y>0时,是截取到小数点右边y位。当y<0时,是截取到小数点左边|y|位。 select trunc(7.816, 2), trunc(7.816), trunc(76.816, -1) from dual; 7.81 / 7 / 70

常用单行函数:

sum(列名) 	--求一组数据的总和
avg(列名) 	--求一组数据的平均值
max(列名) 	--在一组数据中找出最大值
min(列名) 	--在一组数据中找出最小值
count(列名) 	--对查询结果中该列的非空记录(统计结果中该列不为 null 的行数)
cos(num) 	 --余弦值
acos(num) 	 --反余弦值
sqrt(num) 	 --求平方根
chr(x) 		 --给出整数 x,返回对应的 ASCII 码字符
ASCII()  	 --给出 ASCII 码字符,返回 chr 对应的整数 x

24.空值处理函数

​ 空值判断,返回不通过结果

nvl(str,value1) 		--如果 str 为空,返回 value1,否则返回 str
nvl2(str,value1,value2) --如果 str 为空,返回 value2,否则返回 value1

25.转换函数

to_char(date,format)   --将日期的指定格式内容转换为字符串
to_char(number,formet) --将数字转换为字符串(当保留小数点时四舍五入)
to_number(str,format)  --将字符串转换为数字类型
to_date(str,[format])  --将 str 转换为 format 格式的日期

26.判断两个表达式

nullif(exp1,exp2)  --两表达式相等时,返回 null,否则返回表达式一分组函数:基于一组行来返回

27.创建索引

create index indexName on tableName("columnName");

28.重命名表

alter table tableName rename to newTableName;

29.日期函数

select to_char(sysdate,'yyyy-mm-dd,hh24:mi:ss') from dual;
加法 
SELECT SYSDATE,ADD_MONTHS(SYSDATE,12) FROM DUAL; --加1年 
SELECT SYSDATE,ADD_MONTHS(SYSDATE,1) FROM DUAL; --加1月 
SELECT SYSDATE,TO_CHAR(SYSDATE+7,'yyyy-mm-dd HH24:MI:SS') FROM DUAL; --加1星期 
SELECT SYSDATE,TO_CHAR(SYSDATE+1,'yyyy-mm-dd HH24:MI:SS') FROM DUAL; --加1天 
SELECT SYSDATE,TO_CHAR(SYSDATE+1/24,'yyyy-mm-dd HH24:MI:SS') FROM DUAL; --加1小时 
SELECT SYSDATE,TO_CHAR(SYSDATE+1/24/60,'yyyy-mm-dd HH24:MI:SS') FROM DUAL; --加1分钟 
SELECT SYSDATE,TO_CHAR(SYSDATE+1/24/60/60,'yyyy-mm-dd HH24:MI:SS') FROM DUAL; --加1秒 

减法 
SELECT SYSDATE,ADD_MONTHS(SYSDATE,-12) FROM DUAL; --减1年 
SELECT SYSDATE,ADD_MONTHS(SYSDATE,-1) FROM DUAL; --减1月 
SELECT SYSDATE,TO_CHAR(SYSDATE-7,'yyyy-mm-dd HH24:MI:SS') FROM DUAL; --减1星期 
SELECT SYSDATE,TO_CHAR(SYSDATE-1,'yyyy-mm-dd HH24:MI:SS') FROM DUAL; --减1天 
SELECT SYSDATE,TO_CHAR(SYSDATE-1/24,'yyyy-mm-dd HH24:MI:SS') FROM DUAL; --减1小时 
SELECT SYSDATE,TO_CHAR(SYSDATE-1/24/60,'yyyy-mm-dd HH24:MI:SS') FROM DUAL; --减1分钟 
SELECT SYSDATE,TO_CHAR(SYSDATE-1/24/60/60,'yyyy-mm-dd HH24:MI:SS') FROM DUAL; --减1秒 

30.关键字

伪列:可查询,但不能插入、更新和修改它们的值
伪列概念:伪列就是假的、不存在的列。这些列在列表中并不存在,但是可以通过查询语句查询出来
常用伪列:rowid 和 rownum
rowid:表中行的存储地址,可唯一标示数据库中的某一行,可以使用该列快速定位表中的行
rownum:查询返回结果集中的行的序号,可以使用它来限制查询返回的行数
  限定:rownum 做条件,只能用 <,<=,=1,>=1 条件
having:对分组后的数据进行过滤(条件过滤)
   where 和 having 的区别:
      where:对分组之前的数据进行过滤(优先选择使用:效率高)
      having:对分组后的数据进行过滤
Union:将查询结果合并,并去除重复的行(并集)
Union All:将查询结果合并,不去除重复行
cross join:创建表的笛卡尔积
Minus:从第一个结果集中去除第二个结果集中的内容(差集)
Intersect:求两个结果集的交集
Oracle 数据类型:
   字符类型:varchar2  varchar  char
   数字类型:number  integer
   日期类型:date   timestamp
   大对象类型:BLOB  clob
约束
  语法:Constraint 约束名 + 约束类型
  约束类型:
    主键约束:primary
    唯一约束:unique
    非空约束:not null
    检查约束:check
    外键约束:forign key
    组合约束:约束(列1,列2)
  1. 事务的传播属性:
PROPAGATION_REQUIRED   	  -- 支持当前事务,如果当前没有事务,就新建一个事务。父事务与子事务只要有一个失败,就全部回滚。

PROPAGATION_SUPPORTS   	  -- 支持当前事务,如果当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY  	  -- 支持当前事务,如果当前没有事务,就抛出异常。

PROPAGATION_REQUIRES_NEW  -- 新建事务,如果当前存在事务,把当前事务挂起。父事务与子事务相互独立运行,互不影响。

PROPAGATION_NOT_SUPPORTED -- 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER 		  -- 以非事务方式执行,如果当前存在事务,则抛出异常。

PROPAGATION_NESTED 		  -- 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。


TransactionDefinition接口中定义了五个表示隔离级别的常量:
TransactionDefinition.ISOLATION_DEFAULT:使用后端数据库默认的隔离界别,MySQL默认采用的REPEATABLE_READ隔离级别,Oracle默认采用的READ_COMMITTED隔离级别。
TransactionDefinition.ISOLATION_READ_UNCOMMITTED:最低的隔离级别,允许读取,允许读取尚未提交的的数据变更,可能会导致脏读、幻读或不可重复读。
TransactionDefinition.ISOLATION_READ_COMMITTED:允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
TransactionDefinition.ISOLATION_REPEATABLE_READ:对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
TransactionDefinition.ISOLATION_SERIALIZABLE:最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就说,该级别可以阻止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。
  1. connect by prior 是结构化查询中用到的,其基本语法是:

    select ... from tablename start with 条件1
    connect by prior 条件2
    where 条件3;
    

start with:表示以什么为根节点,不加限制可以写1=1,要以 id 为123的节点为根节点,就写为 start with id =123

connect by:connect by 是必须的,start with 有些情况是可以省略的,或者直接 start with 1=1 不加限制

prior:prior 关键字可以放在等号的前面,也可以放在等号的后面,表示的意义是不一样的,比如 prior id = pid,就表示 pid 就是这条记录的根节点了

  1. dblink 的使用方法:
create database link [当前连接的命名]
  connect to yongshuangyihao[远程数据库用户名] identified by [远程数据库密码]
  using '(DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = [远程数据库主机名])(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
    )
  )';
create shared database link [当前连接的命名]
connect to [远程数据库用户名] identified by [远程数据库密码]
using '[远程数据库主机名]/orcl(数据库名称)';   
create database link [当前连接的命名] connect to [远程数据库用户名] identified by "[远程数据库密码]" USING '[远程数据库主机名]/orcl(数据库名称)';
create public database link [当前连接的命名] connect to [远程数据库用户名] identified by "[远程数据库密码]" USING '[远程数据库主机名]/orcl(数据库名称)';

注意:远程数据库密码若出现特殊字符,必须用双引号括起来

  1. Oracle 的存储过程:
  procedure 即 oracle 的存储过程
   语法:
       CREATE [OR REPLACE] PROCEDURE procedure_name
       [(parameter1 [{IN|OUT|IN OUT}] datatype
       [{:=|DEFAULT} expression]
       [(parameter2 [{IN|OUT|IN OUT}] datatype
       [{:=|DEFAULT} expression]
       ...])]
       {IS|AS}
       [declarations]
       BEGIN
       code
       [EXCEPTION]
       exception_handlers]
       END

存储过程的三中参数模式:INOUTIN OUT

 参数传递的方式有两种:
     参数位置对应法
     参数命名传递法(采用此方法是调用参数的顺序不必和定义时的顺序一致)
     IN    只读模式   OUT  只写模式   IN OUT/写模式
       
解释说明:
  CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它;
  IS 关键词表明后面将跟随一个PL/SQL体。
  BEGIN 关键词表明PL/SQL体的开始。
  NULL PL/SQL语句表明什么事都不做,这句不能删去,因为PL/SQL体中至少需要有一句;
  END 关键词表明PL/SQL体的结束
  
  procedure 关键字是创建存储过程的命令。
   create [or replace]: 如果存储过程已经存在则覆盖替代原有的过程。
   in|out :存储过程具有入参和出参两种参数选择,in表示的是入参,out表示的是出参,在使用过程的时候,入参必须得有对应的变量传入,出参得有对应的变量接收。
   datatype  表示出入参变量对应的数据类型。
   is  后面跟着的是过程当中使用到的声明变量。
   begin...end  中间编写的就是存储过程的具体操作。
  1. 触发器使用:
触发器的语法:
create [or replace] tigger 触发器名 触发时间 触发事件
on 表名
[for each row]
begin
  pl/sql语句
end
其中:
触发器名:触发器对象的名称。由于触发器是数据库自动执行的,因此该名称只是一个名称,没有实质的用途。
触发时间:指明触发器何时执行,该值可取:
before:表示在数据库动作之前触发器执行;
after:表示在数据库动作之后触发器执行。
触发事件:指明哪些数据库动作会触发此触发器:
insert:数据库插入会触发此触发器;
update:数据库修改会触发此触发器;
delete:数据库删除会触发此触发器。
表 名:数据库触发器所在的表。
for each row:对表的每一行触发器执行一次。如果没有这一选项,则只对整个表执行一次。

触发器能实现如下功能:
1、 允许/限制对表的修改
2、 自动生成派生列,比如自增字段
3、 强制数据一致性
4、 提供审计和日志记录
5、 防止无效的事务处理
6、 启用复杂的业务逻辑

  1. 批量删除表
--查看
show parameter deferred_segment_creation;
--执行命令
alter system set deferred_segment_creation=false;

--1>拼接 sql 语句
select 'DROP TABLE  '||TABLE_NAME||';' from user_tables where table_name in('表名','表名','表名','表名','表名','表名','表名',...)
--2>将以上 sql 语句执行之后的结果复制到 sql 命令行中执行
  1. 授权
--授予用户 SKCT 查询 XJJY 下的CC03表的查询权限。
grant select on XJJY.CC03 to SKCT;
  1. CASE WHEN 的用法
--Case when 的用法,简单Case函数 
--简单CASE表达式,使用表达式确定返回值.

 --语法:
  CASE search_expression
  WHEN expression1 THEN result1
  WHEN expression2 THEN result2
  WHEN expressionN THEN resultN
  ELSE default_result

 --搜索CASE表达式,使用条件确定返回值.
  --语法:
  CASE
  WHEN condition1 THEN result1
  WHEN condistion2 THEN result2
  WHEN condistionN THEN resultN
  ELSE default_result
  END
  1. FOR IN LOOP 循环更新的用法
FOR1 IN (
SELECT [匹配字段][更新字段] FROM A表
 ) loop
UPDATE B表
SET B表.[需要更新字段]=1.[更新字段]WHERE
 B表.[匹配字段]=1.[匹配字段];
END loop ;

注意:

  1. 表1 为虚拟表,不需要创建,且其数据与 in() 括号里面的数据一致
  2. B 表表示需要更新的数据库表,且 A 与 B 均为数据库表
  1. 存在时 -> 更新,不存在时 -> 插入:MERGE INTO USING ON
MERGE INTO 目标表 a
USING 源表 b
   ON (a.字段1 = b.字段2 and a.字段n = b.字段n) -- 必须带 () 括号
 WHEN MATCHED THEN   -- 整体扫描,匹配时,执行此处
      UPDATE SET a.新字段 = b.字段 
       WHERE 限制条件
 WHEN NOT MATCHED THEN -- 整体扫描,不匹配时,执行此处
      INSERT (a.字段名1,a.字段名n) VALUES(b.字段值1, b.字段值n) 
       WHERE 限制条件

MERGE 是 Oracle9i 新增的语法,根据源表对目标表进行匹配查询,匹配成功时更新,不成功时插入
比单独的 update + insert 的方式效率要更高,尤其是 on 条件下有唯一索引的时候,效率更高。

  1. 嵌套表
--创建嵌套表类型
CREATE OR REPLACE TYPE 嵌套表 AS TABLE OF 基类;

--创建嵌套表的基类型
CREATE OR REPLACE TYPE 基类 AS OBJECT ([字段] 字段类型,[字段] 字段类型,[字段] 字段类型,...);

意义:

此表具有该类型和member方法的所有属性,我们不能通过DBA STUDIO的表数据编辑器来编辑数据。

  1. REGEXP_SUBSTR 函数的用法(分割字符串函数)
--语法:
--REGEXP_SUBSTR 函数格式如下:
 REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)
 
 --解释说明:
   --* srcstr     :需要进行正则处理的字符串
   --* pattern    :进行匹配的正则表达式
   --* position   :起始位置,从字符串的第几个字符开始正则表达式匹配(默认为1) 注意:字符串最初的位置是1而不是0。
   --* occurrence :获取第几个分割出来的组(分割后最初的字符串会按分割的顺序排列成组);标识第几个匹配组,默认为1
   --* modifier   :模式(‘i’不区分大小写进行检索;‘c’区分大小写进行检索。默认为’c’)针对的是正则表达式里字符大小写的匹配
   
/** 示例 **/
select regexp_substr('20191231','[^0]+',1,level) from dual connect by level <=regexp_count('20191231','[^0]+');

select regexp_substr(abb017,'[^0]+',1,level) from bb01@LKXJJCNS where abb007 ='201668125238' and abb011='570' connect by level <=regexp_count(abb017,'[^0]+');
  1. REGEXP_COUNT 函数的用法(统计字符串出现的次数)
-- REGEXP_COUNT函数语法参考: 
REGEXP_COUNT (source_char, pattern , position , match_param)

-- 参数解释说明:
--*  source       : 需要用来进行分析的字符串
--*  pattern      :匹配的正则表达式
--*  position     :字符串开始分析的位置,可以省略,默认值是 1
--*  match_param  :‘i’ 用于不区分大小写的匹配
--*					‘c’ 用于区分大小写的匹配
--*					‘n’ 允许句点(.)作为通配符去匹配换行符。如果省略该参数,则句点将不匹配换行符
--*					‘m’ 将源串视为多行。即Oracle 将^和$分别看作源串中任意位置任何行的开始和结束,而不是仅仅看作整个源串的开始或结束。如果省略该参数,则Oracle将源串看作一行。
--*					‘x’ 忽略空格字符。默认情况下,空格字符与自身相匹配。

/** 示例 **/
select regexp_substr('20191231','[^0]+',1,level) from dual connect by level <=regexp_count('20191231','[^0]+');

select regexp_substr(abb017,'[^0]+',1,level) from bb01@LKXJJCNS where abb007 ='201668125238' and abb011='570' connect by level <=regexp_count(abb017,'[^0]+');--若出现多条数据,则是由于 level <=regexp_count(abb017,'[^0]+') 以笛卡尔积的方式来计算
  1. REGEXP_REPLACE 函数的用法(字符串替换函数)
-- 语法参考:
REGEXP_REPLACE(VARCHAR str, VARCHAR pattern, VARCHAR replacement)

-- 参数说明:
--* str          :指定用来分析的字符串
--* pattern      :被替换的字符串,可以是普通字符,也可以是正则表达式
--* replacement  :用于替换的字符串

--示例:
select regexp_substr('20191231','[^0]+',1,level) from dual connect by level <=regexp_replace('20191231','[^0]+','3');

select regexp_replace('welcome','e','vv') from dual;

select regexp_replace('welcome','[a-z]','v1v') as result from dual;

额外:

select REGEXP_SUBSTR('110kV白龙新村变电站/10kV楚城Ⅴ回线/台变/灵秀路1号公变/变压器区域/灵秀路1号公变','[^/]+'14) as result  from dual connect by level <=1;

select REGEXP_SUBSTR('110kV白龙新村变电站/10kV楚城Ⅴ回线/台变/灵秀路1号公变/变压器区域/灵秀路1号公变','[^/]+'1,regexp_count('110kV白龙新村变电站/10kV楚城Ⅴ回线/台变/灵秀路1号公变/变压器区域/灵秀路1号公变','[^/]+')) as result  from dual connect by level <=1;

select REGEXP_SUBSTR('35kV杨家庄变电站/10kV临时Ⅰ段母线/台变/新坝村公变/变压器区域/变压器间隔/新坝村公变','[^/]+'14) as result  from dual connect by level <=1;

select REGEXP_SUBSTR('35kV杨家庄变电站/10kV临时Ⅰ段母线/台变/新坝村公变/变压器区域/变压器间隔/新坝村公变','[^/]+'1,regexp_count('35kV杨家庄变电站/10kV临时Ⅰ段母线/台变/新坝村公变/变压器区域/变压器间隔/新坝村公变','[^/]+')) as result  from dual connect by level <=1;

select REGEXP_SUBSTR('110kV白龙新村变电站/10kV楚城Ⅴ回线/台变/灵秀路1号公变/变压器区域/灵秀路1号公变','/'1)  from dual connect by level <=regexp_count('110kV白龙新村变电站/10kV楚城Ⅴ回线/台变/灵秀路1号公变/变压器区域/灵秀路1号公变','/');

select REGEXP_SUBSTR('110kV白龙新村变电站/10kV楚城Ⅴ回线/台变/灵秀路1号公变/变压器区域/灵秀路1号公变','/'1)  from dual connect by level <=1;

select REGEXP_SUBSTR('110kV白龙新村变电站/10kV楚城Ⅴ回线/台变/灵秀路1号公变/变压器区域/灵秀路1号公变','[^/]+'1,level) as result  from dual connect by level <=regexp_count('110kV白龙新村变电站/10kV楚城Ⅴ回线/台变/灵秀路1号公变/变压器区域/灵秀路1号公变','[^/]+');
  1. 获取当前 IP 地址
select sys_context('userenv','ip_address') AS a from dual;
  1. 获取当前用户及 IP 地址
SELECT USER, sys_context('userenv','ip_address') AS loginIP,sysdate AS logintime FROM dual;
  1. 获取当前操作及用户
SELECT sql_text, last_load_time FROM v$sql

SELECT sql_text,parsing_schema_name,service,action,last_load_time,last_active_time FROM v$sql ORDER BY last_load_time DESC
  1. 空表处理
select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0;
  1. 查看存储过程最近修改记录信息
SELECT *
FROM USER_OBJECTS
WHERE  OBJECT_NAME = '存储过程包名';

SELECT *
FROM sys.ALL_OBJECTS
WHERE  OBJECT_NAME = '存储过程包名';
  1. 物化视图

​ 1> 数据文件增加

--增大临时文件大小
alter database tempfile ‘/u01/app/oracle/oradata/orcl/temp01.dbf’ resize 100m;

--增加数据文件
alter tablespace sp01 add datafile 'D:\dev\oracle\product\10.2.0\dada02.dbf' size 1m;

--修改数据文件的大小
alter tablespace sp01 'D:\dev\oracle\product\10.2.0\dada01.dbf' resize 4m;

-- 将临时数据文件设为自动扩展:(数据文件的大小不要超过500m)
alter tablespace sp01 'D:\dev\oracle\product\10.2.0\dada01.dbf' autoextend on next 10m maxsize 500m;

-- 将临时数据文件设为自动扩展:(不限制大小)
alter database tempfile ‘/u01/app/oracle/oradata/orcl/temp01.dbf’ autoextend on next 5m maxsize unlimited;

-- 查询日志文件位置:
show parameter dump_dest;

-- 查看最近所执行的 sql 语句
select * from v$sql;
select * from v$sqlarea;

-- 查看当前会话所执行的语句以及会话相关信息:
select * from v$session;
select * from v$sqlarea;

-- 日志路径
select * from v$logfile;

​ 2> 物化视图

-- 创建物化视图
CREATE MATERIALIZED VIEW [视图名称] AS [查询语句]

-- 查看物化视图
SELECT * FROM dba_registered_snapshots WHERE OWNER='SKCT';
  1. 创建已知字段表:
--与原表的表结构相同,但是不添加原来表中的数据
CREATE TABLE [新表名] AS SETLECT * FROM [已有表名] WHERE 1 = 2;

-- 与原表的表结构相同,并添加原表中的数据
CREATE TABLE [新表名] AS SETLECT * FROM [已有表名];
  1. 删除表空间
drop tablespace [表空间名称] including contents and datafiles cascade constraint;
--查看表空间详细占比情况
SELECT UPPER(F.TABLESPACE_NAME) "表空间名",
       
       D.TOT_GROOTTE_MB "表空间大小(M)",
       
       D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)",
       
       TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,
                     2),
               '990.99') "使用比",
       
       F.TOTAL_BYTES "空闲空间(M)",
       
       F.MAX_BYTES "最大块(M)"

  FROM (SELECT TABLESPACE_NAME,
               
               ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,
               
               ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES
        
          FROM SYS.DBA_FREE_SPACE
        
         GROUP BY TABLESPACE_NAME) F,
       
       (SELECT DD.TABLESPACE_NAME,
               
               ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB
        
          FROM SYS.DBA_DATA_FILES DD
        
         GROUP BY DD.TABLESPACE_NAME) D

 WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME

 ORDER BY 4 DESC;
  1. 通用sql命令脚本
-- oracle 查看所有用户名
select * from all_users;
-- oracle 查看用户下所有的表
select * from user_tables;
-- Oracle 查看索引个数和类别
select index_name,index_type,table_name from user_indexes order by table_name;
-- Oracle 查看序列号,last_number是当前值
select * from user_sequences;
-- Oracle 查看视图的名称
select view_name from user_views;
-- Oracle 查看创建视图的 select 语句
 - set view_name,text_length from user_views;
 - set long 2000; --说明:可以根据视图的text_length值设定set long 的大小
 - select text from user_views where view_name=upper('&view_name');
-- Oracle 同义词是表、索引、视图等模式对象的一个别名
select * from user_synonyms;
-- 查看定时器
select job,broken,what,interval,t.* from user_jobs t;

user_jobs 主要字段说明:

列名 数据类型 解释
JOB NUMBER 任务的唯一标示号
LOG_USER VARCHAR2(30) 提交任务的用户
PRIV_USER VARCHAR2(30) 赋予任务权限的用户
SCHEMA_USER VARCHAR2(30) 对任务作语法分析的用户模式
LAST_DATE DATE 最后一次成功运行任务的时间
LAST_SEC VARCHAR2(8) 如HH24:MM:SS格式的last_date日期的小时,分钟和秒
THIS_DATE DATE 正在运行任务的开始时间,如果没有运行任务则为null
THIS_SEC VARCHAR2(8) 如HH24:MM:SS格式的this_date日期的小时,分钟和秒
NEXT_DATE DATE 下一次定时运行任务的时间
NEXT_SEC VARCHAR2(8) 如HH24:MM:SS格式的next_date日期的小时,分钟和秒
TOTAL_TIME NUMBER 该任务运行所需要的总时间,单位为秒
BROKEN VARCHAR2(1) 标志参数,Y标示任务中断,以后不会运行
INTERVAL VARCHAR2(200) 用于计算下一运行时间的表达式
FAILURES NUMBER 任务运行连续没有成功的次数
WHAT VARCHAR2(2000) 执行任务的PL/SQL块
  1. 查看字段存在的数据库表:
select table_name from user_tab_columns where column_name = '字段名';
  1. 查看 sql 脚本执行的历史记录:
select * from v$sqlarea order by last_load_time desc;
  1. 定时器创建:
declare jobno number;
begin
    dbms_job.submit(jobno,'程序;',sysdate,'sysdate+1/24');
    commit;
end;
  1. GROUP BY 与 HAVING 的用法
-- group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面

-- where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。

-- having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。

-- having 子句被限制子已经在SELECT语句中定义的列和聚合表达式上。通常,你需要通过在HAVING子句中重复聚合函数表达式来引用聚合值,就如你在SELECT语句中做的那样。例如:

SELECT A COUNT(B) FROM TABLE GROUP BY A HAVING COUNT(B)>2
  1. Oracle 查询当前数据库获得 所有表名+表名注释
SELECT 
    a.TABLE_NAME,b.COMMENTS
FROM
    user_tables a,user_tab_comments b
WHERE 
    a.TABLE_NAME=b.TABLE_NAME
ORDER BY 
    TABLE_NAME 
  1. Oracle将多个结果集用逗号拼接成字符串:LISTAGG([结果集],',') within group(order by [字段名])
select LISTAGG(b.aac002,',') within group(order by b.aac002)  as aac002s,c.aab001
        from cc03 a, ac01 b ,df01 c
        where  1 = 1
          and a.aac001 = b.aac001
          and a.aab001 = c.aab001
          and a.aae100 = '1'
          and a.yae421='1'
          and c.adf001 = #{adf001}
        group by c.aab001
  1. oracle数据库行锁(锁表)
--查找oracle中被锁的行 所谓的行锁
SELECT l.session_id      "会话标识符",
       s.SERIAL# 		 "会话序列号",
       l.locked_mode     "锁模式",
       l.oracle_username "数据库名",
       l.os_user_name    "计算机用户名",
       s.machine         "操作系统机器名称(计算机组/名)",
       s.terminal        "计算机名",
       o.object_name     "数据库表名",
       s.program         "操作系统程序名称",
       s.logon_time      "时间"
  FROM v$locked_object l, all_objects o, v$session s
 WHERE l.object_id = o.object_id
   AND l.session_id = s.sid;
 
 --杀死 行锁
alter system kill session 'sid,serial#';	
或者
alter system kill session '会话标识符,会话序列号'; 
  1. Oracle 查询当前数据库获得 所有表名+表名注释
SELECT 
    a.TABLE_NAME,b.COMMENTS
FROM
    user_tables a,user_tab_comments b
WHERE 
    a.TABLE_NAME=b.TABLE_NAME
ORDER BY 
    TABLE_NAME 
  1. 删除重复数据并只保留一条数据
--查询重复数据
SELECT * FROM df0q where (aac001,adf001,adf089,aca111,adf072,adf073) in(select aac001,adf001,adf089,aca111,adf072,adf073 from df0q where aae100='1'  and adf001='16968' having count(1)>1 group by aac001,adf001,adf089,aca111,adf072,adf073) and aae100='1'  and adf001='16968' and aac001='865472' order by aac001

--删除重复数据并保留一条数据
delete from df0q where (aac001,adf001,adf089,aca111,adf072,adf073) in(select aac001,adf001,adf089,aca111,adf072,adf073 from df0q where aae100='1'  and adf001='16968' having count(1)>1 group by aac001,adf001,adf089,aca111,adf072,adf073) and rowid not in (SELECT min(rowid)  from df0q  having count(1)>1 group by aac001,adf001,adf089,aca111,adf072,adf073) and aae100='1'  and adf001='16968' 

  1. 同比、环比计算
--同比:
decode(nvl(LAG(SUM(B.studentJyCount), 12, 0)
                            OVER(PARTITION BY
                                 a.aab301 ORDER BY
                                 a.aae043),
                            0),
                        0,
                        0,
                        round((nvl(SUM(B.studentJyCount), 0) -
                              nvl(LAG(SUM(B.studentJyCount), 12, 0)
                                   OVER(PARTITION BY
                                        a.aab301
                                        ORDER BY a.aae043),
                                   0)) /
                              nvl(LAG(SUM(B.studentJyCount), 12, 0)
                                  OVER(PARTITION BY
                                       a.aab301 ORDER BY
                                       a.aae043),
                                  0),
                              4))
--环比:
decode(nvl(LAG(SUM(B.studentJyCount), 1, 0)
                            OVER(PARTITION BY
                                 a.aab301 ORDER BY
                                 a.aae043),
                            0),
                        0,
                        0,
                        round((nvl(SUM(B.studentJyCount), 0) -
                              nvl(LAG(SUM(B.studentJyCount), 1, 0)
                                   OVER(PARTITION BY
                                        a.aab301
                                        ORDER BY a.aae043),
                                   0)) /
                              nvl(LAG(SUM(B.studentJyCount), 1, 0)
                                  OVER(PARTITION BY
                                       a.aab301 ORDER BY
                                       a.aae043),
                                  0),
                              4))
  1. 查询某一时刻的数据(用于误删数据之后的操作)
select * from [表名] as of timestamp to_date('2021-09-07 18:29:27','yyyy-mm-dd hh24:mi:ss') where 1 = 2
  1. 时间戳转换为时间
SELECT to_char(1630339200000/(1000*60*60*24)+to_date('1970-01-01 08:00:00','YYYY-MM-DD HH:MI:SS'),'YYYY-MM-DD HH:MI:SS') AS CDATE FROM DUAL;
  1. ... fetch next [number] ...子句
--1. 获取前 N 行记录的示例(以下语句返回库存量最高的前 5 个产品:)
-- 以下查询语句仅能在Oracle 12c以上版本执行
SELECT
    product_name,
    quantity
FROM
    inventories
INNER JOIN products
        USING(product_id)
ORDER BY
    quantity DESC 
FETCH NEXT 5 ROWS ONLY;

--2. WITH TIES 示例(以下查询使用 WITH TIES 选项的行限制子句)
-- 以下查询语句仅能在Oracle 12c以上版本执行
SELECT
 product_name,
 quantity
FROM
 inventories
INNER JOIN products
 USING(product_id)
ORDER BY
 quantity DESC 
FETCH NEXT 10 ROWS WITH TIES;

--3. 以百分比限制返回行的示例(以下查询返回库存量最高的前 1% 的产品:)
-- 以下查询语句仅能在Oracle 12c以上版本执行
SELECT
    product_name,
    quantity
FROM
    inventories
INNER JOIN products
        USING(product_id)
ORDER BY
    quantity DESC 
FETCH FIRST 1 PERCENT ROWS ONLY;

--4. OFFSET 示例(以下查询将跳过库存量最高的前 10 个产品,并返回接下来的 10 个产品:)
-- 以下查询语句仅能在Oracle 12c以上版本执行
SELECT
 product_name,
 quantity
FROM
 inventories
INNER JOIN products
 USING(product_id)
ORDER BY
 quantity DESC 
OFFSET 10 ROWS 
FETCH NEXT 10 ROWS ONLY;
  1. LOCK TABLE语法

LOCK TABLE 语句的语法是:

LOCK TABLE tables IN lock_mode MODE [ WAIT [, integer] | NOWAIT ];

参数

  • tables:用逗号分隔的表格列表。
  • lock_mode:它是以下值之一:
lock_mode 描述
ROW SHARE 允许同时访问表,但阻止用户锁定整个表以进行独占访问。
ROW EXCLUSIVE 允许对表进行并发访问,但阻止用户以独占访问方式锁定整个表并以共享方式锁定表。
SHARE UPDATE 允许同时访问表,但阻止用户锁定整个表以进行独占访问。
SHARE 允许并发查询,但用户无法更新锁定的表。
SHARE ROW EXCLUSIVE 用户可以查看表中的记录,但是无法更新表或锁定SHARE表中的表。
EXCLUSIVE 允许查询锁定的表格,但不能进行其他活动。
  • WAIT:它指定数据库将等待(达到指定整数的特定秒数)以获取 DML 锁定。
  • NOWAIT:它指定数据库不应该等待释放锁。
  1. 列转行(unpivot
select 字段 from []
unpivot(自定义列名/*列的值*/ for 自定义列名 in(列名))

示例:

select stuname, coursename ,score from
score_copy  t
unpivot
(score for coursename in (英语,数学,语文))
  1. 行转列(PIVOT)
SELECT * FROM (数据查询集)
PIVOT 
(
 SUM(Score/*行转列后 列的值*/) FOR 
 coursename/*需要行转列的列*/ IN (转换后列的值)
)

示例:

select * from  (select c.stuname,
    b.coursename,
    t.score
from STUDENT.SCORE t, student.course b, student.stuinfo c
where t.courseid = b.courseid
and t.stuid = c.stuid )  /*数据源*/
PIVOT 
(
SUM(score/*行转列后 列的值*/) 
FOR coursename/*需要行转列的列*/ IN ('英语(2018上学期)' as 英语,'数学(2018上学期)' as 数学,'语文(2018上学期)' as 语文 )
) ;
  1. oracle分析函数_开窗函数详解
--Oracle分析函数的语法结构
select table.column, 
Analysis_function()OVER(
[partition by 字段]
[order by 字段 [windos]]
) as 统计值
from table

语法解析:

1、Analysis_function:指定分析函数名,常用的分析函数有sum、max、first_value、last_value、rank、row_number等等。

first_value:返回组中数据窗口的第一个值。

last_value:返回组中数据窗口的最后一个值。

max:返回组中的最大值

min:返回组中的最小值

ROW_NUMBER/RANK:根据开窗函数中排序的字段返回在组内的有序的偏移量,即可得到在组内的位置。

2、over():开窗函数名,partition by指定进行数据分组的字段,order by指定进行排序的字段,windos指定数据窗口(即指定分析函数要操作的行数),使用的语法形式大概如下:

over(partition by xxx order by yyy rows between zzz)
select c.stuname,
    b.coursename,
    t.score,
    --获取组中成绩最大值
    max(t.score) over(partition by t.courseid) as score_max,
    --获取组中成绩最小值
    min(t.score) over(partition by t.courseid) as score_min,
    --分组窗口的第一个值 (指定窗口为组中第一行到末尾行)
    first_value(t.score) over(partition by t.courseid 
    order by t.score desc ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as score_first,
    --分组窗口的最后一个值(指定窗口为组中第一行到末尾行)
    last_value(t.score) over(partition by t.courseid 
    order by t.score desc ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as score_last,
    
    --分组窗口的第一个值 (不指定窗口)
    first_value(t.score) over(partition by t.courseid order by t.score desc ) as score_first_1,
    --分组窗口的最后一个值(不指定窗口)
    last_value(t.score) over(partition by t.courseid order by t.score desc ) as score_last_1
     
from STUDENT.SCORE t, student.course b, student.stuinfo c
where t.courseid = b.courseid
and t.stuid = c.stuid
  1. 同义词(synonym)
--语法结构
--创建同义词
CREATE [OR REPLACE] [PUBLIC] SYSNONYM [当前用户.]synonym_name
FOR [其他用户.]object_name;
--删除同义词
DROP [PUBLIC] SYNONYM [用户.]sysnonym_name;
  1. 模糊查询(like)
select * from STUINFO t where t.stuname like '张%';

LIKE 关键字通过字符匹配检索出所需要的数据行。字符匹配操作可以使用通配符“%”和“_” :

  • 1、%:表示零个或者多个任意字符。
  • 2、_:代表一个任意字符。
  • 3、\:指转义字符,“%”在字符串中表示一个字符“%”。

你可能感兴趣的:(oracle,数据库,oracle,database)