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:设置缓冲区,默认为4kimpdp 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 rowwhen(new.[primaryKey] is null)beginselect [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 dualWHERE (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)
- 事务的传播属性:
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的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就说,该级别可以阻止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。
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 就是这条记录的根节点了
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(数据库名称)';
注意:远程数据库密码若出现特殊字符,必须用双引号括起来
- 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]BEGINcode[EXCEPTION]exception_handlers]END存储过程的三中参数模式:IN、 OUT 、IN 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 中间编写的就是存储过程的具体操作。
- 触发器使用:
触发器的语法:
create [or replace] tigger 触发器名 触发时间 触发事件
on 表名
[for each row]
beginpl/sql语句
end
其中:
触发器名:触发器对象的名称。由于触发器是数据库自动执行的,因此该名称只是一个名称,没有实质的用途。
触发时间:指明触发器何时执行,该值可取:
before:表示在数据库动作之前触发器执行;
after:表示在数据库动作之后触发器执行。
触发事件:指明哪些数据库动作会触发此触发器:
insert:数据库插入会触发此触发器;
update:数据库修改会触发此触发器;
delete:数据库删除会触发此触发器。
表 名:数据库触发器所在的表。
for each row:对表的每一行触发器执行一次。如果没有这一选项,则只对整个表执行一次。
触发器能实现如下功能:
1、 允许/限制对表的修改
2、 自动生成派生列,比如自增字段
3、 强制数据一致性
4、 提供审计和日志记录
5、 防止无效的事务处理
6、 启用复杂的业务逻辑
- 批量删除表
--查看
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 命令行中执行
- 授权
--授予用户 SKCT 查询 XJJY 下的CC03表的查询权限。
grant select on XJJY.CC03 to SKCT;
- CASE WHEN 的用法
--Case when 的用法,简单Case函数
--简单CASE表达式,使用表达式确定返回值.--语法:CASE search_expressionWHEN expression1 THEN result1WHEN expression2 THEN result2WHEN expressionN THEN resultNELSE default_result--搜索CASE表达式,使用条件确定返回值.--语法:CASEWHEN condition1 THEN result1WHEN condistion2 THEN result2WHEN condistionN THEN resultNELSE default_resultEND
- FOR IN LOOP 循环更新的用法
FOR 表1 IN (
SELECT [匹配字段],[更新字段] FROM A表) loop
UPDATE B表
SET B表.[需要更新字段]= 表1.[更新字段];
WHEREB表.[匹配字段]= 表1.[匹配字段];
END loop ;
注意:
- 表1 为虚拟表,不需要创建,且其数据与 in() 括号里面的数据一致
- B 表表示需要更新的数据库表,且 A 与 B 均为数据库表
- 存在时 -> 更新,不存在时 -> 插入:MERGE INTO USING ON
MERGE INTO 目标表 a
USING 源表 bON (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 条件下有唯一索引的时候,效率更高。
- 嵌套表
--创建嵌套表类型
CREATE OR REPLACE TYPE 嵌套表 AS TABLE OF 基类;--创建嵌套表的基类型
CREATE OR REPLACE TYPE 基类 AS OBJECT ([字段] 字段类型,[字段] 字段类型,[字段] 字段类型,...);
意义:
此表具有该类型和member方法的所有属性,我们不能通过DBA STUDIO的表数据编辑器来编辑数据。
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]+');
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]+') 以笛卡尔积的方式来计算
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号公变','[^/]+',1,4) 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临时Ⅰ段母线/台变/新坝村公变/变压器区域/变压器间隔/新坝村公变','[^/]+',1,4) 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号公变','[^/]+');
- 获取当前 IP 地址
select sys_context('userenv','ip_address') AS a from dual;
- 获取当前用户及 IP 地址
SELECT USER, sys_context('userenv','ip_address') AS loginIP,sysdate AS logintime FROM dual;
- 获取当前操作及用户
SELECT sql_text, last_load_time FROM v$sqlSELECT sql_text,parsing_schema_name,service,action,last_load_time,last_active_time FROM v$sql ORDER BY last_load_time DESC
- 空表处理
select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0;
- 查看存储过程最近修改记录信息
SELECT *
FROM USER_OBJECTS
WHERE OBJECT_NAME = '存储过程包名';SELECT *
FROM sys.ALL_OBJECTS
WHERE OBJECT_NAME = '存储过程包名';
- 物化视图
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';
- 创建已知字段表:
--与原表的表结构相同,但是不添加原来表中的数据
CREATE TABLE [新表名] AS SETLECT * FROM [已有表名] WHERE 1 = 2;-- 与原表的表结构相同,并添加原表中的数据
CREATE TABLE [新表名] AS SETLECT * FROM [已有表名];
- 删除表空间
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_BYTESFROM SYS.DBA_FREE_SPACEGROUP BY TABLESPACE_NAME) F,(SELECT DD.TABLESPACE_NAME,ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MBFROM SYS.DBA_DATA_FILES DDGROUP BY DD.TABLESPACE_NAME) DWHERE D.TABLESPACE_NAME = F.TABLESPACE_NAMEORDER BY 4 DESC;
- 通用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块 |
- 查看字段存在的数据库表:
select table_name from user_tab_columns where column_name = '字段名';
- 查看
sql
脚本执行的历史记录:
select * from v$sqlarea order by last_load_time desc;
- 定时器创建:
declare jobno number;
begindbms_job.submit(jobno,'程序;',sysdate,'sysdate+1/24');commit;
end;
- 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
- Oracle 查询当前数据库获得 所有表名+表名注释
SELECT a.TABLE_NAME,b.COMMENTS
FROMuser_tables a,user_tab_comments b
WHERE a.TABLE_NAME=b.TABLE_NAME
ORDER BY TABLE_NAME
- Oracle将多个结果集用逗号拼接成字符串:
LISTAGG([结果集],',') within group(order by [字段名])
select LISTAGG(b.aac002,',') within group(order by b.aac002) as aac002s,c.aab001from cc03 a, ac01 b ,df01 cwhere 1 = 1and a.aac001 = b.aac001and a.aab001 = c.aab001and a.aae100 = '1'and a.yae421='1'and c.adf001 = #{adf001}group by c.aab001
- 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 sWHERE l.object_id = o.object_idAND l.session_id = s.sid;--杀死 行锁
alter system kill session 'sid,serial#';
或者
alter system kill session '会话标识符,会话序列号';
- Oracle 查询当前数据库获得 所有表名+表名注释
SELECT a.TABLE_NAME,b.COMMENTS
FROMuser_tables a,user_tab_comments b
WHERE a.TABLE_NAME=b.TABLE_NAME
ORDER BY TABLE_NAME
- 删除重复数据并只保留一条数据
--查询重复数据
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'
- 同比、环比计算
--同比:
decode(nvl(LAG(SUM(B.studentJyCount), 12, 0)OVER(PARTITION BYa.aab301 ORDER BYa.aae043),0),0,0,round((nvl(SUM(B.studentJyCount), 0) -nvl(LAG(SUM(B.studentJyCount), 12, 0)OVER(PARTITION BYa.aab301ORDER BY a.aae043),0)) /nvl(LAG(SUM(B.studentJyCount), 12, 0)OVER(PARTITION BYa.aab301 ORDER BYa.aae043),0),4))
--环比:
decode(nvl(LAG(SUM(B.studentJyCount), 1, 0)OVER(PARTITION BYa.aab301 ORDER BYa.aae043),0),0,0,round((nvl(SUM(B.studentJyCount), 0) -nvl(LAG(SUM(B.studentJyCount), 1, 0)OVER(PARTITION BYa.aab301ORDER BY a.aae043),0)) /nvl(LAG(SUM(B.studentJyCount), 1, 0)OVER(PARTITION BYa.aab301 ORDER BYa.aae043),0),4))
- 查询某一时刻的数据(用于误删数据之后的操作)
select * from [表名] as of timestamp to_date('2021-09-07 18:29:27','yyyy-mm-dd hh24:mi:ss') where 1 = 2
- 时间戳转换为时间
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;
... fetch next [number] ...
子句
--1. 获取前 N 行记录的示例(以下语句返回库存量最高的前 5 个产品:)
-- 以下查询语句仅能在Oracle 12c以上版本执行
SELECTproduct_name,quantity
FROMinventories
INNER JOIN productsUSING(product_id)
ORDER BYquantity DESC
FETCH NEXT 5 ROWS ONLY;--2. WITH TIES 示例(以下查询使用 WITH TIES 选项的行限制子句)
-- 以下查询语句仅能在Oracle 12c以上版本执行
SELECTproduct_name,quantity
FROMinventories
INNER JOIN productsUSING(product_id)
ORDER BYquantity DESC
FETCH NEXT 10 ROWS WITH TIES;--3. 以百分比限制返回行的示例(以下查询返回库存量最高的前 1% 的产品:)
-- 以下查询语句仅能在Oracle 12c以上版本执行
SELECTproduct_name,quantity
FROMinventories
INNER JOIN productsUSING(product_id)
ORDER BYquantity DESC
FETCH FIRST 1 PERCENT ROWS ONLY;--4. OFFSET 示例(以下查询将跳过库存量最高的前 10 个产品,并返回接下来的 10 个产品:)
-- 以下查询语句仅能在Oracle 12c以上版本执行
SELECTproduct_name,quantity
FROMinventories
INNER JOIN productsUSING(product_id)
ORDER BYquantity DESC
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY;
- 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:它指定数据库不应该等待释放锁。
- 列转行(
unpivot
)
select 字段 from [表]
unpivot(自定义列名/*列的值*/ for 自定义列名 in(列名))
示例:
select stuname, coursename ,score from score_copy t unpivot (score for coursename in (英语,数学,语文))
- 行转列(
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 语文 ) ) ;
- 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_1from STUDENT.SCORE t, student.course b, student.stuinfo c where t.courseid = b.courseid and t.stuid = c.stuid
- 同义词(
synonym
)
--语法结构
--创建同义词
CREATE [OR REPLACE] [PUBLIC] SYSNONYM [当前用户.]synonym_name
FOR [其他用户.]object_name;
--删除同义词
DROP [PUBLIC] SYNONYM [用户.]sysnonym_name;
- 模糊查询(
like
)
select * from STUINFO t where t.stuname like '张%';
LIKE 关键字通过字符匹配检索出所需要的数据行。字符匹配操作可以使用通配符“%”和“_” :
- 1、%:表示零个或者多个任意字符。
- 2、_:代表一个任意字符。
- 3、\:指转义字符,“%”在字符串中表示一个字符“%”。
Oracle 数据库操作相关推荐
- oracle的操作大全,Oracle数据库操作大全(六)Oracle中操作数据
Java连接数据库方法2,(方法1见:Oracle数据库操作大全(五)) 使用jdbc连接Oracle( 可远程连接 ) ***1.加载驱动 Class.forName("oracle.jd ...
- python从oracle提取数据库_Python编程实战之Oracle数据库操作示例
本文实例讲述了Python编程实战之Oracle数据库操作.分享给大家供大家参考,具体如下: 1. 要想使Python可以操作Oracle数据库,首先需要安装cx_Oracle包,可以通过下面的地址来 ...
- freecplus框架-Oracle数据库操作
文章目录 一.源代码说明 二.概述 三.connection类 四.sqlstatement类 五.程序流程 1.无结果集SQL的程序的流程 2.有结果集SQL的程序的流程 六.示例程序 1.创建超女 ...
- oracle数据库操作文档,oracle数据库操作
关于oracle数据库操作,基本的sql语句 一,约束操作 1:更改约束名称: ALTER TABLE TName RENAME CONSTRAINT oldname TO newname; 2:删除 ...
- 基于OCILIB的oracle数据库操作总结及自动生成Model和Dao的工具
基于OCILIB的oracle数据库操作总结 1. 类图 2. 基类BaseOCIDao的设计与实现 BaseOCIDao.h头文件 #pragma once/* ------ ...
- Oracle数据库操作基本語法
一.Oracle数据库操作 1.创建数据库 create database databasename 2.删除数据库 drop database dbname 3.备份数据库 完全 ...
- 11.freecplus框架-Oracle数据库操作
文章目录 一.源代码说明 二.概述 三.connection类 四.sqlstatement类 五.程序流程 1.无结果集SQL的程序的流程 2.有结果集SQL的程序的流程 六.示例程序 1.创建超女 ...
- Java从入门到精通——数据库篇之JAVA中的对Oracle数据库操作
在Java中对Oracle数据库的操作分为两种:一.查询.二.非查询. 下面是我对其进行总结: 一.查询数据 /** * 根据用户代码查询* @param userId* @return 如果存在返回 ...
- 循序渐进Python3(十二) --2-- web框架之django简单实现oracle数据库操作
在 Django 中构建 Oracle 数据库支持的 Web 应用程序 了解如何配置 Django 以便与 Oracle 数据库交互,并使用 ORM 进行数据库连接. 产能在软 ...
- Linux系统中安装Oracle 数据库操作
我的centos7是在virtualbox下安装的,安装Oracle安装了好久好久,现将详细操作步骤写下来. 一.安装的硬件要求 1.内存: 要求:内存最小1G,推荐2G或者更高.呃呃呃 查看命令:# ...
最新文章
- Redis第一集:Windows下安装Redis和测试
- [拓扑排序/强联通分量] [NOIP201402] 信息传递
- mysql 5.7 初始化数据库_MySQL 5.7 新特性之初始化
- strstr和strcchr查找字符串和区别
- oracle10g 克隆安装,克隆Oracle Home(10g2)
- elasticsearch集群搭建-windows
- 【转】.net框架读书笔记---CLR内存管理\垃圾收集(二)
- C# 实现在线软件自动升级自动下载更新文件
- php中下载csv文件怎么打开,php对csv文件的读取,写入,输出下载操作详解
- python os 遍历 子目录中所有文件_Python处理文件系统的10种方法 !
- jQuery DOM操作之查找结点
- DEM数据如何生成高程点
- DSP应用技术(第一章)
- 网络准入系统,防病毒网关,统一威胁管理,堡垒主机,漏洞扫描
- 写作技巧~100段作文排比句(81-100段),考试一定用得上,赶紧收藏!
- 猜拳php代码,微信猜拳游戏源码
- word 插入背景 在背景上写字
- Atitit 管理的模式扁平化管理 金字塔 直线型管理 垂直管理 水平管理 矩阵式管理 网状式样管理 多头管理 双头管理...
- 公众号扫描二维码(前端uniapp、后端java)
- c/c++函数参数的缺省值使用要点: