Oracle数据库--SQL

时间:2022-09-28 09:03:59

1、事务(Transaction )

1)命名事务

set transaction name ‘transaction_name ’;

2)查看事务是否存在

select name from v$transaction;

3)提交事务

commit (注:事务提交以后,就不存在了)

4)设置事务读一致性(只读事务)

set transaction read only; (注:只读事务内只能执行一些有限的SQL语句)

5)设置回滚点

savepoint sp1;

6)回滚到回滚点

rollback to savepoint sp1;

7)自治事务

允许用户在事务中建立一个新的事务,也就是事务中嵌套一个新的事务。新的事务叫自治事务(Autonomous Transaction AT),原来的事务叫主/父事务(Main Transaction MT),自治事务的提交回归不会影响主事务。使用:pragma autonomous_transaction指定自治事务。


2、oracle数据类型

oracle的数据类型分为内置(标准)数据类型和用户自定义数据类型。内置数据类型包括:

Oracle数据库--SQL


3、表结构管理

1)oracle的表类型

  • 普通表(Ordinary Table)又叫堆组织表(Heap Organized Table)
  • 聚族表(Cluster Table)
  • 分区表(partitioned Table)
  • 外部表(External Table)
  • 临时表(Temporary Table)
  • 索引组织表(Index-Organized Table IOT)

普通表:平常所指的表,数据以无序的方式存储

聚族表:聚族是表的一种特殊结构。一个聚族由多个表组成,几个表共享相同的数据块。一个聚族由一个或多个公共的列,称为聚族关键字(Cluster Key)。oracle把多个表的数据物理的存储在一起,以加速表的连接(join)。只有创建了聚族后才能在聚族中创建表,这些表叫聚族表。在往聚族表中插入数据之前,必须在聚族上创建聚族索引。

适合使用聚族的情况:

  • 目的是为了查询,而不是为了修改,频繁修改的表不适合使用聚族;
  • 查询时,常常对聚族中的多个表进行连接。

外部表:数据库中只存放外部表的定义,外部表的数据存放在数据库之外,外部表的数据以文件的形式存放在操作系统中。创建外部表时需要指定访问驱动(Access Driver),访问驱动用于把外部数据读入oracle中,oracle提供两种类型的驱动:oracle_loader(默认)和oracle_datapump。外部表是只读的,不能在外部表上执行任何DML。

临时表:值表中的数据是临时存在的。临时表的数据只存在一次会话或一个事务中,而临时表的定义永久存在数据字典中。临时表的数据存放在临时表空间中。临时表上可以执行DML语句、建视图和索引,不产生重做日志和回滚日志。临时表分两类:

  • 会话型临时表(session-specific):数据只存在会话期间,如果用户提出登陆,oracle自动删除临时表中的数据,是私有的,每个会话只能修改自己的临时表数据。
  • 事务型临时表(Transaction-Specific):数据只存在事务期间,如果事务结束,oracle自动删除临时表中的数据。

索引组织表:是一类特殊的表,将索引和表的数据存储在一起,按照主键进行排序,以二叉树的形式对表的数据进程存储。二叉树中每个索引条目用<主键值,非主键值>来表示。不存储ROWID,通过主键来访问数据,适合通过主键对数据进行访问的应用。索引组织表的优点:

  • 快速的随机访问
  • 快速的范围扫描
  • 更少的存储需求

普通表的索引条目包含索引值和指向数据行的ROWID,而索引组织表中的索引条目不仅包含索引值还包含索引数据,表的数据很大时索引条目不能够容纳,因此,在索引组织表中一条记录分为两部分进行存储:

  • 索引部分:存放主键值、频繁访问的非主键值、指向溢出区的ROWID
  • 溢出区:存放非主键值,溢出区存放在一个溢出表空间中(用户可指定)

哑表:创建数据库时由oracle自动创建的一种表dual。

2)建表

2.1)创建普通表:

