数据库对象
用户模式:指数据库用户所创建和存储数据对象的统称。在访问其它用户模式的数据库对象时需加上用户模式。
如:scott.emp, scott.dept等。
数据库对象包括:表、视图、索引、序列、目录、同义词、数据库用户、存储过程、函数、触发器等。
同义词
同义词是现有数据库对象的一个别名。
- 简化sql语句
- 隐藏对象的名称和所有者
同义词分为私有和公有的
--创建同义词得通过sys进行授权 grant create [any] synonym to $username$; --授权,创建私有同义词 grant create public synonym to $username$;--授权,创建公有同义词
私有:只有当前用户才能使用
--创建私有同义词 create [or replace] synonym 同义词名称 for 对象(如:表,视图等); drop synonym $同义词名$; --删除同义词 create or replace synonym emp for employee;
公有:全部的用户都能使用
--创建公有同义词 create [or replace] public synonym 同义词名称 for 对象(如:表); drop public synonym $同义词名$;--删除同义词 create or replace public synonym emp for employee;
序列
序列是用于生成唯一、连续序号的对象,如:1,2,3…….
作用:
序列常用于生成表的主键值、唯一键的值以及需要连续序号的场合。
补充:
序列可以是升序的,也可以是降序的。
一个序列产生的值可以同时供多个表使用,如果有这个需要的话。
创建序列:
--语法 create sequnce 序列名 start with 初始值 【incremnt by 步长】 --步长为负数,则是降序 【maxvalue 最大值】 【minvalue 最小值】 【cycle/nocycle】 【cache/nocach】默认oracle缓存20个序列值
create sequence emp_seq start with 1; select emp_seq.nextval from dual; --先执行,序列才会有数据,从1开始,步长默认为1,执行一次,序列的当前数值就会自加1 slect emp_seq.currval from dual;--返回当前的数值 --创建序列 create sequence emp_seq start with 8001; --没加increment by 默认步长为1 --最初创建序列时初始值是没有的,第一次访问序列必须先访问它的nextval属性 select emp_seq.nextval from dual; select emp_seq.nextval,emp_seq.currval from dual; --修改序列,不能修改初始值(start with x) select max(empno) from emp; --删除序列 drop sequence emp_seq; --在插入时使用序列来生成主键值 insert into employee(empno,ename,job,sal) values(emp_seq.nextval, 'james','clerk',3999); --生成序列的下一个值 select emp_seq.nextval from dual; --访问序列的当前值 select 'xyz-'||emp_seq.currval from dual;
视图
视图,被称为虚拟表,可以简化select语句
作用:
- 提供了另外一种级别的表安全性
- 隐藏的数据的复杂性
- 简化的用户的sql语句
- 隔离基表(创建视图时用到的表)结构的改变
- 通过重命名列,从另一个角度提供数据
- 数据独立性
和之前的序列一样,需要sys进行授权
grant create view to $username$
--相当于复制一个表 create view emp_view as select * from employee --隐藏了其他的属性,只显示员工编号,姓名以及部门 create view emp_view as select empno,ename,deptno from employee --复杂查询的结果当成一个表 --列出薪金高于公司平均薪金的所有员工,所在部门,上级领导,和工资等级 --如果需要使用当前的结果,使用select语句就简单许多 create or replace view emp_sal_vw as select e.empno, e.ename, d.dname dept_name, m.empno as mgrno, m.ename as manager, s.grade from employee e, employee m, department d, salgrade s where e.mgr=m.empno(+) and e.deptno=d.deptno and e.sal>(select avg(sal) from employee) and e.sal between s.losal and s.hisal;
索引
查询时候数据量大的时候,通过索引可以提高查询的效率(百万条数据级别),在常用的列名(字段)创建索引
--创建索引 create [unique] index $indexname$ on $tablename$(列名1,列名2...)
唯一索引和普通索引
索引有唯一索引和普通索引,如在多个列上创建索引则成为组合索引
唯一索引一般在创表的时候,把某列设置某个主键,系统就会自动为该列创建唯一索引
--普通索引 create index hiredate_idx on employee(hiredate); --组合索引 create index emp_comp on employee(mgr,deptno); --组合索引的顺序可以是任意的,不过,此顺序会影响查询的时候是否会启用索引查询 --下面两条是会启用索进行查询 select mgr,deptno from employee; select mgr from employee; --下面两条是会不会启用索进行查询 select deptno from employee; select deptno,mgr from employee;
函数索引
create index emp_job_fun on employee(lower(job)); --不启用索引查询 select * from employee where job='clerk'; --启用索引查询 select * from employee where lower(job)='clerk';