(
partition E values('山东'),
partition W values('新疆','西藏') )
4.复合分区
范围分区与散列分区或列表分区的组合
PARTITION BY RANGE (column_name1) --范围分区 SUBPARTITION BY HASH (column_name2)--散列分区
SUBPARTITIONS number_of_partitions --散列分区的数量 (
PARTITION part1 VALUES LESS THAN(range1), PARTITION part2 VALUES LESS THAN(range2), ...
PARTITION partN VALUES LESS THAN(MAXVALUE) ); eg:
先按照薪资进行范围分区(3个分区)
再按照编号进行散列分区(创建4个分区)
create table employee4( empId number,
empname varchar(20), empaddress varchar(200), empsal number(7) )
partition by range(empsal) subpartition by hash(empId) subpartitions 4 (
partition s1 values less than (2000), partition s2 values less than (4000), partition s3 values less than (maxvalue) ) /
操纵已分区的表
在已分区的表中插入数据与操作普通表完全相同,Oracle会自动将数据保存到对应的分区 查询、修改和删除分区表时可以显式指定要操作的分区
insert into sale values(1,to_date('2010-9-1','yyyy-mm-dd'),1500);--将数据存放到sale表中p2分区上
--查询指定分区中的数据
select * from sale partition(p2)--p2为分区的名称 --删除指定分区的数据
delete from sale partition(p2)
6.序列和同义词
1.同义词是现有对象的一个别名。 同义词优点: a.简化SQL语句
b.隐藏对象的名称和所有者 c.提供对对象的公共访问
同义词的分类:私有同义词和公有同义词 创建私有同义词
create synonym 同义词名称 for 模式.表名 create synonym emp for scott.emp;
select * from emp;-->select * from scott.emp;
创建公有同义词:(需要为其授权:create public synonym) grant create public synonym to xiaoming;
create public synonym 同义词名称 for 模式.表名 create public synonym pub_emp for scott.emp; eg:
SQL> conn system/xasxt
Connected.
SQL> grant select on pub_emp to xiaohua; Grant succeeded.
SQL> conn xiaohua/xiaohua; Connected.
SQL> select * from pub_emp; 删除同义词:
drop synonym emp;
drop public synonym pub_emp;
2.序列:实现类似于sqlserver中的主键自增的功能 序列是用于生成唯一、连续序号的对象 序列可以是升序的,也可以是降序的 使用CREATE SEQUENCE语句创建序列 create sequence my_seq start with 1 increment by 1 maxvalue 100000 minvalue 1 nocycle cache 10 /
通过nextval获取下一个序列的值:select my_seq.nextval from dual 通过currval获取当前序列的值:select my_seq.currval from dual; 更改和删除序列:
更改: ALTER SEQUENCE toys_seq MAXVALUE 5000 CYCLE; 删除: DROP SEQUENCE toys_seq;
7.视图和索引
1.视图:
视图以经过定制的方式显示来自一个或多个表的数据 视图可以视为“虚拟表”或“存储的查询” 创建视图所依据的表称为“基表” 视图的优点有:
提供了另外一种级别的表安全性 隐藏的数据的复杂性
简化的用户的SQL命令 隔离基表结构的改变
通过重命名列,从另一个角度提供数据 eg:
create or replace view V$_myview--建议视图名称以V$开头 as
select e.empno,e.ename,d.dname from emp e join dept d on(e.deptno=d.deptno) /
select * from V$_myview--查询视图(将视图看成一张表) 注意:视图是可以更新的,但是需要满足一下条件 a.只能修改一个底层的基表
b.如果修改违反了基表的约束条件,则无法更新视图
c.如果视图包含连接操作符、DISTINCT 关键字、集合操作符、聚合函数或 GROUP BY 子句,则将无法更新视图
d.如果视图包含伪列或表达式,则将无法更新视图 删除视图: drop view V$_myview;
2.索引(字典中的索引目录) 优点:
1.用以提高 SQL 语句执行的性能 2.减少磁盘I/O访问次数 原则:
1.只有在大表上创建索引才有意义 2.在where子句中的条件(列)经常建立索引 3.建立索引会带来一些额外的开销:
a.写的速度会变慢:需要额外维护索引信息 b.加大磁盘和内存空间的占用量(1.2倍)
创建标准索引:
CREATE INDEX 索引名称 ON 表名 (列名) TABLESPACE 表空间
eg:
create index idx_myIndex on emp(ename);
create index idx_myIndex --组合索引
on emp(ename,sal);
select * from emp where ename='zhangsan' and sal=1000;
重建索引:
ALTER INDEX idx_myIndex REBUILD; 删除索引:
drop index idx_myIndex;
唯一索引:
Oracle自动在表的主键列上创建唯一索引 CREATE UNIQUE INDEX 索引名 ON 表名 (列名);
8.PL-SQL基础
--声明变量(建议变量名以v_开头) --变量名类型:=值; --赋值变量名:=值; declare
v_hello varchar2(20):='hello'; v_world varchar2(20);
v_cons constant number(4):=123;--声明常量:不能重新赋值 begin
v_world:=',xasxt!';
--v_cons:=345;
dbms_output.put_line(v_hello||v_world);--类似于System.out.println(); dbms_output.put_line('v_cons='||v_cons); end;
--使用select ..into语句为变量赋值 declare
v_name varchar2(20); v_sal number(10); v_empno number(10); begin
v_empno:='&empno';--获取控制台输入的编号:&(交互式命令) select ename,sal into v_name,v_sal from emp where empno=v_empno; dbms_output.put_line('姓名:'||v_name); dbms_output.put_line('薪水:'||v_sal);
end;
--%type:引用变量和数据库列的数据类型 --%rowtype:提供表示表中一行的记录类型 declare
v_name emp.ename%type;-- 与emp表中ename列的类型一致 v_sal emp.sal%type;
v_empno emp.empno%type;
v_record emp%rowtype;--保持一条记录 begin
v_empno:='&empno';--获取控制台输入的编号:&(交互式命令) select ename,sal into v_name,v_sal from emp where empno=v_empno; dbms_output.put_line('姓名:'||v_name);
dbms_output.put_line('薪水:'||v_sal);
dbms_output.put_line('**************************');
select * into v_record from emp where empno=v_empno;--将查询的记录赋值给v_record dbms_output.put_line('工作:'||v_record.job); end;
--条件结构 --if.... end if; declare
v_age number(3); begin
v_age:='&age'; if v_age >= 18 then
dbms_output.put_line('成年!'); end if; end;
--if....else....end if; declare
v_age number(3); begin
v_age:='&age'; if v_age >= 18 then
dbms_output.put_line('成年!'); else
dbms_output.put_line('未成年!'); end if; end;
---if...elsif...else....end if declare
v_age number(3); begin
v_age:='&age';