create table tb_ordernary1
(
id number not null primary key, --指定列非空、主键
name varchar2(20) default 'os', --指定列的默认值
address varchar2(40)
)
tablespace myspace --指定表存放的表空间
storage --指定表的存储参数
(
initial 64K --指定初始区的大小
next 1M --指定下一个区的大小
minextents 1 --指定最少要分配多少个区
maxextents unlimited --指定区的最大数量
);

2.2)创建聚族表:

  1. 创建聚族:create cluster tb_cluster(postcode int) tablespace myspace;
  2. 把表加入聚族中(创建聚族表):

create table student
(
id int primary key,
name varchar2(20) not null,
postcode int
)
cluster tb_cluster(postcode);

create table address_info
(
postcode int primary key,
name varchar2(40),
detail varchar2(40)
)
cluster tb_cluster(postcode);

2.3)创建索引组织表:

create table students
(
name varchar2(20) primary key,
id number,
detail varchar2(100)
)
organization index --指定创建的表是索引组织表
tablespace users
pcctreshold 30 --指定溢出比例,如果超过溢出比例,溢出部分将被存储到溢出区中
including detail --指定列名,表示从这个列以后的所有列将存储在溢出区中
overflow tablespace myspace; --指定溢出表空间

2.4)创建外部表:

在操作系统中创建目录和文件,如:D:\temtb\data、D:\temtb\log、D:\temtb\bad目录,D:\exdata\temstu.txt,文件的内容如:50016,小张,上海,22 ...确保oracle对这些目录有读写权限。

  1. 创建目录对象:

create or replace directory dat_dir
as 'D:\temtb\data'; --存放数据,使用外部表的用户需要对该目录有读权限

create or replace directory log_dir
as 'D:\temtb\log'; --存放日志,使用外部表的用户需要对该目录有读权限

create or replace directory bad_dir
as 'D:\temtb\bad'; --存放坏文件,如果一条记录引起oracle错误,这条记录将被写到坏文件中,使用外部表的用户需要对该目录有读写权限

2. 按要求授予用户rawman对目录的读写权限,如:grant read,write on directory bad_dir to rawman;

3. 使用rawman用户登录数据库,创建外部表:

create table fitness_member --外部表的名字
(
id int,
name varchar2(14),
city varchar2(30),
age int
)
organization external --表示创建的表是外部表
(
tpye oracle_loader --指定访问驱动
default directory dat_dir --指定数据的默认存放路径
access parameters --
(
records delimited by newline --一行为一条记录
badfile bad_dir:'empxt%a_%p.bad' --指定坏文件的名字和路径
logfile log_dir:'empxt%a_%p.log' --指定日志文件的名字和路径
fields terminated by ',' --指定字段之间以‘,’进行分隔
missing field values are null
(id,name,city,age)
)
location ('temstu.txt') --指定存放数据的文件的名字
)
parallel
reject limit unlimited; --表示允许无限制的行发生错误

2.5)创建临时表:

创建事务型临时表:

create global temporary table gtt2
(
name varchar2(20),
id number,
bithday date
)
on commit delete rows; --指定创建表是事务型临时表

创建会话型临时表:

create global temporary table gtt4
(
name varchar2(20),
id number,
bithday date
)
on commit preserve rows; --指定创建表是会话型临时表

2.6)表的克隆:

create table t_clone1
as select * from stb
[where 1=0];

3)修改表

3.1)添加列:alter table tb_ordernary add (lenth number (8,3));

3.2)列的重命名:alter table tb_ordernary rename cloumn lenth to new_lenth;

3.3)改变列的属性:

alter table tb_ordernary modify (lenth number(4,1)); --修改列的宽度
alter table tb_ordernary modify (lenth default 5); --修改列的默认值
alter table tb_ordernary modify (lenth not null); --设置列不能为空
alter table tb_ordernary modify (lenth encrypt using '3des168'); --对列进行加密
alter table tb_ordernary modify (lenth decrypt); --对列进行解密

