Oracle 总结

ORACLE 体系结构

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

创建表空间

create tablespace waterboss
datafile 'c:\waterboss.dbf'
size 100m
autoextend on
next 10m

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

创建用户

create user wateruser
identified by itcast
default tablespace waterboss

wateruser 为创建的用户名
identified by 用于设置用户的密码
default tablesapce 用于指定默认表空间名称

--用户赋权
grant dba to wateruser

数据导出与导入

整库导出与导入

--整库导出命令
exp system/abc123 full=y 或者 exp system/abc123 file=文件名 full=y

--整库导入命令
imp system/abc123 full=y or imp system/abc123 full=y file=water.dm

按用户导出与导入

--按用户导出
exp system/itcast owner=wateruser file=wateruser.dmp

--按用户导入
imp system/itcast file=wateruser.dmp fromuser=wateruser

按表导出与导入

--按表导出 
exp wateruser/itcast file=a.dmp tables=t_account,a_area

--按表导入 
imp wateruser/itcast file=a.dmp tables=t_account,a_are

表操作

数据类型

字符型

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

数值型

​ NUMBER : 数值类型

​ 例如:NUMBER(5) 最大可以存的数为 99999

​ NUMBER(5,2) 最大可以存的数为 999.99

日期型

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

二进制型(大数据类型)

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

创建表

CREATE TABLE 表名称(
字段名 类型(长度) primary key,
字段名 类型(长度),
.......
);

修改表

增加字段

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

修改字段

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

修改字段名

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

删除字段名

ALTER TABLE T_OWNERS DROP COLUMN REMARK

删除表

drop table 表名称

数据增删改

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

ORACLE 查询

单表查询

--简单条件查询
--精确查询 
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

--去掉重复记录
select distinct addressid from T_OWNERS

--排序查询
--升序排序 
select * from T_ACCOUNT order by usenum
--降序排序 
select * from T_ACCOUNT order by usenum desc

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

聚合统计

--聚合函数
--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--min
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

连接查询

--多表内连接查询
--查询显示业主编号,业主名称,业主类型名称
select o.id 业主编号,o.name 业主名称,ot.name 业主类型
	from T_OWNERS o,T_OWNERTYPE ot
	where o.ownertypeid=ot.id
--查询显示业主编号,业主名称、地址和业主类型
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
--查询显示业主编号、业主名称、地址、所属区域、业主分类
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
--查询显示业主编号、业主名称、地址、所属区域、收费员、业主分类
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标准:
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
--Oracle语法:
SELECT ow.id,ow.name,ac.year ,ac.month,ac.money FROM
	T_OWNERS ow,T_ACCOUNT ac
	WHERE ow.id=ac.owneruuid(+)

--右外连接查询
--查询业主的账务记录,显示业主编号、名称、年、月、金额。如果账务记录没有对应的业主信息,也要列出记录
--SQL1999标准:
select ow.id,ow.name,ac.year,ac.month,ac.money from
	T_OWNERS ow right join T_ACCOUNT ac
	on ow.id=ac.owneruuid
--Oracle语法:
select ow.id,ow.name,ac.year,ac.month,ac.money from
	T_OWNERS ow , T_ACCOUNT ac
	where ow.id(+) =ac.owneruuid

子查询

--where 子句中的子查询
--单行子查询: 只返回一条记录 / 单行操作符(= <> < <= > >=)
--查询 2012 年 1 月用水量大于平均值的台账记录
select * from T_ACCOUNT
where year='2012' and month='01' and usenum> ( select avg(usenum) from T_ACCOUNT where year='2012' and month='01' )
--多行子查询: 返回了多条记录 多行操作符(in any all)
--in 运算符
select * from T_OWNERS where addressid in ( 1,3,4 )
select * from T_OWNERS where addressid in ( select id from t_address where name like '%花园%' )
select * from T_OWNERS where addressid not in ( select id from t_address where name like '%花园%' )

--from 子句中的子查询
--查询显示业主编号,业主名称,业主类型名称,条件为业主类型为”居民”,使用子查询实现。
select * from
(select o.id 业主编号,o.name 业主名称,ot.name 业主类型 from T_OWNERS o,T_OWNERTYPE ot where o.ownertypeid=ot.id)
where 业主类型='居民';

