Oracle相关操作知识
岁月如梦 Lv4

ORACLE 基础

ORACLE 数据库具有以下特点:

支持多用户、大事务量的事务处理
数据安全性和完整性控制
支持分布式数据处理
可移植性

ORACLE 体系结构

  • 数据库
  • 实例
  • 数据文件(dbf)
  • 表空间
  • 用户

在这里插入图片描述
image

创建表空间

1
2
3
4
5
6
7
8
9
10
11
create tablespace waterboss
datafile '+DATA/prod/datafile/spacse_name.dbf'
size 100m
autoextend on
next 10m

--waterboss 为表空间名称
--datafile 用于设置物理文件名称
--size 用于设置表空间的初始大小
--autoextend on 用于设置自动增长,如果存储量超---过初始大小,则开始自动扩容
--next 用于设置扩容的空间大小

oracle迁移表空间数据文件

迁移非关键数据表空间数据文件方案:

1
2
3
4
alter tablespace BATRISKTS offline;
--cp 原数据文件 新路径/数据文件
alter tablespace BATRISKTS rename datafile '原数据文件' to '新数据文件';
alter tablespace BATRISKTS online;

删除表空间:

1
2
3
4
Drop tablespace 表空间名 including contents and datafiles;(所有数据及文件)
例子:Drop tablespace epoint including contents and datafiles;
查询所有表空间:
SELECT * FROM dba_tablespaces;

创建用户

1
2
3
4
5
6
7
create user wateruser
identified by itcast
default tablespace waterboss

--wateruser 为创建的用户名
--identified by 用于设置用户的密码
--default tablesapce 用于指定默认表空间名称
  • 默认系统账号:
1
2
SYS:拥有SYSDBA权限,可以关闭启动oracle,只能以SYSDBA或SYSPOPER登录
SYSTEM:DBA权限,只能以Normal登录,管理数据库
  • oracle的别名需小心使用,因为有顺序,有时候无法引用。
1
2
顺序:from  join  on  where group by  having  
select order by limit

用户赋权

1
grant dba to wateruser
  • 用户与权限
1
2
3
4
Oracle角色权限分类:
Connect:只能登录,无法操作
Resource:可以在自己的模式下操作对象
DBA:拥有全部权限,只有DBA才可以创建数据库结构

表的创建、修改与删除

Oracle创建表时,约束索引需要单独创建,不能和表一起创建。

创建表

1
2
3
4
5
CREATE TABLE 表名称(
字段名 类型(长度) primary key,
字段名 类型(长度),
.......
);

数据类型:

  • 字符型

CHAR : 固定长度的字符类型,最多存储 2000 个字节
VARCHAR2 :可变长度的字符类型,最多存储 4000 个字节
LONG : 大文本类型。最大可以存储 2 个 G

  • 数值型

NUMBER : 数值类型
例如:NUMBER(5) 最大可以存的数为 99999
NUMBER(5,2) 最大可以存的数为 999.99

  • 日期型

DATE:日期时间型,精确到秒
TIMESTAMP:精确到秒的小数点后 9 位

  • 二进制型(大数据类型)

CLOB : 存储字符,最大可以存 4 个 G
BLOB:存储图像、声音、视频等二进制数据,最多可以存 4 个 G

修改表

1.增加字段

1
ALTER TABLE 表名称 ADD(列名 1 类型 [DEFAULT 默认值],列名 1 类型 [DEFAULT 默认值]…)

2.修改字段

1
ALTER TABLE 表名称 MODIFY(列名 1 类型 [DEFAULT 默认值],列名 1 类型 [DEFAULT 默认值]…)

3.修改字段名

1
ALTER TABLE 表名称 RENAME COLUMN 原列名 TO 新列名

4.删除字段名

1
ALTER TABLE T_OWNERS DROP COLUMN REMARK

5.删除表

1
drop table 表名称

数据增删改

1
2
3
4
INSERT INTO 表名[(列名 1,列名 2,…)]VALUES(值 1,值2,…) ;
UPDATE 表名 SET 列名 1=值 1,列名 2=值 2,…WHERE 修改条件;
DELETE FROM 表名 WHERE 删除条件;
TRUNCATE TABLE 表名称;---- 清空表数据

比较 truncat 与 delete 实现数据删除?

1
2
3
delete 删除的数据可以 rollback
delete 删除可能产生碎片,并且不释放空间
truncate 是先摧毁表结构,再重构表结构

触发器:

1
2
3
4
5
要素:
1.事件类型(增删改)
2.触发事件:事件类型前后(before,after)
3.触发对象:表中的每一条记录(行),即整张表
作用:保证数据一致,基于某个表的变动在其他表记录,计算列的值或更新时间戳

语法(mysql):

1
2
3
4
5
6
7
8
9
10
11
Create trigger 触发器名 {before|after {insert|update|delete} on 表名 for each row  begin  触发器执行的sql语句  end;}