3.4)为表手工分配一个新区:alter table tb_ordernary allocate extent (size 50K);

3.5)删除某些列:alter table tb_ordernary drop (name,address);

4)表管理

4.1)把表移动到一个新的段(可同时修改表的存储属性):

alter table tb_ordernary move
storage
(
initial 20K
next 40K
minextents 2
maxextents 20
pctincrease 0
);

4.2)把表移动到其他表空间:

alter table tb_ordernary move tablespace myspaces2

4.3)锁表:

往表上加行级锁:

lock table studentbook
in exclusive mode
nowait

锁住表中指定的行:

select * from tb_ordernary where name = ‘李%’ for update;

解锁(提交或回滚事务,锁将被解开):

commit; / rollback;

4.4)让一个列自动增长:使用序列和触发器

4.5)把表放入只读模式:

alter table tb_ordernary read only; (注:只读模式的表上可执行的操作有限制)

4.6)恢复表到读写模式:

alter table tb_ordernary read write;

4.7)判断表的存在性:

select * from user_name.table_name;

4.8)找出当前用户模式下,哪些表的哪些列的数据类型是日期类型,并列出表及相关列:

select c.table_name, c.column_name
from user_tab_cols c
where c.data_type = 'date'
order by table_name;

4.9)查询出组成表的列:

用desc命令:desc tb_date_test;

查询视图all_tab_columns(或dba_tab_columns),如:select column_name,data_type,nullable,data_default from all_tab_columns where table_name =

'tb_date_test';

4.10)计算一个表的大小:

select segment_name, sum(bytes)/1024/1024||'M'
from dba_extents
where segment_name = 's_employee'
group by segment_name;

5)删表

5.1)分步骤彻底删除表:

  1. 删除表:drop table tb_ordernary [cascade constraints]; --并未真正删除表,只是把表放在回收站中,可执行show recyclebin查看,执行select * from recyclebin查看回收站中的对象
  2. 清空回收站中所有表:purge recyclebin;
  3. 清空回收站中指定的表:purge table "BIN$6IW9QnJsT7G+11YvJdfdvA==$0":

Oracle数据库--SQL

5.2)一次彻底删除表:

drop table tb_ordernary purge;


4、表数据管理

1)insert语句

1.1)往表中插入数据(指定列名):

insert into departments(department_id,department_name,manager_id,location_id)
values(220,'Recreation',111,7200);

1.2)往表中插入数据(未指定列名):

insert into departments
values(220,'Recreation',111,7200);

1.3)插入字符&:

  • 在sqlplus中执行:set define off; --关闭替代变量 后直接插入即可。
  • 使用函数chr:insert into tb_char values (chr(38));

1.4)根据一个表往另一个表中插入数据(拷贝表的数据):

insert into t_target(id,name)
select id, name
from t_source t
where t.address='上海';

1.5)插入日期:

insert into tb_date
values(to_date('2009-9-9 12:15:55','YYYY-MM-DD HH24:MI:SS'));

1.6)插入NULL:

insert into test_table
values('wangji',null);

2)update语句

2.1)更新单列:

update test_table set location = '深圳' where id = '111';

2.2)更新多列:

update test_table set salary = salary + 1000, location = null where age > 50;

2.3)利用子查询对表进行更新:

update test_table
set major=(select source.major from source where source.id=test_table.id)
where test_table.id=(select source.id from source where source.id=test_table.id);

update test_table
set major=(select source.major from source where source.id=test_table.id)
where test_table.id in(select source.id from source);

update test_table
set major=(select source.major from source where source.id=test_table.id)
where exists (select source.id from source where source.id=test_table.id);

3)delete语句

3.1)删除表中所有数据行:

delete from test_table;

3.2)删除表中特定数据行:

delete from test_table where age=18;

3.3)用最快的方法删除数据:

truncate table test_table; (注:truncate是DDL语句,无需commit)

