- 支持多用户、大事务量的事务处理
- 数据安全性和完整性控制
- 支持分布式数据处理
- 可移植性
- 数据库
- 实例
- 数据文件(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
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
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 表名称 ---- 删除表
- delete 删除的数据可以 rollback
- delete 删除可能产生碎片,并且不释放空间
- truncate 是先摧毁表结构,再重构表结构
//加载驱动
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");
}
oracle.jdbc.OracleDriver
jdbc:oracle:thin:@虚拟机的 IP:1521:orcl
exp system/itcast full=y 或者 exp system/itcast file=文件名 full=y
imp system/itcast full=y or imp system/itcast 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
- 精确查询 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’
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
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(+)
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语法:
s
elect ow.id,ow.name,ac.year,ac.month,ac.money from
T_OWNERS ow , T_ACCOUNT ac
where ow.id(+) =ac.owneruuid
select * from T_ACCOUNT where year='2012' and month='01' and usenum> ( select avg(usenum) from T_ACCOUNT where year='2012' and month='01' )
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 '%花园%' )
select * from (select o.id 业主编号,o.name 业主名称,ot.name 业主类型 from T_OWNERS o,T_OWNERTYPE ot where o.ownertypeid=ot.id) where 业主类型='居民'
列出业主信息,包括 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;
- 四舍五入函数 ROUND select round(100.567) from dual 或者 select round(100.567,2) from dual
- 截取函数 TRUNC select trunc(100.567) from dual 或者 select trunc(100.567,2) from dual
- 取模 MOD select mod(10,3) 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,缺省值)【功能】根据条件返回相应值
select name ,(case ownertypeid
when 1 then '居民'
when 2 then '行政事业单位'
when 3 then '商业'
else '其它'
end ) from T_OWNERS
select name,(case
when ownertypeid= 1 then '居民'
when ownertypeid= 2 then '行政事业'
when ownertypeid= 3 then '商业'
end ) from T_OWNERS
select (select name from T_AREA where id= areaid ) 区域,
sum( case when month='01' then money else 0 end) 一月,
sum( case when month='02' then money else 0 end) 二月,
sum( case when month='03' then money else 0 end) 三月,
sum( case when month='04' then money else 0 end) 四月,
sum( case when month='05' then money else 0 end) 五月,
sum( case when month='06' then money else 0 end) 六月,
sum( case when month='07' then money else 0 end) 七月,
sum( case when month='08' then money else 0 end) 八月,
sum( case when month='09' then money else 0 end) 九月,
sum( case when month='10' then money else 0 end) 十月,
sum( case when month='11' then money else 0 end) 十一月,
sum( case when month='12' then money else 0 end) 十二月
from T_ACCOUNT where year='2012' group by areaid
按季度统计 2012 年各个地区的水费
select (select name from T_AREA where id= areaid ) 区域,
sum( case when month>='01' and month<='03' then money else 0 end) 第一季度,
sum( case when month>='04' and month<='06' then money else 0 end) 第二季度,
sum( case when month>='07' and month<='09' then money else 0 end) 第三季度,
sum( case when month>='10' and month<='12' then money else 0 end) 第四季度
from T_ACCOUNT where year='2012' group by areaid
- 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
select * from t_owners where id<=7 union all select * from t_owners where id>=5
select * from t_owners where id<=7 union select * from t_owners where id>=5
select * from t_owners where id<=7 intersect select * from t_owners where id>=5
select * from t_owners where id<=7 minus select * from t_owners where id>=5
视图其实是一个虚拟的表,它的数据其实来自于表。如果更改了视图的数据,表的数据也自然会变化,更改了表的数据,视图也自然会变化。一个视图所存储的并不是数据,而是一条 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
键保留表是理解连接视图修改限制的一个基本概念。该表的主键列全部显示在视图中,并且它们的值在视图中都是唯一且非空的。也就是说,表的键值在一个连接视图中也是键值,那么就称这个表为键保留表。
视图是一个虚拟表(也可以认为是一条语句),基于它创建时指定的查询语句返回的结果集。每次访问它都会导致这个查询语句被执行一次。为了避免每次访问都执行这个查询,可以将这个查询结果集存储到一个物化视图(也叫实体化视图)。
物化视图与普通的视图相比的区别是物化视图是建立的副本,它类似于一张表,需要占用存储空间。而对一个物化视图查询的执行效率与查询一个表是一样的。
CREATE METERIALIZED VIEW view_name
[BUILD IMMEDIATE | BUILD DEFERRED ]
REFRESH [FAST|COMPLETE|FORCE]
[
ON [COMMIT |DEMAND ] | START WITH (start_time) NEXT
(next_time)
]
AS
subquery
BUILD IMMEDIATE 是在创建物化视图的时候就生成数据 BUILD DEFERRED
则在创建时不生成数据,以后根据需要再生成数据。 默认为 BUILD IMMEDIATE。
刷新(REFRESH):指当基表发生了 DML 操作后,物化视图何时采用哪种方式和基表进行同步。
REFRESH 后跟着指定的刷新方法有三种:FAST、COMPLETE、FORCE。 FAST刷新采用增量刷新,只刷新自上次刷新以后进行的修改。COMPLETE 刷新对整个物化视图进行完全的刷新。如果选择 FORCE 方式,则
Oracle 在刷新时会去判断是否可以进行快速刷新,如果可以则采用 FAST 方式,否则采用 COMPLETE的方式。FORCE
是默认的方式。刷新的模式有两种:ON DEMAND 和 ON COMMIT。 ON DEMAND 指需要手动刷新物化视图(默认)。ON COMMIT 指在基表发生 COMMIT 操作时自动刷新。
手动书信物化视图
begin
DBMS_MVIEW.refresh(‘物化视图名称’,‘C’);
end;
或者命令窗口 输入 EXEC DBMS_MVIEW.refresh(‘物化视图名称’,‘C’);创建增量刷新的物化视图
- 创建物化视图中涉及表的物化视图日志
- 在查询语句中,必须包含所有表的 rowid ( 以 rowid 方式建立物化视图日志 )
序列是 ORACLE 提供的用于产生一系列唯一数字的数据库对象。
CREATE SEQUENCE sequence //创建序列名称
[INCREMENT BY n] //递增的序列值是n 如果n是正数就递增,如果是负数就递减 默
认是 1
[START WITH n] //开始的值,递增默认是 minvalue 递减是 maxvalue
[{MAXVALUE n | NOMAXVALUE}] //最大值
[{MINVALUE n | NOMINVALUE}] //最小值
[{CYCLE | NOCYCLE}] //循环/不循环
[{CACHE n | NOCACHE}];//分配并存入到内存中
* NEXTVAL 返回序列的下一个值
* CURRVAL 返回序列的当前值
- ALTER SEQUENCE 序列名称 MAXVALUE 5000 CYCLE;
- 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 的映射 优点:减少响应时间,节省空间占用
PL/SQL(Procedure Language/SQL)是 Oracle 对 sql 语言的过程化扩展,指在 SQL
命令语言中增加了过程处理语句(如分支、循环等),使 SQL 语言具有过程处理能力。把 SQL
语言的数据操纵能力与过程语言的数据处理能力结合起来,使得 PLSQL 面向过程但比过程语言简单、高效、灵活和实用。
[declare
– 声明变量
]
begin
– 代码逻辑
[exception
– 异常处理
]
end;
声明变量:变量名 类型(长度)
变量赋值:变量名:=变量值
%TYPE 引用型: 引用某表某列的字段类型
%ROWTYPE 记录型: 标识某个表的行记录类型
异常
exception
when 异常类型 then
异常处理逻辑
NO_DATA_FOUND - 使用 select into 未返回行
TOO_MANY_ROWS - 执行 select into 时,结果集超过一行
条件判断
if 条件 then
业务逻辑
elsif 条件 then
业务逻辑
else
业务逻辑
end if;
循环
loop
– 循环语句
end loop;
while 条件
loop
end loop;
for 变量 in 起始值…终止值
loop
end loop;
游标是系统为用户开设的一个数据缓冲区,存放 SQL 语句的执行结果。我们可以把游标理解为 PL/SQL 中的结果集。
cursor 游标名称 is SQL 语句;
open 游标名称
loop
fetch 游标名称 into 变量
exit when 游标名称%notfound
end loop;
close 游标名称
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 ;
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 进行逻辑的处理。
CREATE [ OR REPLACE ] FUNCTION 函数名称
(参数名称 参数类型, 参数名称 参数类型, ...)
RETURN 结果变量数据类型
IS
变量声明部分;
BEGIN
逻辑部分;
RETURN 结果变量;
[EXCEPTION
异常处理部分]
END;
存储过程是被命名的 PL/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 作用是标注此触发器是行级触发器 语句级触发器