触发器名称:64个字符(t或者tri开头)
{before|after}:触发器执行的时间,事件发生前后
{insert|update|delete}:触发的事件是什么
表名:触发器属于那个表
for each row:触发器的执行间隙,for each row子句通知触发器,每行执行一次动作
Sql语句:事件触发时需要执行的sql语句
New:表示将要或已经插入的数据或将要已经被修改的数据
Old:被修改之前的数据或被删除之前的数据
另外old是只读的,而new可以在触发器中使用set赋值且不会触发触发器,造成循环调用。

插入操作:(插入的数据的行的字段改为大写)

1
2
3
4
5
6
Create trigger tri_customer_state 
before
insert on customers
for each
row beginSet new.cust.state=Upper(new.cust.state)
end

更新操作:(如果更新了,则记录在日志)

1
2
3
4
5
6
7
8
9
Create trigger tri_custname_update
after update on customers
for each
row beginIf new.cust_name != old.cust_name(数据修改了)
then
insert into cust_log
values(old.cust_name,new.cust_name,now());
end if;
end

序列(oracle):

mysql实现自增:

1
create table a(id int not null auto_increment,....primary key(id));

oracle序列语法

Oracle提供sequence对象,由系统提供自增长的序列号

1
2
3
4
5
6
7
Create sequence 序列名 [increment by n] [start with n] [maxvalue/minvalue n|nomaxvalue][cycle | nocycle] [cache n | nocache];

1.increment by :定义序列的步长,不写则为1,为负则递减
2.start with:序列的初始值,默认1
3.maxvalue/minvalue:定义序列能产生的最大最小值,默认nomaxvalue则无限制
4.cycle | nocycle:表示序列生成到限制值是否循环,循环(cycle)则从最小序列开始
5.cache n | nocache:定义存放序列的内存大小,默认20,nocache则不进行内存缓存,内存缓冲可以改善序列的性能

创建序列:

1
2
3
Create sequence seq_test increment by 1 minvalue 1 start with 1 maxvalue 9999 cache 50;
获取序列当前值:select seq_test.currval from dual;(dual虚拟表)
获取序列的下一个值:select seq_test.nextval from dual;

Oricle实现自增:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
创建序列:
CREATE SEQUENCE Tab_UserInfo_Sequence
START WITH 1 MINVALUE 1 MAXVALUE 999999999
INCREMENT BY 1 cache 20;

创建使用自增序列的表:
CREATE TABLE UserInfo(id number(10) NOT NULL,username varchar2(15) NOT NULL,password varchar2(15) NOT NULL,CONSTRAINTS PF_UserInfo PRIMARY key(id));

使用触发器对表实现自增:
CREATE TRIGGER Tig_UserInfo_insert
BEFORE INSERT ON UserInfo FOR EACH ROW
when(NEW.id IS null)
BEGIN
SELECT Tab_UserInfo_Sequence.nextval INTO:NEW.id FROM dual;
END

关于事务

事务:访问或更新数据库数据项的一个程序执行单元,关系型数据库中表现为一条或是一组SQL语句

1
2
3
4
特性:
①要么什么都做,要么什么都不做;
②一个事务的执行与其他事务互不影响
③一旦事务提交数据就具有持久性,其他程序或是故障部队其产生任何影响

事务提交:commit

1
2
commit;
(表示程序全部完成不出现任何故障)

回滚数据:rollback

1
2
rollback; 
回滚在没commit之前可以回滚程序到初始保存状态

如何设置事务的保存点

1
2
savepoint(sp1);
--保存点后面的所有数据在执行回滚后都将失效,而在它之前的都将保留

如何回滚到指定的保存点

1
rollback to sp1;

数据导出与导入

整库导出与导入

整库导出命令

1
exp system/itcast full=y 或者 exp system/itcast file=文件名 full=y

整库导入命令

1
imp system/itcast full=y or imp system/itcast full=y file=water.dmp

按用户导出与导入

按用户导出

1
exp system/itcast owner=wateruser file=wateruser.dmp

按用户导入

1
imp system/itcast file=wateruser.dmp fromuser=wateruser

按表导出与导入

按表导出

1
exp wateruser/itcast file=a.dmp tables=t_account,a_area

按表导入

1
imp wateruser/itcast file=a.dmp tables=t_account,a_are

ORACLE 查询

单表查询

简单条件查询

1
2
3
4
5
6
7
精确查询 select * from T_OWNERS where watermeter=‘30408’
模糊查询 select * from t_owners where name like ‘%刘%’
and 运算符 select * from t_owners where name like ‘%刘%’ and housenumber like ‘%5%’
or 运算符 select * from t_owners where name like ‘%刘%’ or housenumber like ‘%5%’
and 与 or 运算符混合使用 select * from t_owners where (name like ‘%刘%’ or housenumber like ‘%5%’) and addressid=3
范围查询 select * from T_ACCOUNT where usenum>=10000 and usenum<=20000
空值查询 select * from T_PRICETABLE t where maxnum is null