3.4)删除重复记录(利用rowid和max/min函数):

利用not in:

delete from test_table
where rowid not in(select min(rowid) from test_table group by id)

利用!=

delete from test_table a
where rowid !=(select max(rowid) from test_table b where a.id=b.id)

利用临时表:

create table tem_table
as
(select distinct id,first_name,last_name,major from test_table);

truncate table test_table;

insert into test_table
select * from tem_table;


5、约束管理

1)oracle有5种类型的约束

  • 不为空约束(NOT NULL Integrity Constraints)
  • 唯一约束(UNIQUE KEY Integrity Constraints)
  • 主键约束(PRIMARY KEY Integrity Constraints)
  • 参照性完整性约束(Referential Integrity Constraints):即外键约束,其原理是:如果列A是表R1的外键,它与表R2的主键K相对应,则表R1中列A的每个值要么取空(NULL)值,要么等于表R2中主键K的值。R2叫父表,R1叫主表。删除子表的数据对父表没影响,而删除父表时需要先与子表接触外键约束关系。
  • 检查约束(CHECK Integrity Constraints)

主键约束和唯一约束的区别:

  • 主键会隐含创建唯一性索引
  • 主键可以作为外键,唯一约束不可以
  • 组成主键的如何一列不允许为空,唯一约束可以
  • 每个表上只能有一个主键,却允许有多个唯一约束

2)创建约束

2.1)创建主键约束:

create table test_table
(id varchar2(10) primary key, name varchar2(10),keynumber number); --创建表时指定主键

alter table test_table
add primary key (id,name); --在已存在的表上添加主键

alter table test_table
add constraint PK3 primary key (id,name); --在已存在的表上添加主键并指定约束名

2.2)创建唯一约束:

create table test_table
(id varchar2(10) unique, name varchar2(10),keynumber number); --创建表时指定唯一约束

alter table test_table
add unique (id,name); --在已存在的表上添加唯一约束

alter table test_table
add constraint PK3 unique (id,name); --在已存在的表上添加唯一约束并指定约束名

2.3)创建不为空约束

create table test_table
(id varchar2(10) not null, name varchar2(10),keynumber number); --创建表时指定不为空约束

alter table test_table
modify (name not null); --在已存在的表上添加不为空约束

2.4)创建检查约束

create table test_table
(id varchar2(10), name varchar2(10),
keynumber number constraint c_check check(keynumber between 10 and 20)); --创建表时指定检查约束

alter table test_table
add constraint c_check check(keynumber between 10 and 20); --在已存在的表上添加不为空约束

2.5)创建/添加外键约束

alter table test_table
add constraint Refdepartment3 foreign key (dept_id) references department(dept_id) [on delete cascade];

3)删除约束

3.1)删除主键:

alter table test_table
drop primary key [cascade];

alter table test_table
drop constraint PK3 [cascade]; --利用约束名来删除

3.2)删除唯一约束:

alter table test_table
drop unique (name);

alter table test_table
drop constraint UK_DEPT [cascade]; --利用约束名来删除

3.3)删除不为空约束:

alter table test_table
modify (name NULL);

3.4)删除检查约束:

alter table test_table
drop constraint c_check; --利用约束名来删除

3.5)删除/解除外键约束:

alter table test_table
drop constraint Refdepartment3;

4)使能约束

4.1)使约束失效:

alter table emp
disable constraint emp_empno_pk [cascade];

4.2)使约束生效:

alter table emp
enable constraint emp_empno_pk;

5)查询约束

5.1)查询当前用户在某个表上的所有约束:

select constraint_name, constraint_type, search_condition
from user_constraints
where table_name = 'EMP';

5.2)查询约束建立在哪些列上:

select constraint_name, column_name
from user_cons_columns
where table_name = 'EMP';


6、LOB管理