--select 子句中的子查询 
--select 子句的子查询必须为单行子查询
--列出业主信息,包括 ID,名称,所属地址,所属区域。
select id,name,
( select name from t_address where id=addressid )addressname,( select (select name from t_area where id=areaid ) fromt_address where id=addressid ) adrename 
from t_owners;

分页查询

--分页查询
select rownum,t.* from T_ACCOUNT t where rownum<=10
select * from (select rownum r,t.* from T_ACCOUNT t where rownum<=20) where r>10

--基于排序的分页
select * from (select rownum r,t.* from T_ACCOUNT t where rownum<=20 order by usenum desc) where r>10 
select rownum r,t.* from T_ACCOUNT t where rownum<=20 order by usenum desc 
select * from (select rownum r,t.* from (select * from T_ACCOUNT order by usenum desc) t where rownum<=20 ) where r>10 

单行函数

字符函数

--求字符串长度 LENGTH 
select length(‘ABCD’) from dual;
--求字符串的子串 SUBSTR 
select substr(‘ABCD’,2,2) from dual;
--字符串拼接 CONCAT 
select concat(‘ABC’,‘D’) from dual; 
--或者 
select ‘ABC’||‘D’ from dual;

数值函数

--当前日期和时间 
select sysdate from dual
--加月函数 ADD_MONTHS 
select add_months(sysdate,2) from dual
--求所在月最后一天 LAST_DAY 
select last_day(sysdate) from dual
--日期截取 TRUNC 
select TRUNC(sysdate) from dual
select TRUNC(sysdate,'yyyy') from dual
select TRUNC(sysdate,'mm') from dual

转换函数

--数字转字符串 TO_CHAR  
select TO_CHAR(1024) from dual
--日期转字符串 TO_CHAR
select TO_CHAR(sysdate,'yyyy-mm-dd') from dual
select TO_CHAR(sysdate,'yyyy-mm-dd hh:mi:ss') from dual
--字符串转日期 TO_DATE 
select TO_DATE('2017-01-01','yyyy-mm-dd') from dual
--字符串转数字 TO_NUMBER 
select to_number('100') from dual

其它函数

--空值处理函数 NVL 
NVL(检测的值,如果为 null 的值);
--空值处理函数 NVL2
NVL2(检测的值,如果不为 null 的值,如果为 null 的值);
--条件取值 decode
decode(条件,1,翻译值 1,2,翻译值 2,…值 n,翻译值 n,缺省值)

分析函数

--RANK 相同的值排名相同,排名跳跃 
select rank() over(order by usenum desc ),usenum from T_ACCOUNT
--DENSE_RANK 相同的值排名相同,排名连续 
select dense_rank() over(order by usenum desc ),usenum from T_ACCOUNT
--ROW_NUMBER 返回连续的排名,无论值是否相等 
select row_number() over(order by usenum desc ),usenum from T_ACCOUNT

集合运算

UNION ALL

​ UNION ALL(并集),返回各个查询的所有记录,包括重复记录。

select * from t_owners where id<=7
union all
select * from t_owners where id>=5

UNION

​ UNION(并集),返回各个查询的所有记录,不包括重复记录。

select * from t_owners where id<=7
union
select * from t_owners where id>=5

INTERSECT

​ INTERSECT(交集),返回两个查询共有的记录。

select * from t_owners where id<=7
intersect
select * from t_owners where id>=5

MINUS

​ MINUS(差集),返回第一个查询检索出的记录减去第二个查询检索出的记录之后剩余的记录。

select * from t_owners where id<=7
minus
select * from t_owners where id>=5

ORACLE 对象

视图

定义

​ 视图其实是一个虚拟的表,它的数据其实来自于表。如果更改了视图的数据,表的数据也自然会变化,更改了表的数据,视图也自然会变化。一个视图所存储的并不是数据,而是一条 SQL语句。

优点

  • 简化数据操作:视图可以简化用户处理数据的方式。
  • 着重于特定数据:不必要的数据或敏感数据可以不出现在视图中。
  • 视图提供了一个简单而有效的安全机制,可以定制不同用户对数据的访问权限。
  • 提供向后兼容性:视图使用户能够在表的架构更改时为表创建向后兼容接口。

