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)
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(数据库名称)';
注意:远程数据库密码若出现特殊字符,必须用双引号括起来
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
存储过程的三中参数模式: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]
begin
pl/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函数
--简单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
FOR 表1 IN (
SELECT [匹配字段],[更新字段] FROM A表
) loop
UPDATE B表
SET B表.[需要更新字段]= 表1.[更新字段];
WHERE
B表.[匹配字段]= 表1.[匹配字段];
END loop ;
注意:
- 表1 为虚拟表,不需要创建,且其数据与 in() 括号里面的数据一致
- B 表表示需要更新的数据库表,且 A 与 B 均为数据库表
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 条件下有唯一索引的时候,效率更高。
--创建嵌套表类型
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号公变','[^/]+');
select sys_context('userenv','ip_address') AS a from dual;
SELECT USER, sys_context('userenv','ip_address') AS loginIP,sysdate AS logintime FROM dual;
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
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_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;
-- 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;
begin
dbms_job.submit(jobno,'程序;',sysdate,'sysdate+1/24');
commit;
end;
-- 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
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
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
--查找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 '会话标识符,会话序列号';
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
--查询重复数据
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 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))
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以上版本执行
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;
LOCK TABLE 语句的语法是:
LOCK TABLE tables IN lock_mode MODE [ WAIT [, integer] | NOWAIT ];
参数
lock_mode | 描述 |
---|---|
ROW SHARE | 允许同时访问表,但阻止用户锁定整个表以进行独占访问。 |
ROW EXCLUSIVE | 允许对表进行并发访问,但阻止用户以独占访问方式锁定整个表并以共享方式锁定表。 |
SHARE UPDATE | 允许同时访问表,但阻止用户锁定整个表以进行独占访问。 |
SHARE | 允许并发查询,但用户无法更新锁定的表。 |
SHARE ROW EXCLUSIVE | 用户可以查看表中的记录,但是无法更新表或锁定SHARE 表中的表。 |
EXCLUSIVE | 允许查询锁定的表格,但不能进行其他活动。 |
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分析函数的语法结构
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
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、\:指转义字符,“%”在字符串中表示一个字符“%”。