大对象数据类型(Large Object Data Types, LOB)用于存储大文本、图像、视频、声音等信息。oracle定义了4种大对象类型:BFILE、BLOB、CLOB、NCLOB。LOB数据是存入到数据库中的值,而LOB定位器(LOB Locators)是操作这些值得指针,要读取或修改LOB数据时,必须先要获取LOB定位器,然后通过LOB定位器来读取或修改LOB数据。通过DBMS_LOB包中的read()、append()、write()、copy()等方法可以检索和操作LOB数据。LOB数据可以和主表数据分别存放在不同的表空间,如:

create table test_table
(
bf bfile,
b1 blob,
c1 clob,
nc1 nclob
)
LOB (c1) store as (tablespace users)
LOB (b1) store as (tablespace myspace);

1)bfile

bfile存放的是文件指针(file locator),该指针指向数据库之外的操作系统文件,数据实际存放在操作系统中。bfile是只读的,需要保证oracle有权限读取bfile指向的文件。rollback和commit对bfile指向的文件没有影响。bfile的应用例子如下:

1. 创建学生表信息:

create table bfile_student
( name varchar2(10),
resume bfile
);

2. 创建目录对象并授权:

create directory dir_resume as 'E:\resume';
grant read on directory dir_resume to item;

3. 往表中插入数据:

insert into bfile_student(name,resume) values('liuhong', bfilename('dir_resume','liuhong_resume.doc')); --bfilename函数返回文件指针

4. 更改指针:

update bfile_student set resume=bfilename('dir_resume','liuhong_resume2.doc')

5. PL/SQL块中使用bfile:

delare
s_bfile bfiel; --定义变量,数据类型为文件指针
begin
select resume into s_bfile from bfile_student where name='liuhong'; --获得文件指针
dbms_lob.fileopen(s_bfile,dbms_lob.file_readonly);
...
--对文件的各种操作,如使用dbms_lob.loadclobfromfile读文件内容
..
dbms_lob.close(s_bfile); --关闭文件
end;

2)blob

blob用于存储非结构化的二进制数据,最长达128TB,表列中存储的是LOB定位器(指定数据地址),实际的blob数据存储在数据库独立的表空间中。

3)clob

clob用于存储数据库字符集格式的字符数据,最长达128TB,表列中存储的是LOB定位器(指定数据地址),实际的clob数据存储在数据库独立的表空间中。

4)nclob

nclob功能与clob一样,只是nclob用于存放统一编码国家字符集数据。(blob、clob和nclob的应用类似,参阅其他资料)


7、用户自定义数据类型

oracle支持三种用户自定义数据类型(User-defined Type):对象类型、嵌套表类型、可变数组类型。

1)对象类型(Object Type)

对象类型用于描述客观世界中存在的事物,是在其他内置数据类型基础上建立的(也可以基于另一种对象类型),对象类型可以包含多个元素,称之为属性,还可以包含多种操作,称之为方法。

1.1)创建对象类型:

create or replace type schooltype as object --创建包含三个属性的对象类型
(
name varchar2(30),
city varchar2(30),
street varchar2(30)
);

1.2)删除对象类型:

delete type schooltype;

1.3)查看对象类型的结构:

decs schooltype;

1.4)对象类型的存储形式:

  • 整个表只存储对象,这样的表称之为对象表(Object Table),每行表示一个对象,存储于对象表中的对象称之为行对象(Row Object)。
  • 与表中其他数据存储在一起,对象之占表中的一列,这样的对象称之为列对象(Column Object)。

1.5)基于对象类型创建表:

create table school_info of schooltype; --创建对象表

create table student_info --创建含有对象的关系表
( name varchar2(10),
id number,
school schooltype
);

1.6)往表中插入数据:

insert into school_info values(schooltype('北大','北京','中关村'));
insert into student_info values('xiaoming','1111',schooltype('北大','北京','中关村'));

1.7)查询学生信息:

select stu.name, stu.id, stu.school.name, stu.school.city, stu.school.street from student_info stu;