语法

--创建
CREATE [OR REPLACE] [FORCE] VIEW view_name
AS subquery
[WITH CHECK OPTION ]
[WITH READ ONLY]
--含义
OR REPLACE :若所创建的试图已经存在,ORACLE 自动重建该视图;----修改视图
FORCE:不管基表是否存在 ORACLE 都会自动创建该视图;---- 带错误地试图
subquery:一条完整的 SELECT 语句,可以在该语句中定义别名;
WITH CHECK OPTION :插入或修改的数据行必须满足视图定义的约束;----带检查约束
WITH READ ONLY:该视图上不能进行任何 DML 操作。 ---- 只读视图

--删除视图
DROP VIEW view_name;

序列

定义

​ 序列是 ORACLE 提供的用于产生一系列唯一数字的数据库对象。

语法

--定义
CREATE SEQUENCE sequence //创建序列名称
[INCREMENT BY n] //递增的序列值是n 如果n是正数就递增,如果是负数就递减 默认是 1
[START WITH n] //开始的值
[{MAXVALUE n | NOMAXVALUE}] //最大值
[{MINVALUE n | NOMINVALUE}] //最小值
[{CYCLE | NOCYCLE}] //循环/不循环
[{CACHE n | NOCACHE}];//分配并存入到内存中
--使用
NEXTVAL 返回序列的下一个值
CURRVAL 返回序列的当前值
--删除
DROP SEQUENCE 序列名称;

同义词

定义

​ 同义词实质上是指定方案对象的一个别名。

​ 通过屏蔽对象的名称和所有者以及对分布式数据库的远程对象提供位置透明性,同义词可以提供一定程度的安全性。同时,同义词的易用性较好,降低了数据库用户的SQL 语句复杂度。

​ 你可以创建公共同义词和私有同义词。其中,公共同义词属于 PUBLIC特殊用户组,数据库的所有用户都能访问;而私有同义词包含在特定用户的方案中,只允许特定用户或者有基对象访问权限的用户进行访问。

语法

--创建
create [public] SYNONYM synooym for object;

索引

定义

​ 索引是用于加速数据存取的数据对象。合理的使用索引可以大大降低 i/o 次数,从而提高数据访问性能。
​ 索引是需要占据存储空间的,也可以理解为是一种特殊的数据。形式类似于下图的一棵“树”,而树的节点存储的就是每条记录的物理地址,也就是我们提到的伪列(ROWID)

分类

  • 普通索引 create index 索引名称 on 表名(列名);

  • 唯一索引 create unique index 索引名称 on 表名(列名);

  • 复合索引 create index 索引名称 on 表名(列名,列名…);

  • 反向键索引 create index 索引名称 on 表名(列名) reverse;

    应用场景:当某个字段的值为连续增长的值,如果构建标准索引,会形成歪脖子树。这样会增加查询的层数,性能会下降。建立反向键索引,可以使索引的值变得不规则,从而使索引树能够均匀分布。

  • 位图索引 create bitmap index 索引名称 on 表名(列名);

    使用场景:位图索引适合创建在低基数列上位图索引不直接存储 ROWID,而是存储字节位到 ROWID 的映射 优点:减少响应时间,节省空间占用。

ORACLE 编程

定义

​ PL/SQL(Procedure Language/SQL)是 Oracle 对 sql 语言的过程化扩展,指在 SQL
​ 命令语言中增加了过程处理语句(如分支、循环等),使 SQL 语言具有过程处理能力。把 SQL
​ 语言的数据操纵能力与过程语言的数据处理能力结合起来,使得 PLSQL 面向过程但比过程语言简单、高效、灵活和实用。

基本语法

[declare
– 声明变量
]
begin
– 代码逻辑
[exception
– 异常处理
]
end;

变量

声明变量:变量名 类型(长度)
变量赋值:变量名:=变量值

属性类型

%TYPE 引用型: 引用某表某列的字段类型
%ROWTYPE 记录型: 标识某个表的行记录类型

异常

exception
  when 异常类型 then
  异常处理逻辑

