Oracle
介绍
Oracle(甲骨文)公司核心产品
主要版本Oracle8i/9i、Oracle10g/11g
主要基于C/S系统结构
当前最流行的数据库
关键服务
OracleServiceORCL:核心服务(必须启动)
OracleOraDb11g_home1TNSListener: 监听器服务,核心服务,在使用远程访问或PL/SQL Developer工具时必须启动
OracleDBConsoleorcl:数据库控制台服务,需要使用企业管理器的时候必须启动
OracleMTSRecoveryService:恢复、闪回等操作需要开启该服务
OracleOraDb11g_home1ClrAgent:Oracle数据库.NET扩展服务的一部分。 (非必须启动)
操作工具
sqlplus
sql developer
plsql developer(第三方)
SQL命令
表空间
Oracle数据库由若干表空间构成,表空间由一到多个数据文件组成,每个数据文件只能属于同一表空间。
分类:
永久性表空间:一般保存表、视图、过程和索引等的数据
临时性表空间:只用于保存系统中短期活动的数据
撤销表空间:用来帮助回退未提交的事务数据
使用示例
--创建表空间示例,E盘需要先创建oracle_data目录,以存放数据文件
CREATE TABLESPACE ts_it
DATAFILE
'E:\oracle_data\tp_it01.dbf' SIZE 30M
AUTOEXTEND ON; --是否自动扩容
--查看表空间,tp_it名字得大写
SELECT file_name,tablespace_name,bytes,autoextensible
FROM dba_data_files
WHERE tablespace_name='TS_IT';
--调整ts_it表空间大小,向表空间内添加数据文件
ALTER TABLESPACE ts_it
ADD DATAFILE
'E:\oracle_data\tp_it29.DBF' SIZE 20M
AUTOEXTEND ON;
-- 删除ts_it表空间
DROP TABLESPACE ts_it;--只删除表空间
DROP TABLESPACE ts_it INCLUDING CONTENTS AND DATAFILES;--删除表空间及数据文件
用户与权限
sys用户:超级用户,主要用来维护系统信息和管理实例,以SYSDBA或SYSOPER角色登录。
system用户: 默认的系统管理员,拥有DBA权限,通常用来管理Oracle数据库的用户、权限和存储,以Normal方式登录。
scott用户:示范用户,使用users表空间。
数据操控语言
--创建表空间,以便新建用户时使用
CREATE TABLESPACE ts_it
DATAFILE
'E:\oracle_data\tp_it26.dbf' SIZE 30M
AUTOEXTEND ON next 20M;
/
--创建用户
CREATE USER user_it IDENTIFIED BY it
DEFAULT TABLESPACE ts_it
TEMPORARY TABLESPACE temp;
/
--查询user_it用户
SELECT *
FROM dba_users
WHERE username='USER_IT';
/
-- 给户user_it用户授权,回收权限
GRANT connect, resource TO user_it; --授予CONNECT和RESOURCE两个角色(讲解权限)
GRANT SELECT ON SCOTT.emp TO user_it; --允许用户查看 EMP 表中的记录(讲解模式)
GRANT UPDATE ON SCOTT.emp TO user_it; --允许用户更新 EMP 表中的记录
REVOKE connect, resource FROM user_it; --撤销CONNECT和RESOURCE两个角色
/
--修改密码
ALTER USER user_it identified by user10;
-- 删除用户
DROP USER user_it CASCADE;
--DROP TABLESPACE ts_it INCLUDING CONTENTS AND DATAFILES;--删除表空间及数据文件
数据类型
CHAR:存储固定长度的字符串,单字节字符,长度为1-2000.
VARCHAR2:存储可变长度的字符串,单字节字符,长度为1-4000。
NCHAR和NVARCHAR2:存储Unicode字符集类型(双字节字符),NCHAR长度为1-1000,NVARCHAR2长度为1-2000。
NUMBER:存储整数和浮点数,格式为NUMBER§或NUMBER(p, s),P为有效数位(小数点和-号不计),长度为1-38,s为小数点右边的数字位数。
DATE:存储日期和时间数据 ,设置格式:环境变量添加:nls_date_format的值为: YYYY-MM-DD HH24:MI:SS
VARCHAR、INTEGER、FLOAT、DOUBLE、lob(BLOB、CLOB、BFILE、NCLOB)
数据定义语言
主要是create\alter\truncate\drop的使用
使用示例
--创建学生表
CREATE TABLE student
(
stu_no CHAR(4) PRIMARY KEY NOT NULL, --学号,主键,非空
stu_name VARCHAR2(30) NOT NULL,--姓名,非空
stu_id VARCHAR2(18), --身份证号,代表18位整数
stu_age NUMBER(3,0) --年龄
);
--利用现有表创建新表,select 后边有多少字段,新表将有多少个字段,主键不会被创建,并且student表的数据也会被复制到新表
CREATE TABLE stu_info
AS SELECT stu_no,stu_age FROM student;
--修改student表,添加两个字段
ALTER TABLE student
ADD(
stu_seat NUMERIC(2,0),
stu_address VARCHAR2(20)
);
--修改student表字段的定义
ALTER TABLE student
MODIFY(
stu_name VARCHAR2(50),
stu_address VARCHAR2(100)
);
--删除student表中stu_ address和stu_seat列
ALTER TABLE student
DROP (stu_address,
stu_seat);
--修改student表字段名
ALTER TABLE student RENAME COLUMN stu_no TO rempno;
--删除student表结构及数据
DROP TABLE student;
--删除数据,不删除表结构,记录日志
delete from student
--只删除表数据,每条删除的记录不写日志,省资源,效律比delete高
truncate table student;
数据操纵语言
用于增删改查数据,主要是insert/update/select/delete的使用
--插入数据
insert into 表名(字段1,字段2...) values(值1,值2...);
commit; --提交
--把查询结果的数据添加到另一张表中。
Insert into 表名(字段1,字段2,字段3...) select 对应字段1,字段2,字段3... from student;
--修改数据
update 表名 set 字段名=修改后的值 where 条件;
commit;
--查询数据
select 字段名(*表示查所有字段) from 字段所在表名;
--查询时字段名前加distinct,表示不显示重复的数据
select distinct 字段名 from 字段所在表名
where --筛选条件
order by --排序
like --模糊查询
in --查询是否包含
group by --分组查询
having --用于判断聚合函数
() --子查询
--删除数据,写日志,数据可恢复
delete from 表名 where 条件
事务控制语言
commit; --提交事务
rollback; --回滚事务
savepoint;
rollback savepoint;
伪表与伪列
dual伪表,只有一行记录的表,没有主要数据,用于查询特定数据。
伪列,存储在每张表中,只能查询,不能操作
--从伪表中查询特定数据
selecr 123 from dual;
--查看伪列rowid
select rowid,* from 表名;
--查看伪列rownum
select rownum,* from 表名;
--伪列相当于一个标记,每一行记录都对应相应的rowid或rownum
运算符
算术运算符:+,-,*,/等
关系运算符:
=、!=、< 、 > 、<= 、>= 、 between…and… 、 in 、not in、 like 、 is null、is not null。
逻辑运算符:and,not,or
连接运算符:||(将两个字段内容连接起来)
集合运算符:union(并集,去除重复数据)
union all(并集,有重复数据)
intersect(交集,共有部分)
minus(减集,第一个查询具有,第二个查询不具有的数据)
常用函数
sum:求和
avg:求平均数
count:计数
max:求最大值
min:求最小值
一般聚合函数在having后判断。
Oracle删除重复数据
delete from 表名
where rowid not in(
SELECT min(rowid) FROM 表名 GROUP BY 可能数据会重复的字段的名称
);
转换函数
to_char:用来格式化日期或数值
-- 2020-09-24
select to_char(sysdate,'YYYY-MM-DD') from dual;
/*$2,300.10 数值不能大于格式的数值 2300.1<9999.00
或 22331.1<99999.00*/
select to_char(2300.1,'$9,999,00') from dual;
to_date:将日期格式的字符串转换为日期类型
select to_date('2020-09-24','YYYY-MM-DD') from dual;
to_number:将数值类型的字符串转换为数字
--19
select to_number('16')+3 from dual;
--19隐式转换
select '16'+3 from dual;
分析函数
跳跃排名:有两个最高分,一个第二高分。两个最高分就占用了两个位置并列第一,然后第二高分就是第三个位置,为第三名。示例(1,1,3)。
rank() over(partition by 字段名 order by 字段名)
可重复排名,按顺序排:两个最高分,一个第二高分。两个最高分占一个位置,并列第一,第二高分占第二个位置,为第二名。示例(1,1,2)。
dense_rank() over(partition by 字段名 order by 字段名)
只按顺序排名:两个最高分,一个第二高分。两个最高分系统分配一,二名两个位置,第二高分,为第三个位置。示例(1,2,3)。
row_number() over (partition by 字段名 order by 字段名)
partition by 分区
其它函数
nvl(字段名,自定义值):字段的值不为null,返回字段的值,否则返回自定义的值。
nvl2(字段名,自定义值1,自定义值2):字段的值不为null,返回值1,否则返回值2.
decode(字段名,值1,值11,值2,值22,其它值):字段的值等于值1,返回值11,字段的值等于值2,返回值22,否则返回其它值,可以有多个值参数。
索引
与表关联,可提供快速访问数据方式,也会降低增删改数据的效率。
常用类型(按不同的标准分类):单列索引和组合索引、唯一索引和非唯一索引。
create [unique] index 索引名 on 表名(表里面的字段名);
--创建单列唯一索引,这一列不能有重复数据
create unique index index_01 on 表名(字段名);
--创建单列非唯一索引
create index index_01 on 表名(字段名);
--创建组合列、唯一索引
create unique index index_01 on 表名(字段名1,字段名2);
--创建组合列、非唯一索引
create index index_01 on 表名(字段1,字段2);
--删除索引,删除表时也会把索引删除掉
drop index index_01;
序列
--语法
create sequence se_name(序列的名字)
[start with integer] (从几开始)
[increment by integer] (每次增加几)
[maxvalue integer|nomaxvalue] (最大值)
[minvalue integer|nominvalue] (最小值)
[nocycle|cycle]
[cache integer|nocache]
--示例
create sequence seq_test
start with 1
increment by 1
maxvalue 2000
nocycle
cache 30;
--使用方法
--第一次访问,获取初始值,随后访问按规则增长
select seq_test.nextval from dual;
--获取序列当前值,序列未进行第一次nextval时,不能使用currval
select seq_test.currval from dual;
--删除序列
drop sequence seq_test;
--sys_guid()函数,32位,由时间戳和机器标识符生成,保证在不同数据库是唯一
select sys_guid() from dual;
同义词
私有同义词:只能被当前模式下用户访问,不能与其它对象同名,需要具有create synonym权限.
--给表,列或者序列等创建同义词
create sysnonym 取一个名称 from [表名,列名,序列...]
--使用
select * from 名称;
--删除
drop sysnonym 名称;
公有同义词:公有同义词一般由管理员用户创建及删除,普通用户创建及删除需要create public synonym和drop public synonym权限。
使用方法大致和私有同义词相同,在sysnonym前加public即可。
分区表
oracle可以把表中的行分为不同部分,存储在不同的位置,每一部分称为一个分区,分区的表称为分区表。
好处,
安全:分区存放于不同的磁盘,减少同时损坏
查询:查询可按分区
管理:可按分区加载、删除
备份和恢复:针对分区备份与恢复,方便
使用:
数据量大的表,一般大于2GB;数据有明显的界限划分;对于Long和Long Raw类型列不能使用分区。
--示例,范围分区
partition by range (id) --(填字段名,通过那个字段来进行范围分区)
(
partition p1 values less than (3000), --区一,id小于3000
partition p2 values less than (5000) --区二,id小于5000
partition p3 values less than (maxvalue) --区三存储区一区二之外的数据(id>=5000)
);
--查询区三的所有数据
select * from 表名 partition(p3);
--删除区三的所有数据
delete from 表名 partition(p3);
--示例,列表分区
partition by list(address) --(字段名)
(
partition p1 values (字段的值),
partition p2 values (字段的值),
partition pn values (default)
);
/*
address是以其为基础创建列表分区的列。
p1..,pn是分区的名称。
字段的值是对应分区的分区键值的列表。
default关键字允许存储前面的分区不能存储的记录。
*/
PL/SQL
块结构语言,是sql语言的一种扩展,结合Oracle过程语言进行使用。由三部分组成:声明部分、执行部分、异常部分。
语法:
[DECLARE]
–声明变量等;
BEGIN
–程序主要部分,一般用来执行过程语句或SQL语句;
[EXCEPTION]
–异常处理;
END;
变量与常量
声明
变量名 数据类型[(SIZE)][:=初始化值];
常量名 constant 数据类型[(SIZE)]:=初始化值;
数据类型:CHAR(CHARATER,NCHAR),VARCHAR2,NUMBER(P,S),DATE,BOOLEAN等。
属性类型:%type与%rowtype。
%type:可以用来定义数据变量的类型与已定义的数据变量(表中的列)一致。
%rowtype:与某一数据库表的结构一致(修改数据库表结构,可以实时保持一致)访问方式声明为rowtype的变量名.字段名。
declare
--声明常量
test01 constant varchar2(20):='test';
--声明变量
test02 varchar2(10);
test03 number(3,0);
--设置变量属性与字段属性一致
--test02 表名.字段名%type;
--复制表结构
--test 表名%rowtype
begin
--通过从表中查出的数据给变量赋值
select test02,test03 into 字段1,字段2
from 表名
where ... --返回数据只能有一行,因为每个变量只有一个
test03:=222; --赋值方式二
DBMS_OUTPUT.PUT_LINE --输出结果
('1'||test01||'2'||test02);
end;
控制语句
条件控制
语法1:
if <boolean表达式> then
执行语句;
end if;
语法2:
if <boolean表达式 >then
执行语句;
else
执行语句;
end if;
语法3:
if <boolean表达式> then
执行语句;
elsif <boolean表达式> then
执行语句;
elsif <boolean表达式> then
执行语句;
else
执行语句;
end if;
循环控制
语法:
loop
执行语句;
exit when <条件语句>;
end loop;
while <布尔表达式> loop
执行语句;
end loop;
for 循环计数器 in [REVERSE] 下限…上限 loop
执行语句;
end loop;
说明:…两点表示范围,1…4表示时将从1到4进行循环,小(例如 1)写前边,REVERSE表示反转,循环时变成从4到1进行。
顺序控制
null语句:是一个可执行语句,相当于一个占位符或不执行操作的空语句。主要用来提高程序语句的完整性和程序的可读性。
goto语句。
异常处理
语法:
Exception
when 异常名 then
执行处理语句;
when 异常名 then
执行处理语句;
–使用others确保不会漏过任何异常,
when others then
执行处理语句;
经常配套使用的函数:
SQLCODE函数:返回错误代码,
SQLERRM函数:返回错误信息
预定义异常指PL/SQL 程序违反 Oracle 规则或超越系统限制时隐式引发(由oracle自动引发)。
常见的预定义异常:
ZERO_DIVIDE:以零作为除数时出现
DUP_VAL_ON_INDEX:试图将重复的值存储在使用唯一索引的数据库列中
INVALID_NUMBER:试图将一个非有效的字符串转换成数字
TOO_MANY_ROWS :在执行SELECT INTO语句后返回多行时出现
VALUE_ERROR:变量的值超出变量大小
CURSOR_ALREADY_OPEN:试图打开已经打开的游标
ACCESS_INTO_NULL:试图给一个没有初始化的对象赋值
LOGIN_DENIED :使用无效的用户名和口令登录Oracle
NO_DATA_FOUND :语句无法返回请求的数据
--可以自定义异常
declare
异常名 exception; --声明一个异常
begin
raise 异常名; --抛出异常
exception
when ZERO_DIVIDE then
处理语句;
when 异常名 then
处理语句;
when others then
处理语句;
end;
游标
概念:jdbc 执行sql后,增删改后的结果为整数,查询后结果—结果集rs。
游标是指oracle在执行增删改查操作时,会把执行结果放在内存分配的缓冲区中,游标就是指向该区的一个指针,借助游标,可以对结果(集)的数据分别进行处理。
游标属性:
%found 是否存在结果集或影响的行数,如果存在返回true
%notfound 是否存在结果集或影响的行数,如果不存在返回true
%rowcount 返回受影响的行数
%isopen 游标是否已经打开。隐式游标中一般是自动打开和关闭的,查询都返回False。
游标分隐式游标和显式游标
隐式游标自开自关。
--隐式游标名用sql代替,自开自关
--显式游标
declare
test1 表名.字段名%type;
cursor 游标名 is select * from 表名;
begin
--打开游标
open 游标名;
loop
fetch 游标名 into 字段名; --提取游标
exit when 游标名%notfound;
end loop;
close 游标名;
end;
存储过程与存储函数
存储过程类型:
1.不带参数2.带输入参数3.带输出参数4. 带输入输出参数
语法:
create [or replace] procedure procedure_name[(param_list)]
is|as
[declare]
begin
执行语句;
[exception]
异常处理;
end[procedure_name];
说明:
or replace:如果系统已存在该存储过程,将被替换
procedure_name:存储过程名称
param_list:参数列表,参数数据类型不需要声明长度,可选
declare:局部声明,可选
pl/sql块调用
begin
procedure_name(paramlist);
end;
示例有输出参和输入参
create or replace procedure p1(
test01 字段名%type;
test02 out number,
test03 out varchar2
)
is
begin
insert into 表名(字段1)
values(test01);
commit;
test03:='插入成功!';
exception
when DUP_VAL_ONO_INDEX then
test03:='信息已存在';
when others then
test03:=sqlerrm;
end;
--调用存储过程
declare
test02 number(5,0);
test03 varchar2(30);
begin
p1('1001',test02,test03);
dbms_output.put_line(test02||test03)
end;
--jdbc调用存储过程
--String sql="{call p1(?,?,?)}";
--Callablestatement cstmt=conn.prepareCall(sql);
--cstmt.setString(1,'1001');
--cstmt.registerOutParameter(2,oracle.jdbc.OracleTypes.NUMBER);
--cstmt.registerOutParameter(3,oracle.jdbc.OracleTypes.VARCHAR);
--cstmt.execute();
--int num=cstmt.getInt(2);
--String rs=cstmt.getString(3);
--删除存储过程
drop procedure p1;
存储函数
函数主要任务是在数据库层编写逻辑,但是和存储过程不同的是函数中可以写return子句。
语法:
create or replace function 函数名[(参数列表)]
return 数据类型
as
定义变量;
begin
执行语句;
return 返回的值;
end;
示例
create or replace function fun1(
var_name number,
var_name2 out number
)
return number
as
result number(4,0);
begin
select 字段2 into var_name2 from 表名 where 字段1=var_name;
select count(1) into result from 表名;
return result;
end;
--调用
declare
param1 number;
rs_num number;
begin
rs_num:=fun1("test",param1);
end;
程序包对象
程序包其实本质就是一个封装的过程,主要用于封装存储过程。包一般分为两个,包和包体。
语法:
创建包–
create or replace
package 包名 as
变量声明或声明包中的存储过程(procedure 存储过程名[(参数列表)]);
end 包名;
创建包体–
create or replace
package body 包名 as
procedure 存储过程名[(参数列表)] as
begin
业务逻辑
end 存储过程名;
end 包名;
存储过程与存储函数区别
1.返回值的区别,函数一定要有一个返回值或有多个通过输出参数的返回值,而存储过程是通过输出参数返回的,可以有多个或没有。
2.调用的区别,函数可以在sql语句中直接调用,存储过程必须单独调用。函数一般情况下是用来计算并返回一个计算结果,而存储过程一般是用来完成特定的数据操作。
触发器
触发器是在事件发生时隐式的自动运行的sql块,不能接受参数,不能被显示调用。一般监听的事件是数据的增删改。
语法:
create [or replace] trigger trigger_name
before|after
insert|delete|update
on 表名 [for each row]
pl/sql块;
示例
--删除表数据时,触发备份
create or replace trigger t1
before
delete on 表名
begin
insert into 备份表(字段1,字段2...)
select 字段1,字段2... from student;
end;
视图
Select * from table t ,table2 t2 。。。。经常用到的sql、复杂的sql保存起来-视图
语法:
create view 试图名 as 查询语句;
drop view 视图名;
试图也可以进行增删改
数据闪回
Oracle可以在删除之后进行数据和表对象的闪回,任何闪回技术和恢复技术都是基于系统的某一个时间点。
SCN:和系统的时间值一一对应,SCN可以作为恢复的时间点。
查看当前时间的SCN号:
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),timestamp_to_scn(sysdate) from dual;
使用管理员用户用命令行看undo表空间参数
sql> show parameter undo
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBSI
默认情况下有效的闪回时间为900s,但是管理员可以通过设置语句来修改闪回的有效值时间。单位是秒。
修改undo 表空间参数
alter system set undo_retention=1000 scope=both;
示例
--获取系统当前时间的scn
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),timestamp_to_scn(sysdate) from dual;
--删除数据
delete from 表名
--在900s内闪回数据
flashback table 表名 to scn scn号码;
数据备份与恢复
命令行:
//指定表备份
exp 用户名/密码@orcl(服务名) file=指定存储路径.tmp tables=(表名)
//完整备份
exp 用户名/密码@orcl file=指定存储路径.tmp full=y
//导出后可以删除表再进行恢复
//指定表恢复
imp 用户名/密码@orcl ignore=y file=存储文件所在地址 tables=(student)
多表联查
--两表联查,显示两表对应数据
select b1.*,b2.* from 表一 as b1,表二 as b2
where b1.对应字段=b2.对应字段;
--内联查询,显示两表对应数据
select b1.*,b2.* from 表一 b1
inner join 表二 b2
on b1.对应字段=b2.对应字段
--左外连接,左表数据显示完全,右表只显示对应数据
select b1.*,b2.* from 表一 b1
left join 表二 b2
on b1.对应字段=b2.对应字段
--右外连接,右表数据显示完全,左表只显示对应数据
select b1.*,b2.* from 表一 b1
right join 表二 b2
on b1.对应字段=b2.对应字段