2020-09-22 Oracle11g学习

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.对应字段

猜你喜欢

转载自blog.csdn.net/weixin_44158992/article/details/108732272