预定义异常 - 当 PL/SQL 程序违反 Oracle 规则或超越系统限制时隐式引发
NO_DATA_FOUND - 使用 select into 未返回行
TOO_MANY_ROWS - 执行 select into 时,结果集超过一行

用户定义异常 - 用户可以在 PL/SQL 块的声明部分定义异常,自定义的异常通过 RAISE 语句显式引发

条件判断

if 条件 then
业务逻辑
elsif 条件 then
业务逻辑
else
业务逻辑
end if;

循环

--无条件循环
loop
– 循环语句
end loop;

--条件循环
while 条件
loop
end loop;

--for循环
for 变量 in 起始值…终止值
loop
end loop;

游标

什么是游标

​ 游标是系统为用户开设的一个数据缓冲区,存放 SQL 语句的执行结果。我们可以把游标理解为 PL/SQL 中的结果集。

语法结构及示例

cursor 游标名称 is SQL 语句;

open 游标名称
loop
	fetch 游标名称 into 变量
	exit when 游标名称%notfound
end loop;
close 游标名称

带参数的游标

declare
v_pricetable T_PRICETABLE%rowtype;-- 价格行对象
cursor cur_pricetable(v_ownertypeid number) is select *
from T_PRICETABLE where ownertypeid=v_ownertypeid;-- 定义游
标
begin
open cur_pricetable(2);-- 打开游标
loop
	fetch cur_pricetable into v_pricetable;-- 提取游标到变量
	exit when cur_pricetable%notfound;-- 当游标到最后一行下面退出循环
	dbms_output.put_line('价格:'||v_pricetable.price ||'吨位:'||v_pricetable.minnum||'-'||v_pricetable.maxnum );
end loop;
close cur_pricetable;-- 关闭游标
end ;

for 循环提取游标值

declare
cursor cur_pricetable(v_ownertypeid number) is 
select * from T_PRICETABLE 
	where ownertypeid=v_ownertypeid;-- 定义游标
begin
for v_pricetable in cur_pricetable(3)
loop
dbms_output.put_line('价格:'||v_pricetable.price ||'吨位:'||v_pricetable.minnum||'-'||v_pricetable.maxnum );
end loop;
end ;

存储函数

定义

​ 存储函数又称为自定义函数。可以接收一个或多个参数,返回一个结果。在函数中我们可以使用 P/SQL 进行逻辑的处理。

存储过程与存储函数都可以封装一定的业务逻辑并返回结果,存在区别如下:

  • 存储函数中有返回值,且必须返回;而存储过程没有返回值,可以通过传出参数返回多个值。
  • 存储函数可以在 select 语句中直接使用,而存储过程不能。过程多数是被应用程序所调用。
  • 存储函数一般都是封装一个查询结果,而存储过程一般都封装一段事务代码。

语法

CREATE [ OR REPLACE ] PROCEDURE 存储过程名称
    (参数名 类型, 参数名 类型, 参数名 类型)
    IS|AS
    变量声明部分;
    BEGIN
    逻辑部分
    [EXCEPTION
     异常处理部分]
    END;

​ 参数只指定类型,不指定长度
​ 过程参数的三种模式:

  • IN 传入参数(默认)
  • OUT 传出参数 ,主要用于返回程序运行结果
  • IN OUT 传入传出参数

触发器

定义

​ 数据库触发器是一个与表相关联的、存储的 PL/SQL程序。每当一个特定的数据操作语句(Insert,update,delete)在指定的表上发出时,Oracle自动地执行触发器中定义的语句序列。

用于

  • 数据确认
  • 实施复杂的安全性检查
  • 做审计,跟踪表上所做的数据操作等
  • 数据的备份和同步

分类

  • 前置触发器(BEFORE)
  • 后置触发器(AFTER)

语法

CREATE [or REPLACE] TRIGGER 触发器名
BEFORE | AFTER
[DELETE ][[or] INSERT] [[or]UPDATE [OF 列名]]
ON 表名
[FOR EACH ROW ][WHEN(条件) ]
declare
……
begin
PLSQL 块
End;

FOR EACH ROW 作用是标注此触发器是行级触发器 语句级触发器

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值