2)可变数组类型(Varry Data Type)

可变数组是一个有序的相同数据类型元素的集合。每个元素均有一个索引编号(下标),通过下标访问数组元素。可变数组数据采用内联存储,即与其在同一表中的其他数据存储在同一个表空间内,也可以存储在BLOB中。可以基于标准oracle数据类型,也可以基于用户自定义数据类型。

2.1)创建可变数组类型:

create type address_list as varray(10) of varchar2(80); --基于基本数据类型,可变数组的最大元素数量为10,每个元素的数据类型是varchar2(80)
create type varray_phone as varray(10) of phone_type; --基于对象类型phone_type

2.2)删除可变数组类型:

drop type address_list;

2.3)创建含有可变数组类型的表:

create table instructor
( name varchar2(10),
phone_list varray_phone
);

2.4)往表中插入数据:

insert into instructor values
( '王老师',
varray_phone(
phone_type ('86', '101', '6634853'),
phone_type ('86', '120', '2564523'),
phone_type ('86', '131', '3489443')
)
);

2.5)查询王老师区号是101的所有电话信息:

select country_code, area_code, phone_number
from table(select phone_list from instructor where name='王老师')
where area_code='101';

2.6)更新含有可变数组的表(王老师搬到了另外一个城市,需要变更他家的区号并停掉一部电话):

update instructor
set phone_list=varray_phone(phone_type ('86', '110', '6634853'),phone_type ('86', '120', '2564523'))
where name='王老师';

3)嵌套表类型(Nested Table Data Type)

嵌套表是一个无序的相同类型数据元素的集合。可以基于标准oracle数据类型,也可以基于用户自定义数据类型。

3.1)创建嵌套表类型:

create or replace type bookobjtype as object --创建对象类型bookobjtype
(
bookid varchar2(10),
bookname varchar2(30),
describe varchar2(10)
);

create or replace type booknestedtype as table of bookobjtype; --创建嵌套表类型

3.2)创建含有嵌套表类型的表:

create table studentbook
( student_name varchar2(10) not null primary key,
home_address varcha2(100),
booklist booknestedtype
)
tablespace jspace --jspace表示存放主表(studentbook)的表空间
nested table booklist store as booklist_table (tablespace myspace); --myspace表示存放子表(booklist_table)的表空间

3.3)查询主表的存放空间:

select tablespace_name from dba_tables
where table_name = 'studentbook';

3.4)查询子表的存放空间:

select tablespace_name from dba_segments
where segment_type = 'nested table' and segment_name = 'booklist_tabl' ;

3.5)删除嵌套表类型:

drop type booknestedtype;

3.6)往表中插入数据:

insert into studentbook values (
'王晓晓',
'上海',
booknestedtype
(
bookobjtype ('111','《中国通史》','历史类'),
bookobjtype ('222','《三个代表》','政治类')
)
);

3.7)查询嵌套表(查询学生刘晶拥有的书籍):

select * from table(select T.booklist from studentbook T where student_name='刘晶');

3.8)更新嵌套表(刘晶把自己的书籍小学数学换成了高等数学):

update table(select T.booklist from studentbook T where student_name='刘晶') TT
set TT.bookname='《高等数学》'
where TT.bookname='《小学数学》';

3.9)删除嵌套表中的数据(刘晶丢失了中国通史这本书):

delete from table(select T.booklist from studentbook T where student_name='刘晶') TT
where TT.bookname='《中国通史》';


8、数据库链接

数据库链接分为三类:

  • 私有数据库链接(Private Database Link):只有创建该数据库链接的用户才可以使用它。
  • 公有数据库链接(Public Database Link):该数据库的所有用户均可以使用它。
  • 全局数据库链接(Global Database Link):当oracle网络使用目录服务器时,目录服务器自动创建全局数据库链接,并统一控制,如何数据库中的用户都可以使用全局数据库链接访问远程数据库。

1)创建数据库链接

