- 课程介绍
- 1. 约束(掌握)
- 2. 序列(掌握)
- 3. 索引(掌握)
- 4. 视图(掌握)
- 5. 存储过程(掌握)
- 6. 自定义函数(掌握)
- 7. 触发器(掌握)
- 数据库对象的命名规则
1、对象名称必须以字母开头
2、有效的字符包括数字、字母和三个特殊字符(# _ $)
3、不要使用oracle的保留字作为对象名称
4、同一用户下的对象不能同名,即使是不同的对象类型
5、1-30个字符之间
- ALTER TABLE ddl语句
3.1. 增加字段,添加外键约束
ALTER TABLE table
ADD (column datatype [DEFAULT expr]
[, column datatype]...);
3.2. 修改字段
ALTER TABLE table
MODIFY (column datatype [DEFAULT expr]
[, column datatype]...);
3.3. 删除字段
ALTER TABLE table
DROP column (columns);
- 约束
4.1. 主键(唯一+非空),唯一,非空,外键,check(mysql不支持)
1、NOT NULL 非空
2、UNIQUE Key 唯一键
3、PRIMARY KEY 主键(非空且唯一)
4、FOREIGN KEY 外键
5、CHECK 检查
4.2. 好处
保存数据之前(jdbc层发出请求,直接在数据库插入)会验证数据是否正确
只有保存成功,数据就正确
4.3. 坏处
影响插入修改的效率
- 约束的名称
5.1. 创建表的时候添加列级约束
SYS_C005456 由oracle自动取名
5.2. 创建表的时候添加表级约束
5.3. 创建表的时候添加表级外键约束
5.4. ALTER TABLE增加约束
5.5. 软件公司怎样使用约束
一般软件公司在开发阶段都添加约束,系统上线删除约束,从而提供性能
- 序列
6.1. 作用
处理主键的自动生成
6.2. Mysql主键
自动自增AUTO_INCREMENT,自增的值存储到表的ddl语句
6.3. 创建序列
CREATE SEQUENCE [user.]sequence_name
[increment by n]
[start with n]
[maxvalue n|]
[minvalue n ];
[cache]
[NOCYCLE|CYCLE]
INCREMENT BY: 指定序列号之间的间隔,该值可为正的或负的整数,但不可为0。序列为升序。忽略该子句时,缺省值为1。
START WITH:指定生成的第一个序列号。在升序时,序列可从比最小值大的值开始,缺省值为序列的最小值。对于降序,序列可由比最大值小的值开始,缺省值为序列的最大值。
MAXVALUE:指定序列可生成的最大值。
MINVALUE:指定序列的最小值
NOCYCLE:一直累加,不循环
CYCLE:累加到最大值循环
6.4. 获取主键的并发
默认序列里面缓存20个,根据情况进行适当修改
cache:默认值是20
序列里的缓冲是大量并发提取序列值时提升性能的一种手段
由于序列操作是原子操作,如果没有缓冲,序列的访问将只能由一个事务独占,独占期间阻塞其它事务的访问,且一定会涉及硬盘操作。这样如果有对一个序列的大量并发操作的话,系统性能将会下降。
缓冲是指事先成批的提取序列值,缓冲在内存中,供多个事务同时访问(每个事务占一个缓冲的序列值),且访问期间如果没有用尽缓冲是不用写硬盘的,可在大幅度提高并发访问序列的性能。但带来的问题是序列值可能不连续(但肯定保证唯一),如并发访问序列值后有些事务回滚等操作,都会带来缓冲序列值的不连续或丢失
6.5. 怎样使用序列
insert into employees_test(id,fullname)
values (seq_test.nextval,'xxxxxx0000');
6.6. 建议
一般一个表对应一个序列
6.7. 查看用户定义的序列
select t.sequence_name,t.min_value,t.max_value,
t.increment_by from user_sequences t
6.8. 修改序列
alter sequence SEQ_TEST
cache 50;
6.9. 删除序列
DROP SEQUENCE [user.]sequence_name;
- 索引
7.1. 作用
方案(schema)中的一个数据库对象
在数据库中用来加速对表的查询
通过使用快速路径访问方法快速定位数据,减少了磁盘的I/O
与表独立存放,由 Oracle数据库自动维护
索引类似于一本书的目录
7.2. 自动创建的索引
如果表创建了主键,或者创建唯一约束,自动创建一个唯一索引
7.3. 哪些值可以创建索引?
1,外键一般要创建索引
2,经常使用的查询条件(放到where后面的)要创建索引。
如果使用like ‘%’操作,有些查询不会使用索引。
like 'a% 'a_'会使用索引
like '%a'不会使用索引,可以通过把'a%' name=abc name=cba
select * from employees where reverse(name) like reverse('%abc');
like '%a%' 不会使用索引,造成全表扫描,看数据库表的数量的大小,500万以下
dba:晚上加班,分库(读数据库,写数据库)分表(往年数据变成一张只读表,今年的数据也是一张表)
3,索引不是越多越好(建立一个索引,使insert速度慢3倍,在加一个在慢2倍)
4,不要在可选值很少的属性上面创建索引:性别等;
5、对于那些定义为text, image和bit数据类型的列不应该增加索引
6、当修改性能远远大于检索性能时,不应该创建索引(分库分表:把往年查询的数据放到一个只读的表空间)
7.4. 手动创建索引
在一列或者多列上创建索引.
CREATE INDEX index
ON table (column[, column]...);
7.5. 删除索引
- 视图
视图也就是虚表,实际上视图就是一个命名的查询,用于改变基表数据的显示。
8.1. 作用
可以限制对数据的访问
可以使复杂的查询变的简单
提供了数据的独立性
提供了对相同数据的不同显示
可以提供查询性能,直接运行在数据库服务器
8.2. 创建视图
8.3. 行内视图
行内视图是在SQL语句中使用的一个带有别名的子查询.
在主查询FROM 子句中的子查询就是行内视图.
行内视图不是数据库的对象,所以不需要显式的创建.
- 表空间
就算有建表的权限,也不能建表,因为没有使用表空间的权限
一般来讲,普通用户都是使用USERS表空间,也可以自己创建
9.1. 默认有那些表空间
9.2. 逻辑概念
9.3. 物理概念
9.4. 表空间的作用
1.控制数据库占用的磁盘空间;
2、Dba可以将不同类型的数据对象部署到不同的位置,这样有利于提高i/0性能,并有得于备份和恢复管理;
9.5. 创建表空间
表空间包含段,段包含区,区包含块
Create tablespace ts1 datafile 'd:xxx.xml' size 20m uniform size 128k
Uniform表示区的大小为128K。
每个文件有一定的限制,不要超过500M/1G。
9.6. 建表的时候,指定放置在表空间
Create table test1(id number(4),name varchar2(50)) tablespace ts1;
9.7. 授予it拥有ts1的表空间权限
System登录
ALTER USER "IT"
QUOTA UNLIMITED
ON "TS1"
9.8. 疯狂复制
9.9. 扩容表空间
9.9.1. 增加新的数据文件 原文件已经500M/1G
Alter tablespace ts1 add datafile 'd:data0102.dat' size 20m;
9.9.2. 增加已有的数据文件
Alter database datafile 'd:xxx.xml' resize 50m;
9.9.3. 自动扩展
ALTER DATABASE
DATAFILE 'D:TESTDATA1.DBF' AUTOEXTEND
ON NEXT 512K MAXSIZE 1024M
9.10. 如果原来存储的位置,空间不够
先移动XXX.XML移动到其他有空间盘
9.10.1. 脱机
Alter tablespace ts1 offline;
9.10.2. 剪切到其他有空间盘
Ctrl+x Ctrl+v
9.10.3. 修改存储位置
ALTER DATABASE
RENAME FILE 'D:XXX.XML' TO 'e:XXX.XML'
9.10.4. 联机
Alter tablespace ts1 online;
9.10.5. 扩容
ALTER DATABASE
DATAFILE 'E:XXX.XML' AUTOEXTEND
ON NEXT 20M MAXSIZE 1024M;
- 存储过程
10.1. 为什么需要存储过程-提高性能
转账业务:在同一个银行之间进行转账
2个账户,没有被冻结,是否有余额
A.2个账户是否存在 2条select语句
B.是否被冻结 就用上面
C.是否有余额 就用上面
D.转账 2条update语句
Jdbc:建立连接,实例化语句,发出sql,关闭资源 跑4次
把上面的所有业务逻辑,在数据库里面相当于封装到一个方法,存储过程
步骤A:
在存储过程发出2条sql,
把sql语句的结果加入一个数据库的游标对象CURSOR(类似于java.sql.ResultSet)里面
如果能够遍历游标对象,跳到步骤B
否:返回账户不存在
步骤B:
发出2个update请求,进行转账
Jdbc:建立连接,实例化语句,发出sql,关闭资源 跑1次
10.2. 创建存储过程语法
10.3. 创建一个没有返回值的存储过程
10.4. 创建一个有返回值的存储过程
有返回值的存储在命令窗体不能执行
10.5. Java调用存储过程
- 自定义函数(必须要有返回值)
11.1. 语法
11.2. 自定义函数里面不能写dml语句
函数中不允许DML语句
形参必须为IN
11.3. Java调用函数
- 触发器
监控如果发出了insert语句或者update、delete语句,触发一个事情
12.1. 分类
12.2. 语句级触发器
一个dml语句,只触发一次
12.3. 行级触发器
一个dml语句,可以触发多次
Update 更新,delete 删除 12行,触发12次
12.4. 模式触发器
当前用户受限制:必须先删除模式触发器
system管理员不受限制
- 见多识广800条sql
13.1. 子查询分类
如果子查询里面需要用到主查询的表进行关联查询,就叫相关子查询
13.1.1. 相关子查询
子查询不能单独执行
Select * from table1 a
Where salary >(select avg(salary) from table b where a.xxid=b.id)
13.1.2. 无关子查询
子查询可以单独执行
Select * from table
Where salary >(select avg(salary) from table)
13.2. 神奇函数
13.3. 横向汇总和纵向汇总
- 课程总结
14.1. 重点
- 约束
- 序列
- 索引
- 视图
- 存储过程
- 触发器
- 自定义函数