支持多用户、大事务量的事务处理
数据安全性和完整性控制
支持分布式数据处理
可移植性
只有一个数据库
一个Oracle实例有一系列后台进程和内存结构组成,一个数据库可以有n个实例
数据库的物理存储单位
数据文件的逻辑映射
底下单位:段->区->数据块->磁盘块
用户是在表空间下建立的,用户只能看到自己的表
命令行输入如下命令:
sqlplus system/密码
退出,输入quit
有一个instantclient工具,把连接部分功能抽取出来了
输入如下命令:sqlplus system/密码@192.168.80.10:1521/orcl
orcl:默认的实例名
1521:oracle默认端口
PLSQL
安装路径不能带中文和空格
还需要在环境变量里配置一下编码
create tablespace waterboss
datafile 'C:\waterboss.dbf'//对应数据文件
size 100m//初始大小
autoextend on//打开自动扩展
next 10m//满后每次增长
create user wateruser//用户名
identified by itcast//密码
default tablespace waterboss
grant dba to wateruser//给wateruser赋予dba权限
create table 表名称(
字段名 类型(长度) primary key,
字段名 类型(长度),
.....
);
(1)CHAR:固定长度的字符类型,最多存储2000个字节
(2)VARCHAR2:可变长度的字符类型,最多存储4000个字节
(3)LONG:大文本类型,最大2个G
NUMBER:数值类型,用长度来设定存储大小
(1)DATE:日期时间型,精确到秒
(2)TIMESTAMP:精确到秒的小数点后9位
(1)CLOB:存储字符,最大可存4个G
(2)BLOB:存储图像、声音、视频等二进制数据,最多可存4个G
ALTER TABLE T_OWNERS ADD(//追加字段
REMARK VARCHAR2(20),
OUTDATE DATE
)
ALTER TABLE T_OWNERS MODIFY(//修改字段
REMARK CHAR(30)
)
//修改字段名
ALTER TABLE T_OWNERS RENAME COLUMN A TO B
//删除字段名
ALTER TABLE T_OWNERS DROP COLUMN REMARK
DROP TABLE TABEL_NAME
insert into 表名[(列名,....)] VALUES(...);
必须要commit 事务才能查到数据
update 表名 set ... where ...
delete from 表名 where ...//可能会有碎片
truncate table 表名//不需要commit,同时不能回滚,先摧毁表结构,再重建
加载驱动
获取数据库连接
关闭数据库
exp system/密码 full=y
导出到EXPDAT.DMP文件,纯二进制
用”file=文件名“来指定导出文件名
imp system/密码 full=y
exp system/密码 owner=用户名 file=文件名
imp system/密码 file=文件名 fromuser=用户名
exp 用户名/密码 file=文件名 tables=表1,表2
imp 用户名/密码 file=文件名 tables=表1,表2
select ... from ... where ...
select ... from ... where name like '%刘%'
select distinct addressid from T_OWNERS
select * from .. order by ...//升序
select * from .. order by ... desc //降序
select rowid,t.* from t_owners t//t为别名
sum
max
avg
count(*)
select areaid,sum(money) from t_account group by areaid
select后面必须是分组聚合条件或者是聚合函数
select areaid,sum(money) from t_account group by areaid having sum(money)>100000
select ow.id 业主编号,ot.id 业主名称,ot.name 业主类型
from t_owners ow,t_ownertype ot
where ow.ownertypeid=ot.id
以左表为主,右表对应的项可能为null
----SQL1999语法
select ow.id,ow.name,year,month,money from t_owners ow left join t_account ac
on ow.id=ac.owneruuid
----Oracle语法
select ow.id,ow.name,year,month,money from t_owners ow,t_account ac
where ow.id=ac.owneruuid(+)//ac为右表
与左外连接类似
----SQL1999语法
select ow.id,ow.name,year,month,money from t_owners ow right join t_account ac
on ow.id=ac.owneruuid
----Oracle语法
select ow.id,ow.name,year,month,money from t_owners ow,t_account ac
where ow.id(+)=ac.owneruuid
操作符:=、>、<、<>....
操作符: IN、ANY、ALL
为多行子查询
select id,name,(select name from t_address where id=addressid) addressname from t_owners
应用rownum伪列,如果没有经过扫描,rownum后的运算符必须是小于或者小于等于
select * from (select rownum r,t.* from t_account t)
where r<=20 and r>10
select * from (select rownum r,t.* from (select * from t_account t order by usenum desc) t)
where r<=20 and r>10
select length('ABCD') FROM dual
dual是伪表,只是为了补充语法而存在的
select substr('ABCD',2,2) FROM DUAL
2->从B开始
2->截取多少字符
select concat('ABC','D') FROM DUAL
SELECT 'ABC' || 'D' FROM DUAL
select round(100.26,1) from dual
1->保留一位小数
select trunc(100.567) from dual
select mod(10,4) from dual
select add_months(sysdate,2) from dual;--sysdate系统变量
select last_day(sysdate) from dual;
select trunc(sysdate) from dual;--按日截取(把时间截掉)
select trunc(sysdate,'mm') from dual--按月截取(把日截掉)
select trunc(sysdate,'yyyy') from dual--按年截取
--按小时“hh”
--按分钟“mi”
select to_char(100)||'分' from dual--||字符串拼接
select to_char(sysdate,'yyyy-mm-dd') from dual
select to_date('2016-03-10','yyyy-mm-dd') from dual
select to_number("100") from dual
当检测值为null时,自动转换为某个值(多为0)
select nvl(null,0) from dual;
nvl2(null,不为null显示的值,为null显示的值)
select decode(100,1,2,3,4,100,200) from dual
第一个100和1、3、100比,串行向前比较,和100相等,返回100后的200,最后还可以加上一个缺省值
select (case ... when value1 then 'v1'
when value2 then 'v2'
when ....
else 'vn'
end) from ....
select (select name form 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
select rank() over(order by usenum desc) 排名, t.* from t_account t
select dense_rank() over(order by usenum desc) 排名, t.* from t_account t
select row_number() over(order by usenum desc) 排名, t.* from t_account t
并集union
union 包含重复记录
union all去掉重复记录
交集
intersect
差集
minus
CREATE [OR REPLACE] [FORCE] VIEW view_name --OR REPLACE表示view已存在的话就替代
--FORCE 表示subquery中不一定需要存在基表
AS subquery
[WITH CHECK OPTION]--设立一个带检查的视图,插入或修改的数据行必须满足视图定义的约束
[WITH READ ONLY]--只读视图
drop view view_name
键保留表可以做修改,但其它表只能做查询。
因为键保留表保留了原本表的主键,所以可以对应到特定的行数据上。
CREATE METERIALIZED VIEW view_name
[BUILD IMMEDIATE | BUILD DEFERRED]--是否创建后立即生成数据,默认 IMMEDIATE
--DEFERRED 默认创建时没有数据,需要手动执行刷新
REFRESH [FAST|COMPLETE|FORCE]--采取何种方式与基表保持同步,默认 FORCE,自动选择是增量更新还是完全更新
--FAST:增量刷新的物化视图 前提1、是必须创建物化视图日志:记录基表发生了哪些变化,用这些记录去更新物化视图
--2、创建物化视图的语句中,查询结果中必须有基表的唯一标识(对应日志)
[
ON [COMMIT|DEMAND] | START WITH (START_TIME) NEXT (NEXT_TIME)
--ON COMMIT在基表做提交操作时更新视图
--ON DEMAND手动刷新,默认值
]
AS
SUBQUERY
begin--PLSQL
DBMS_MVIEW.refreash('物化视图名','C')--C指Complete 完全刷新
end
create materialized view log on 表名 with rowid --根据rowid进行更新物化视图
create sequence 序列名
在插入时:序列名.nextval 作为值进行插入,这是一个伪列
当前值:序列名.currval
CREATE SEQUENCE sequence_name
[INCREAMENT BY n] --递增的序列值是n,每次加n
[START WITH n]
[{MAXVALUE n | NOMAXVALUE}]--最大值
[{MINVALUE n | NOMINVALUE}]
[{CYCLE|NOCYCLE}] --循环|非循环
[{CACHE n|NOCACHE}] --分配并存入内存中
ALTER SEQUENCE 序列名称 maxvalue 5000 cycle;
不能更改序列的START WITH参数
DROP SEQUENCE 序列名称
别名
创建同义词
create [public] SYNONYM synoonym for object;--object表示表、视图、序列等我们要创建同义词对象的名称
--public表示共有同义词,未隔离不同用户
CREATE [UNIQUE] INDEX 索引名 on 表名(列名);
在INDEX前加UNIQUE关键字-->唯一索引
CREATE INDEX 索引名 on 表名(列名1,列名2);
当某个字段的值为连续增长的值-->建普通索引会是一棵歪脖子树
为了随机化->转化成二进制以后再倒置,最后返回10进制
CREATE INDEX 索引名 on 表名(列名) reverse;
CREATE bitmap index 索引名 on 表名(列名);
低基数(值是有限的)时适合建位图索引
不能按范围查询
基本语法结构
[declare
--声明变量
]
begin
--代码逻辑
[exception
--异常处理
]
end;
声明变量
变量名 类型(长度);
变量赋值
变量名:=变量值
select ... into .... where ...
变量名 表名.列名%type
变量名 表名%rowtype
--取出变量时
变量名.列名
exception
when 异常类型
then
逻辑处理
if then
endif;
if then
else
endif;
if then
elsif
else
endif;
loop
--循环语句 通过exit跳出循环
end loop;
while 条件 --条件成立,则循环
loop
end loop;
for 变量 in 1...100 --变量从1到100
loop
end loop;
存放查询结果的结果集
cursor 游标名称 is SQL语句;
open 游标名称
loop
fetch 游标名称 into 变量
exit when 游标名称%notfound
end loop;
close 游标名称
cursor 游标名称(参数名 类型) is SQL语句;--SQL语句带有未定参数
for 变量 in 游标名称[(参数值)]--参数项可选
loop
执行代码
end loop;
CREATE [OR REPLACE] FUNCTION 函数名称
(参数名称 类型,参数名称 类型)--不写参数长度
RETURN 结果变量数据类型
IS
变量声明
BEGIN
函数体
END;
可以返回多个值,通过传出参数来返回
不能在select语句中调用,多数时被应用程序所调用
CREATE [OR REPLACE] PROCEDURE 存储过程名称
(参数名 类型,参数名 类型,参数名 类型)--参数只指定类型,不指定长度
IS|AS
变量声明
BEGIN
逻辑部分
[EXCEPTION
异常处理部分
]
END;
--参数模式 IN ||OUT ||IN OUT 在参数类型前加
调用
call 存储过程名称(); --不带传出参数
--带传出参数
declare
v_id number;
begin
存储过程名称(v_id); --执行完毕后v_id就有值了
end;
数据确认
复杂的安全性检查
做审计,跟踪表上所作的数据操作
数据的备份与同步
CREATE [OR REPLACE] TRIGGER 触发器名
BEFORE | AFTER --前置触发器or后置触发器,commit前触发还是commit后触发
[DELETE][[OR] INSERT][[OR]UPDATE [OF 列名]]
ON 表名
[FOR EACH ROW][WHEN(条件)]--是否为行级触发器
declare
...
begin
...
end;
伪记录变量
:old,:new