create database link remotedb --创建私有数据库链接
connect to itme indentified by zero --itme/zero为远程数据库用户名/密码
using ‘MYZDB’; --MYZDB为网络服务名

create public database link remotedb2 --创建私有数据库链接
connect to itme indentified by zero
using ‘MYZDB’;

2)使用数据库链接

oracle允许对远程数据库执行DML操作,而不允许执行DDL操作,使用DML时通过@引用远程数据库。如:
insert into kk@remotedb2 values('ssss');
select * from kk@remotedb2;

3)删除数据库链接

drop database link remotedb; --删除私有数据库链接
drop public database link remotedb; --删除公有数据库链接


9、分区表管理

使用分区(Partition)技术,oracle允许把一个大表分成几个部分,每一个部分叫一个分区,然后把每个部分存放在不同的物理磁盘,以提高这个数据库的性能。每个分区还可以再分为几份,这样产生的分区叫子分区(Subpartition),无论怎么划分,分区表逻辑上还是一个整体。

1)oracle提供如下几种分区方法:

  • 范围分区(Range Partitioning):根据表中列值的范围将整个表分成不同的部分,如按照时间进行范围分区。
  • 列表分区(List Partitioning):使用列表值将表划分成几个部分。
  • 哈希分区(Hash Partitioning):使用哈希函数把表分成几个部分。
  • 复合分区(Composite Partitioning):同时使用两种方法对表进行分区。

2)创建分区表

2.1)创建范围划分分区表:

create table people
( id number,
age int not null,
address varchar2(100)
)
Partition by range (age) --指定分区的方式,range表示为范围划分,按照年龄进行范围划分
(
Partition P1 values less then (10) --指定分区的名字和上限,最后一个分区可以使用maxvalue表示最大值
tablespace users, --指定分区存放的表空间,处于性能考虑,每个分区可以放在不同的表空间中
Partition P2 values less then (20)
tablespace myspace,
Partition P3 values less then (30)
tablespace users,
Partition P4 values less then (70)
tablespace myspace
);

2.2)创建哈希划分分区表:

create table people2(id number,age number)
Partition by hash(age) Partitions 4; --按照分区数量

create table people3(id number,age number)
Partition by hash(age)
(
Partition Pt1 --指定分区
tablespace users,
Partition Pt2
tablespace myspace,
Partition Pt3
tablespace myspace,
Partition Pt4
tablespace users
);

2.3)创建列表划分分区表:

create table people4(name varchar(20), city varchar(20))
Partition by list (city)
(
Partition P1
values ('吉林','大连')
tablespace users1,
Partition P2
values ('成都','贵州')
tablespace users2,
Partition P3
values ('广州','桂林','台北')
tablespace users3
);

3)查询指定分区中的数据

select * from people4 partition(p2);

4)修改指定分区中的数据

update people4 partition(p2) set name='liujing' where name='刘晶';

5)删除指定分区中的数据

delete from people4 partition(p2) where name='liujing';

6)添加分区

6.1)往范围划分分区表中增加新的分区Pa:

alter table people add partition Pa values less then(90) tablespace users;

6.2)往哈希划分分区表中增加新的分区P_hash:

alter table people2 add partition P_hash tablespace myspace;

6.3)往列表划分分区表中增加新的分区P_list:

alter table people4 add partition P_list values('西宁','银川') tablespace myspace;

7)截断分区

alter table people truncate partition p1 --截断分区p1中的数据,会释放空间
delete from people partition p1 --不会释放空间

8)合并分区

8.1)合并范围划分的两个分区:

alter table people merge partition P1,P2 into partition P2;

8.2)合并列表划分的两个分区:

alter table people4 merge partition P1,P2 into partition P2;

注:不能合并按照哈希进行划分的两个分区。

9)拆分分区

9.1)拆分按照范围划分的分区:

alter table people split partition P2 AT (5) into (partition P1,partition P2);

