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的数据类型分为内置(标准)数据类型和用户自定义数据类型。内置数据类型包括:


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":

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; --删除公有同义词

Oracle数据库--SQL的更多相关文章

  1. Oracle 数据库SQL性能查看

    作为一个开发/测试人员,或多或少都得和数据库打交道,而对数据库的操作归根到底都是SQL语句,所有操作到最后都是操作数据,那么对sql性能的掌控又成了我们工作中一件非常重要的工作.下面简单介绍下一些查看 ...

  2. Oracle数据库sql命令整理

    转至:https://blog.csdn.net/weixin_43712330/article/details/88358604 以下为oracle数据库中sql语句的整理,将持续更新01. 如何登 ...

  3. Oracle数据库——SQL高级查询

    一.涉及内容 1.掌握SELECT语句的多表连接查询. 2.掌握SELECT语句的子查询. 二.具体操作 (一)根据Oracle数据库scott方案下的emp表和dept表,完成下列操作: 1.查询所 ...

  4. oracle数据库sql的基本使用

    整理了下关于oracle数据库中SQL的基本使用语句,整理如下,方便记忆. oracle的基本术语 数据字典,数据库元数据信息的数据字典表和用户可以读取的数据字典视图组成.存放oracle数据库所用的 ...

  5. oracle数据库SQL入门

    1.oracle数据库的下载.安装.卸载 Oracle下载: Oracle下载链接地址:http://www.oracle.com/technetwork/cn/database/enterprise ...

  6. [转] oracle 数据库 SQL plus 连接方法

    http://hi.baidu.com/zzy382/item/a5b197f97a38e01ba7298832 之前电脑上安装了一个 Oracle  有一段时间没用,就把密码给忘了,按上面链接里的操 ...

  7. Oracle数据库SQL语句的分类

    1986年10月,美国国家标准协会对SQL进行规范后,以此作为关系式数据库管理系统的标准语言,1987年在国际标准组织的支持下成为国际标准.不过各种通行的数据库系统其实在实践过程中都对SQL规范的作了 ...

  8. ORACLE数据库SQL语句的执行过程

    SQL语句在数据库中处理过程是怎样的呢?执行顺序呢?在回答这个问题前,我们先来回顾一下:在ORACLE数据库系统架构下,SQL语句由用户进程产生,然后传到相对应的服务端进程,之后由服务器进程执行该SQ ...

  9. Oracle数据库SQL语句操作大全汇总

    数据库各个表空间增长情况的检查: SQL >SELECT A.TABLESPACE_NAME,( 1-(A.TOTAL)/B.TOTAL)* 100 USED_PERCENT FROM (SEL ...

随机推荐

  1. MyISAM InnoDB 区别

    MyISAM 和 InnoDB 讲解 InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定.基本的差别为:MyISAM类型不支持事务处理等高级处 ...

  2. HDU 3695 / POJ 3987 Computer Virus on Planet Pandora(AC自动机)(2010 Asia Fuzhou Regional Contest)

    Description Aliens on planet Pandora also write computer programs like us. Their programs only consi ...

  3. Groovy安装配置

    一.介绍 Groovy是可以运行在 Java 平台上进行动态语言,使用方式基本与使用 Java 的方式相同,Groovy和java基本是可以实现无缝整合,它有以下一些特性: 是一个基于Java虚拟机的 ...

  4. sublime Emmet的用法及相关语法

    本节来讲一下Emmet插件的用法及相关语法. Emmet插件极大的提高了编程员的编程速度,下面我们来讲讲它的具体语法: 一.生成 HTML 文档初始结构 HTML 文档的初始结构,就是包括 docty ...

  5. ajax该什么时候用

    第一.请求的提交是为了页面数据的显示,这时候用户一般不希望看到页面的刷新,是使用AJAX的一个最佳时候. 第二.如果请求提交后,用户能从页面感觉到提交结果,这时候,也最好不要有页面刷新,推荐使用AJA ...

  6. 免费电子书:微软Azure基础之Azure Automation

    (此文章同时发表在本人微信公众号"dotNET每日精华文章") Azure Automation是Azure内置的一项自动化运维基础功能,微软为了让大家更快上手使用这项功能,特意推 ...

  7. BZOJ2783: [JLOI2012]树 dfs+set

    2783: [JLOI2012]树 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 588  Solved: 347 Description 数列 提交文 ...

  8. Android SeekBar自定义使用图片和颜色显示

    案例使用的图片如下:                            1.在res/drawable目录下新增一个xml风格文件,seekbar_define_style.xml ? 1 2 3 ...

  9. 使用Spring的jdbcTemplate进一步简化JDBC操作

    先看applicationContext.xml配置文件: <?xml version="1.0" encoding="UTF-8"?> <b ...

  10. Real Adaboost总结

    Real Adaboost分类器是对经典Adaboost分类器的扩展和提升,经典Adaboost分类器的每个弱分类器仅输出{1,0}或{+1,-1},分类能力较弱,Real Adaboost的每个弱分 ...