去掉重复记录

1
select distinct addressid from T_OWNERS

排序查询

1
2
升序排序 select * from T_ACCOUNT order by usenum
降序排序 select * from T_ACCOUNT order by usenum desc

基于伪列的查询

1
2
ROWID 具体某一行数据的物理地址 select rowID,t.* from T_AREA t
ROWNUM 每一行的行号,查询后才会标注 select rownum,t.* from T_OWNERTYPE t

聚合统计

聚合函数

1
2
3
4
5
6
7
8
9
10
11
12
13
sum* select sum(usenum) from t_account where year=‘2012’

avg* select avg(usenum) from T_ACCOUNT where year=‘2012’

max* select max(usenum) from T_ACCOUNT where year=‘2012’

select* min(usenum) from T_ACCOUNT where year=‘2012’

count* select count(*) from T_OWNERS t where ownertypeid=1

分组聚合 Group by* select areaid,sum(money) from t_account group by areaid

分组后条件查询 having* select areaid,sum(money) from t_account group by areaid having sum(money)>169000

连接查询

多表内连接查询

  • 查询显示业主编号,业主名称,业主类型名称
1
2
3
select o.id 业主编号,o.name 业主名称,ot.name 业主类型
from T_OWNERS o,T_OWNERTYPE ot
where o.ownertypeid=ot.id
  • 查询显示业主编号,业主名称、地址和业主类型
1
2
3
4
select o.id 业主编号,o.name 业主名称,ad.name 地址,
ot.name 业主类型
from T_OWNERS o,T_OWNERTYPE ot,T_ADDRESS ad
where o.ownertypeid=ot.id and o.addressid=ad.id
  • 查询显示业主编号、业主名称、地址、所属区域、业主分类
1
2
3
4
 select o.id 业主编号,o.name 业主名称,ar.name 区域, ad.name 地址, ot.name 业主类型
from T_OWNERS o ,T_OWNERTYPE ot,T_ADDRESS ad,T_AREA ar
where o.ownertypeid=ot.id and o.addressid=ad.id and
ad.areaid=ar.id
  • 查询显示业主编号、业主名称、地址、所属区域、收费员、业主分类
1
2
3
4
5
6
select ow.id 业主编号,ow.name 业主名称,ad.name 地址,
ar.name 所属区域,op.name 收费员, ot.name 业主类型
from T_OWNERS ow,T_OWNERTYPE ot,T_ADDRESS ad ,
T_AREA ar,T_OPERATOR op
where ow.ownertypeid=ot.id and ow.addressid=ad.id
and ad.areaid=ar.id and ad.operatorid=op.id

左外连接查询

  • 查询业主的账务记录,显示业主编号、名称、年、月、金额。如果此业主没有账务记录也要列出姓名 SQL1999标准:
1
2
3
4
SELECT ow.id,ow.name,ac.year ,ac.month,ac.money
FROM T_OWNERS ow left join T_ACCOUNT ac
on ow.id=ac.owneruuid

视图的创建与查询:

1
2
Create view view_user as select id,name,age from user;(创建视图)
Select * from view_user;(查询视图)

Oracle数据类型:

1
2
3
4
5
6
7
8
Number(p,s):1-22字节,p表示有效数字的位数(38),s表示精度,正则约束小数位数,负则约束整数小数点左边几位位数四舍五入。都不指定,则都取最大值。p默认为38,如果只指定p那s默认为0。
Integer:1-22字节,存储整数(有小数则四舍五入)
Char(n): 固定长度,0-2000字节(字符串类型)
Varchar2(N):可变长,0-4000字节
Date:7字节(日期类型),可精确到秒
Timestasmp:7字节,可精确到纳秒(9位)
Blob:(大字段类型),最大32TB,存储非结构化二进制数据
Clob:4GB,存储大文本数据

JDBC 连接 ORACLE

//加载驱动

1
2
3
4
5
6
7
8
9
10
11
12
13
static{
try {
Class.forName("oracle.jdbc.driver.OracleDriver"); Class.forName("oracle.jdbc.driver.OracleDriver");
catch (ClassNotFoundException e) {
e.printStackTrace(); e.printStackTrace();
}
}


// 获取数据库连接
public static java.sql.Connection getConnection() throwsSQLException{
return java.sql.DriverManager.getConnection("jdbc:oracle:thin:@192.168.80.10:1521:orcl","wateruser", "itcast");
}}

JDBC 驱动为:

1
oracle.jdbc.OracleDriver

连接字符串( 瘦连接 ):

1
jdbc:oracle:thin:@服务器的 IP:1521:orcl
 请作者喝咖啡
 评论
评论插件加载失败
正在加载评论插件