9.2)拆分按照列表划分的分区:

alter table people4 split partition P3 values ('广州','桂林') into (partition P3_part1,partition P3_part2);
--'广州'和'桂林'落在第一个分区,剩下的值落在第二个分区

注:不能拆分按照哈希进行划分的分区。

10)重命名分区

alter table people4 rename partition P3_part1 to P3_part11;

11)交换分区

alter table people4 exchange partition P3_part11 with table t1;

12)删除分区

alter table people4 drop partition P3_part11;


10、视图

视图是表中数据的逻辑表示,视图对用户名、基表名、基表数据进行了封藏,它只是基表数据的展现“窗口”,视图的优点:加强了表的安全管理、隐藏了数据的复杂性、简化了SQL语句的书写。

1)视图的创建

create view v_zero as
select *
from kuser.studens_table
where id>1000
[with read only]; --加上with子句时表示只读视图(只允许被读)

create replace procedure p_create_view --在存储过程中创建视图
is
sql_string varchar2(100);
begin
sql_string:='create view v_zero3 as select * from studens'; --创建视图的SLQ语句
execute immediate sql_string; --通过动态SQL创建视图
end

execute p_create_view; --执行存储过程

2)视图的使用

select * from v_zero; --视图查询
insert into v_zero values (1333,'kite'); --可以通过视图对基表数据进行修改(增、删、改),但不推荐

3)得到创建视图的sql语句

set serveroutput on; --设置环境变量
set long 100000;
select dbms_metadata.get_ddl('view','v_zero','item') from dual; --item是用户名/模式名

4)视图的删除

drop view v_zero [cascade constraints];


11、序列

oracle中通过序列实现字段的自增(sql server中通过identify直接标识自增列),序列又叫序列生成器,可以使用序列生成唯一键,每次访问序列,序列按照一定规律增加或减少。序列的定义存储在system表空间中,序列不像表,它不会占用磁盘空间。序列独立于事务,事务的提交和回滚都不会影响序列。

1)创建序列

语法:

create sequence 序列名字
increment by 整数 --指定序列的增量,可以为负数
start with 整数 --指定序列的起始值
maxvalue 整数 --指定序列的最大值
nomaxvalue --表示序列无最大值
minvalue 整数 --指定序列的最小值
nominvalue --表示序列无最小值
cycle --表示序列达到最大值后可以循环
nocycle --不能循环
cache 整数 --指定可以缓存多少个值在内存中,缓存的目的是加快对序列的访问(数据库重启后缓存中序列值将丢失!)
nocache --表示不缓存序列值
order --表示按照请求的顺序产生序列(可解决序列值丢失/不连续的问题)
noorder; --表示不按照请求的顺序产生序列

例子:

create sequence sq2
increment by 1
start with 1
nomaxvalue
nocycle
cache 10;

2)使用序列

select sq2.nextval from dual; --nextval使序列值增加
select sq2.currval from dual; --currval得到序列的当前值,注:每次只需currval之前必须执行nextval,否则会产生错误

3)删除序列

drop sequence sq2;


12、同义词

同义词又叫别名,一个同义词其实就是给一个对象(表、视图、序列等模式对象)起的别名,别名和对象的名字指向同一模式对象。目的是方便的引用模式对象。同义词的优点:隐藏对象的模式名、提高远程对象的透明性、简化SQL语句、限制用户直接对对象进行访问。同义词分为:

  • 公有同义词(Public Synonym):数据库中的如何用户都可以使用公有同义词。
  • 私有同义词(Private Synonym):被特定的用户所拥有,这个用户控制其他用户对私有同义词的使用。

1)创建同义词

create synonym ctb from itme.chinastudentbook@dblink6; --创建私有同义词
create public synonym pb_ctb from itme.chinastudentbook@dblink6; --创建公有同义词

2)删除同义词

drop synonym ctb; --删除私有同义词
drop public synonym pb_ctb; --删除公有同义词