1.登陆

Oracle安装会自动的生成sys用户和system用户

(1)、sys用户是超级用户,具有最高权限,具有sysdba角色,有create database的权限,该用户默认的密码是change_on_install

ORACLE 入门

(2)、system用户是管理操作员,权限也很大。具有sysoper角色,没有create database的权限,默认的密码是manager

(3)、一般讲,对数据库维护,使用system用户登录就可以拉

注意:也就是说syssystem这两个用户最大的区别是在于有没有create database的权限。

sys用户以sqlplus  /as sysdba方式登录时,采用的是操作系统验证的方式,所以用户名、密码输入与不输入是一样的

ORACLE 入门

查询当前登录用户:

ORACLE 入门

显示当前用户:

ORACLE 入门

切换用户

conn 用户名/密码@网络服务名 [as sysdba/sysoper] 特权用户连接是需要带上

ORACLE 入门

disc/disconn/disconnect该命令用来断开与当前数据库的连接

解锁用户

SQL> Alter user acc01 account lock;  // 加锁

SQL> Alter user acc01 account unlock;  // 解锁

创建用户

create user username identified by password

ORACLE 入门

 

用户权限授权、角色管理

权限分类:

1.系统权限:DBA( 拥有全部特权,是系统最高权限,只有DBA才可以创建数据库结构)、RESOURCE(只可以创建实体,不可以创建数据库结构)、CONNECT(只可以登录Oracle,不可以创建实体,不可以创建数据库结构)

=====系统权限补充=========

Oracle提供了100多种系统权限,常用的有:

create session 连接数据库 
create table 建表
create view 建视图 
create public synonym 建同义词
create procedure 建过程、函数、包 
create trigger 建触发器
create cluster 建簇

显示所有系统权限:可以查询数据字典视图system_privilege_map

select * from system_privilege_map order by name;

==========================

2.实体权限(对象权限):用户可以直接访问自己方案的对象,但是如果要访问别的方案的对象,则必须具有对象的权限,比如smith用户要访问scott.emp表(scott:方案 ,emp:表

select, update, insert, alter, index, delete, reference(引用),execute(执行),all  //all包括所有权限

显示用户或者角色所具有的对象权限

可以查询数据字典视图dba_tab_privs

SQL> select distinct privilege from dba_tab_privs;
SQL> select grantor, owner, table_name, privilege from

 dba_tab_privs where grantee = 'BLAKE';

------------------------------------------------------------------------------------------------------

角色管理:

1.创建角色

验证的方式:create role 角色名 not identified;

不验证的方式:create role 角色名 identified by 密码;

ORACLE 入门

2.角色赋予权限:

方法1:(1.登录权限2.使用表空间权限3-6:增删改查权限)

方法2:使用数据库本身的角色

注意:系统权限的unlimited tablespace和对象权限的with grant option选项是不能授予角色的。

ORACLE 入门ORACLE 入门

ORACLE 入门

普通开发者拥有connect角色(create session登录)、resource角色(create cluster聚簇 procedure过程 sequence序列 table表 trigger触发器 type 类型 及删改查功能 不包含创建视图权限)就可以了。

ORACLE 入门

ORACLE 入门

ORACLE 入门

ORACLE 入门

3.授予角色给用户(要有grant any role 权限)  grant role1 to user1;

ORACLE 入门

4.删除角色(要有drop any role权限)

SQL> drop role 角色名;

5.显示角色信息

显示所有角色:select * from dba_roles;

显示角色具有的系统权限:select * from role_sys_privs;

显示角色具有的对象权限:select distinct privilege from dba_tab_privs;

显示用户具有的角色及默认角色:select granted_role, default_role from dba_role_privs where grantee = ‘用户名’;

---------------------------------------------------------------------------------------------------

3.查看

查看用户角色 select * from user_role_privs; 使用dba_role_privs不行是为什么呢(sys用户可以用,是因为user开头的返回当前用户对应方案的所有表,dba开头的显示所有方案拥有的数据库表但是用户必须是dba角色,如7.1数据字典所述)?

查看当前用户的权限 select * from session_privs;

ORACLE 入门ORACLE 入门

------------------------------------------------------------------------------------------------------

4.权限传递与回收

1、with admin option用于系统权限授权,with grant option用于对象授权。

2、with admin option:,此用户可把此系统权限授予其他用户或角色,但收回这个用户的系统权限时,这个用户已经授予其他用户或角色的此系统权限不会因传播无效(不可以级联回收),如授予A系统权限create session with admin option,然后A又把create session权限授予B,但管理员收回A的create session权限时,B依然拥有create session的权限,但管理员可以显式收回B create session的权限,即直接revoke create session from B.

 

with grant option:被授予的用户也可把此对象权限授予其他用户或角色,不同的是但管理员收回用with grant option授权的用户对象权限时,权限会因传播而失效(级联回收),如grant select on table with grant option to A,A用户把此权限授予B,但管理员收回A的权限时,B的权限也会失效,但管理员不可以直接收回B的SELECT ON TABLE 权限。

 

用户其他命令

1.修改用户密码  passw 或 (password 用户名) 或

                alter user 用户名 identified by 新密码

2.删除用户 drop user 用户名 [cascade 参数用户将用户跟表一同删除]

2.显示当前用户名  show user

3.断开数据库链接  exit

4.清空屏幕 clear screen

Plsql连接数据库

D:\software\oracle\app\oracle\product\11.2.0\server\network\ADMIN中tnsnames.ora文件中配置链接地址,再由plsql登录窗口进行访问

ORACLE 入门ORACLE 入门

profile

用户口令管理

     

 

2.数据类型

数据类型

字符串类型的数据可依编码方式分成数据库字符集(CHAR/VARCHAR2/CLOB/LONG)和国际字符集(NCHAR/NVARCHAR2/NCLOB)两种。

字符串类型

CHAR

定长,默认长为1,最多存储2000字节信息,

例:CHAR(12 BYTE)  CHAR(12 CHAR)

byte:字节数据类型,有符号型,占一个字节 -128~127

char:字符数据类型,无符号型,占两个字节0~65535,一个unicode字符,可表示中文字符

VARCHAR2

变长字符串,不使用空格填充,最多存储4000字节信息

NCHAR

包含unicode格式数据的定长字符串,最多存储2000字节

NVARCHAR2

包含unicode格式数据的变长字符串,最多存储4000字节

数字类型

NUMBER(P,S)

P:有效数字位数,最多不超过38个字

S:小数的位数

INTEGER

等同于NUMBER(38,0) 整数,若有小数会被四舍五入

浮点数

BINARY_FLOAT:32位 单精度

BINARY_DOUBLE:64位 双精度

FLOAT(N)

N指示位的精度

日期类型

DATE

占7个字节  存储:世纪、年、月、日期、小时、分钟和秒

TIMESTAMP

占7或12字节   可以包含小数秒

TIMESTAMP WITH TIME ZONE    TIMESTAMP WITH LOCAL TIME ZONE

INTERVAL YEAR TO MOTH    INTERVAL DAY TO SECOND

LOB类型:

存储大型化和非结构化数据如文本、图像、视频等

CLOB

单字节和多字节数据

NCLOB

存储unicode类型数据

BLOB

存储非结构化的二进制数据大对象,一般是图像、声音、视频等文件

BFILE

二进制文件,存储在数据库外的系统文件,只读的

RAW&LONG RAW

LONG

可以存储多达2G的字符数据,建议使用CLOB代替LONG.

一个表中只有一列可以为LONG型,该列不能定义为主键或唯一约束,不能建立索引,不能出现在where子句。。。

LONG RAW

能存储2GB 的原始二进制数据(不用进行字符集转换的数据)

RAW

用于存储二进制或字符类型数据,变长二进制数据类型,这说明采用这种数据类型存储的数据不会发生字符集转换。这种类型最多可以存储2,000字节的信息

ROWID&UROWID

唯一物理记录

 

3.表

创建表

create table student (

   xh number(4), --学号

   xm varchar2(20), --姓名

   sex char(2), --性别

   birthday date, --出生日期

   sal number(7,2) --奖学金

);

用查询结果创建新表:

CREATE TABLE mytable (id, name, sal, job, deptno) as SELECT empno, ename, sal, job, deptno FROM emp;

修改表

--添加一个字段

sql>alter table student add (classid number(2));

--修改一个字段的长度

sql>alter table student modify (xm varchar2(30));

--修改字段的类型或是名字(不能有数据) 不建议做

sql>alter table student modify (xm char(30));

--删除一个字段 不建议做(删了之后,顺序就变了。加就没问题,应该是加在后面)

sql>alter table student drop column sal;

--修改表的名字 很少有这种需求

sql>rename student to stu;

删除表

sql>drop table student;

添加数据

--所有字段都插入数据

insert into student values ('a001', '张三', '男', '01-5 月-05', 10);

--oracle中默认的日期格式‘dd-mon-yy yy 2位的年 ‘09-6 月-99’

--修改日期的默认格式(临时修改,数据库重启后仍为默认;如要修改需要修改注册表)

alter session set nls_date_format ='yyyy-mm-dd';

--修改后,可以用我们熟悉的格式添加日期类型:

insert into student values ('a002', 'mike', '男', '1905-05-06', 10);

--插入部分字段

insert into student(xh, xm, sex) values ('a003', 'john', '女');

--插入空值

insert into student(xh, xm, sex, birthday) values ('a004', 'martin', '男', null);

修改数据

update student set sex = '男', birthday = '1984-04-01' where xh = 'a001';

删除数据

delete from student; --删除所有记录,表结构还在,写日志,可以恢复的,速度慢。

--delete的数据可以恢复。

savepoint a; --创建保存点

delete from student;

rollback to a; --恢复到保存点

一个有经验的dba,在确保完成无误的情况下要定期创建还原点。

drop table student; --删除表的结构和数据

delete from student where xh = 'a001'; --删除一条记录;

truncate table student; --删除表中的所有记录,表结构还在,不写日志,无法找回删除的记录,速度快。

 

4.表查询

数据库在执行sql是从左到右扫描的,如果有括号的话,括号里面的先被优先执行。

查看表结构

desc tablename;

查询列

查询所有列:select * from tablename;

查询指定列:select ename, sal, job, deptno from emp;

取消重复行查询列:select distinct deptno, job from emp;

set timing on/off

打开显示操作时间的开关,在底部显示操作时间。

ORACLE 入门

表复制

insert into table2(field1,field2,...) select value1,value2,... from table1

添加主键约束

alter table  tablename add constraint  tablename primary key (colname);

统计

select count (*) from tablename;

nvl函数

nvl(str, replace_with);

功能:如果str为null,则返回replace_with的值,否则返回str的值。  

注意事项:str和replace_with必须为同一数据类型,除非显示的使用to_char函数。

注意:处理null值用nvl函数处理

别名

select ename "姓名", sal*12 as "年收入" from emp;

给表取别名的时候,不能加as;但是给列取别名,是可以加as.

连接字符串

select ename || ' is a ' || job from emp;

like

%:表示0到多个字符 _:表示任意单个字符

Is null操作符

select * from emp where mgr is null; 不能写为="";

order by排序

默认asc

select * from emp order by deptno, sal desc;部门号升序而雇员的工资降序

聚合函数用法

max min avg sum  count

问题:如何显示所有员工中最高工资和最低工资?

select max(sal),min(sal) from emp e;

最高工资那个人是谁?

错误写法:select ename, sal from emp where sal=max(sal);

正确写法:select ename, sal from emp where sal=(select max(sal) from emp);

注意:select ename, max(sal) from emp;这语句执行的时候会报错,说ora-00937:非单组分组函数。因为max是分组函数,而ename不是分组函数.......

但是select min(sal), max(sal) from emp;这句是可以执行的。因为minmax都是分组函数,就是说:如果列里面有一个分组函数,其它的都必须是分组函数,否则就出错。这是语法规定的

group by 子句

having  子句

group by 用于对查询的结果分组统计,

having 子句用于限制分组显示结果。

例:显示平均工资低于2000的部门号和它的平均工资?

select avg(sal), max(sal), deptno from emp group by deptno having avg(sal)< 2000;

注意:1.这里暗藏了一点,如果你要分组查询的话,分组的字段一定要出现在查询的列表里面,否则会报错。因为分组的字段都不出现的话,就没办法分组了

2.分组函数不能出现在where中

3.如果在select语句中同时包含有group by, having, order by 那么它们的顺序是group by, having, order by

合并查询

Union:该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中重复行。

Union all: 该操作符与union相似,但是它不会取消重复行,而且不会排序。

Intersect: 使用该操作符用于取得两个结果集的交集。

Minus: 使用该操作符用于取得两个结果集的差集,他只会显示存在第一个集合中,而不存在第二个集合中的数据。

ORACLE 入门

rownum&rowid伪列

rowid: 数据库中行的全局唯一地址。

rownum: 是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列(强调:先要有结果集);

rownum是从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则rownum值为1,第二条为2,依次类推。如果你用>,>=,=,between...and这些条件,因为从缓冲区或数据文件中得到的第一条记录的rownum为1,则被删除,接着取下条,可是它的rownum还是1,又被删除,依次类推,便没有了数据。

因此,rownum直接使用(<、<=、!=)是可以的,如果要使用 (>,>=,=,between...and)就要用嵌套语句,把rownum先生成,再进行查询。(如分页示例3

select *from (selet rownum as rn,t1.* from a where ...)

where rn >10

分页

1.根据rowid来分

ORACLE 入门

2.根据分析函数来分

ORACLE 入门

3.rownum来分

ORACLE 入门

事物

由一组相关的dml(数据操作语言、增删改没有查询)语句组成,语句要么全部成功,要么全部失败。

几个重要操作:设置保存点 savepoint a

              取消部分事务 rollback to a

              取消全部事务 rollback

注意:事物回滚(事物取消)必须是在没有commit之前使用的(exit也算commit)。

---------------------------------

只读事务:设置只读事务后,尽管其他回话可能会提交新的事物,但是只读事务不会取得新的数据变化,从而保证特定时间点的数据信息。

ORACLE 入门

 

 

5.函数

字符函数

lower(char)将字符串转化为小写的格式。

upper(char)将字符串转化为大写的格式。

length(char)返回字符串的长度。

substr(char, m, n)截取字符串的子串,从m(从1开始)位置开始,取n个字符

replace(char1, search_str, replace_str) : 用replace_str代替char1中的search_str

例:ORACLE 入门

instr(C1,C2,I,J) : 判断某字符或字符串是否存在,存在返回出现的位置的索引,否则返回小于1;

C1 被搜索的字符串  C2 希望搜索的字符串 I 搜索的开始位置,默认为1

J 第J次出现的位置,默认为1

数学函数

数学函数包括cos,cosh,exp,ln, log,sin,sinh,sqrt,tan,tanh,acos,asin,atan,round等。

最常用的:

round(n,[m]) 该函数用于执行四舍五入,m为小数点后的位数。

trunc(n,[m]) 该函数用于截取数字,m为小数点后的位数。

mod(m,n)取余函数。

floor(n) 返回小于或是等于n的最大整数。

ceil(n) 返回大于或是等于n的最小整数。

例:ORACLE 入门

abs(n) 返回数字n的绝对值。

日期函数

(1)sysdate 返回系统时间
egSQL> select sysdate from dual;
(2) add_months(time,months) 返回某一时间之前或之后n个月的时间
egselect add_months(sysdate,-6) from dual;当前时间半年前的时间
select add_months(sysdate,6) from dual; 当前时间半年后的时间
(3)last_day(d)返回指定日期所在月份的最后一天

转换函数

to_char()把各种数据类型(日期/时间,intfloatnumeric)转换成格式化的字符串

yy:两位数字的年份 2004-->04
yyyy:四位数字的年份 2004
mm:两位数字的月份 8 -->08
dd:两位数字的天 30 -->30
hh24 8-->20
hh128-->08
miss-->显示分钟\
9:显示数字,并忽略前面0
0:显示数字,如位数不足,则用0补齐
.:在指定位置显示小数点
,:在指定位置显示逗号
$:在数字前加美元
L:在数字前面加本地货币符号
C:在数字前面加国际货币符号
G:在指定位置显示组分隔符、
D:在指定位置显示小数点符号(.)

ORACLE 入门

------------------------------------------------

to_date()函数:将字符串转换成date类型的数据。

ORACLE 入门

sys_context()系统函数

1)terminal当前会话客户所对应的终端的标示符,如计算机名
2)language: 语言
3)db_name 当前数据库名称
4)nls_date_format 当前会话客户所对应的日期格式
5)session_user 当前会话客户所对应的数据库用户名
6)current_schema 当前会话客户所对应的默认方案名
7)host 返回数据库所在主机的名称

例:ORACLE 入门

注意:USERENV是固定的,不能改的,db_name可以换成其它

 

6.表的备份与恢复

逻辑备份与恢复是指用工具export import将数据对象的结构和数据导出、导入的过程。

物理备份可以在数据库开启跟关闭的状态下进行,逻辑备份只能在数据库开启的状态下进行。

备份(导出)

导出可分为导出表、导出方案、导出数据库三种方式。

导出使用exp命令,选项有:

userid用户名,口令,连接字符串

tables

owner方案

full=y用于指定执行导出操作的数据库

inctype导出操作的增量类型

rows是否要导出表中的数据

file导出文件名

注意:特别说明-->在导入和导出的时候,要到oracle目录的bin目录下。

1)导出表

exp userid=scott/[email protected] tables=(emp) file=d:\emp.dmp --导出单个表

exp userid=...... tables=(emp,dept) file=d:\emp.dmp 导出多个表

例:

C:\Users\jiqinlin>cd D:\dev\oracle\product\10.2.0\db_1\bin

D:\dev\oracle\product\10.2.0\db_1\bin>exp userid=scott/[email protected] tables=(emp) file=d:\emp.dmp

2)导出其他方案的表

需要dba的权限或是exp_full_database的权限

userid=system/[email protected]   tables=(scott.emp,scott.dept)

3)导出表结构 exp userid=...... tables=(emp) file=......  rows=n

4)直接导出方式(需要数据库的字符集要与客户端字符集完全一致

exp userid=...  tables=...  file=...  direct=y

2)导出方案:导出方案中的所有对象(表,索引,约束...)和数据

导出自己的方案:exp userid=scott...  owner=scott file=d:\scott.dmp

导出他人方案:需要dba的权限或是exp_full_database的权限

exp userid=system...  owner=(system,scott)  file=d:\system.dmp

3)导出数据库:需要dba的权限或是exp_full_database的权限

exp userid=system/[email protected] full=y inctype=complete file=d:\all.dmp

恢复(导入)

导入要使用的文件必须是export所导出的文件。

导入也分为导入表,导入方案,导入数据库三种方式。

imp常用的选项有

userid:用于指定执行导入操作的用户名,口令,连接字符串

tables:用于指定执行导入操作的表

formuser:用于指定源用户

touser:用于指定目标用户

file 用于指定导入文件名

full=y:用于指定执行导入整个文件

inctype:用于指定执行导入操作的增量类型

rows:指定是否要导入表行(数据)

ignore:如果表存在,则只导入数据

1)导入表

1. 导入自己的表

imp userid=scott/[email protected] tables=(emp) file=d:\xx.dmp

2. 导入表到其它用户

要求该用户具有dba的权限,或是imp_full_database

imp userid=system/[email protected] tables=(emp) file=d:\xx.dmp touser=scott

2)导入方案

1.导入自身的方案--tables选项

imp userid=scott/[email protected]  file=d:\xxx.dmp

2.导入其它方案

要求该用户具有dba的权限和imp_full_database

imp userid=system/[email protected] file=d:\xxx.dmp fromuser=system touser=scott

3)导入数据库(相当于数据库迁移)

在默认情况下,当导入数据库时,会导入所有对象结构和数据,案例如下:

imp userid=system/[email protected] full=y file=d:\xxx.dmp

 

7.数据字典

数据字典

1)、数据字典记录了数据库的系统信息,它是只读表和视图的集合,数据字典的所有者为sys用户。用户只能执行查询操作(select语句),而其维护和修改是由系统自动完成的。

2)、数据字典包括数据字典基表和数据字典视图,其中基表存储数据库的基本信息,普通用户不能直接访问数据字典的基表。数据字典视图是基于数据字典基表所建立的视图,普通用户可以通过查询数据字典视图取得系统信息。数据字典视图主要包括user_xxx,all_xxx,dba_xxx三种类型。

user_tables: 当前用户所拥有的表,它只返回用户所对应方案的所有表

比如:select table_name from user_tables;

           

all_tables: 当前用户可以访问的表,它不仅会返回当前用户方案的所有表,还会返回当前用户可以访问的其它方案的表

比如:select table_name from all_tables;

 

dba_tables: 它会显示所有方案拥有的数据库表。但是要求用户必须是dba角色或是有select any table 系统权限

例如:当用system用户查询数据字典视图dba_tables时,会返回system,sys,scott...方案所对应的数据库表。

用户、权限、角色

dba_users:显示所有数据库用户的详细信息

select * from dba_users;

dba_sys_privs:显示用户所具有的系统权限

select * from dba_sys_privs;

dba_tab_privs:显示用户具有的对象权限

select * from dba_tab_privs;

dba_col_privs:显示用户具有的列权限

select * from dba_col_privs;

dba_role_privs:显示用户所具有的角色

select * from dba_role_privs;

ORACLE 入门

问题1:如何查询一个角色包括的权限?

a.一个角色包含的系统权限

select * from dba_sys_privs where grantee='角色名'

另外也可以这样查看:

select * from role_sys_privs where role='角色名'

b.一个角色包含的对象权限

select * from dba_tab_privs where grantee='角色名'

问题2:oracle究竟有多少种角色?

SQL> select * from dba_roles;

问题3:如何查看某个用户,具有什么样的角色?

select * from dba_role_privs where grantee='用户名'

显示当前用户可以访问的所有数据字典视图。

select * from dict where comments like '%grant%';

显示当前数据库的全称

select * from global_name;

ORACLE 入门

ORACLE 入门

ORACLE 入门

ORACLE 入门

ORACLE 入门

动态性能视图

不常用 略

 

8.表空间

显示表空间

1)、查询所有表空间

select tablespace_name from dba_tablespaces;

2)、知道表空间名,显示该表空间包括的所有表
select * from all_tables where tablespace_name=’表空间名’;
egselect * from all_tables where tablespace_name='DATA01'; --DATA01要大写格式
3) 知道表名,查看该表属于那个表空间
select tablespace_name, table_name from user_tables where table_name='EMP';

建立表空间

1)、建立数据表空间
在建立数据库后,为便于管理表,最好建立自己的表空间
--路径D:\dev\oracle\product\10.2.0\要存在,否则创建不成功
create tablespace data01 datafile

 'D:\dev\oracle\product\10.2.0\dada01.dbf' size 20m uniform size 128k; 
说明:执行完上述命令后,会建立名称为data01的表空间,并为该表空间建立名称为data01.dbf的数据文件,区的大小为128k

2)、使用数据表空间
create table mypart(  deptno number(4),  ...,) tablespace data01;

 

例:建立表空间并给用户指定默认表空间,查询当前用户的表空间

ORACLE 入门

ORACLE 入门

改变空间表状态

当建立表空间时,表空间处于联机的(online)状态,是可以访问的和读写的,但是在进行系统维护或是数据维护时,可能需要改变表空间的状态。一般情况下,由特权用户或是dba来操作。
1)使表空间脱机
alter tablespace 表空间名 offline;
egalter tablespace data01 offline;--表空间名不能加单引号
2)使表空间联机
alter tablespace 表空间名 online;
egalter tablespace data01 online;
3)只读表空间
当建立表空间时,表空间可以读写,如果不希望在该表空间上执行updatedeleteinsert操作,那么可以将表空间修改为只读
alter tablespace 表空间名 read only;
注意:修改为可写是alter tablespace 表空间名 read write;)

删除表空间

一般情况下,由特权用户或是dba来操作,如果是其它用户操作,那么要求用户具有drop tablespace 系统权限。
drop tablespace ‘表空间’ including contents and datafiles;

扩展表空间

1. 增加数据文件
SQL> alter tablespace sp01 add datafile

 'D:\dev\oracle\product\10.2.0\dada02.dbf' size 1m;
2. 修改数据文件的大小
SQL> alter tablespace sp01

 'D:\dev\oracle\product\10.2.0\dada01.dbf' resize 4m;
这里需要注意的是数据文件的大小不要超过500m
3. 设置文件的自动增长。
SQL> alter tablespace sp01

 'D:\dev\oracle\product\10.2.0\dada01.dbf' autoextend on next 10m maxsize 500m;

移动数据文件

1. 确定数据文件所在的表空间
select tablespace_name from dba_data_files where 文件名大写

 file_name=upper('D:\dev\oracle\product\10.2.0\dada01.dbf');
2.
使表空间脱机
--确保数据文件的一致性,将表空间转变为offline的状态。
alter tablespace sp01 offline;
3.
使用命令移动数据文件到指定的目标位置
host move D:\dev\oracle\product\10.2.0\dada01.dbf

 c:\dada01.dbf;

4. 执行alter tablespace 命令
在物理上移动了数据后,还必须执行alter tablespace命令对数据库文件进行逻辑修改:
alter tablespace sp01 rename datafile

 'D:\dev\oracle\product\10.2.0\dada01.dbf' to 'c:\sp01.dbf';
5.
使得表空间联机
在移动了数据文件后,为了使用户可以访问该表空间,必须将其转变为online状态。
alter tablespace sp01 online;

 

 

9.oracle约束

约束

一、维护数据的完整性
数据的完整性用于确保数据库数据遵从一定的商业和逻辑规则,在oracle中,数据完整性可以使用约束、触发器、应用程序(过程、函数)三种方法来实现,在这三种方法中,因为约束易于维护,并且具有最好的性能,所以作为维护数据完整性的首选。

二、约束
约束用于确保数据库数据满足特定的商业规则。在oracle中,约束包括:not null unique primary key foreign keycheck 五种。
1)not null(非空)
如果在列上定义了not null,那么当插入数据时,必须为列提供数据。
2)unique(唯一)
当定义了唯一约束后,该列值是不能重复的,但是可以为null
3)primary key(主键)
用于唯一的标示表行的数据,当定义主键约束后,该列不但不能重复而且不能为null
需要说明的是:一张表最多只能有一个主键,但是可以有多个unqiue约束。
4)foreign key(外键)
用于定义主表和从表之间的关系。外键约束要定义在从表上,主表则必须具有主键约束或是unique 约束,当定义外键约束后,要求外键列数据必须在主表的主键列存在或是为null
5)check
用于强制行数据必须满足的条件,假定在sal列上定义了check约束,并要求sal列值在1000-2000之间如果不在1000-2000之间就会提示出错。

三、商店售货系统表设计案例一
现有一个商店的数据库,记录客户及其购物情况,由下面三个表组成:
商品goods(商品号goodsId,商品名goodsName,单价unitprice,商品类别category,供应商provider)
客户customer(客户号customerId,姓名name,地址address,电邮email,性别sex,身份证cardId)
购买purchase(客户号customerId,商品号goodsId,购买数量nums)
请用SQL语言完成下列功能:
1. 建表,在定义中要求声明:
(1). 每个表的主外键;
(2). 客户的姓名不能为空值;
(3). 单价必须大于0,购买数量必须在130之间;
(4). 电邮不能够重复;
(5). 客户的性别必须是男或者女,默认是男;

SQL> create table goods(
   goodsId
char(8) primary key, --主键
   goodsName varchar2(30),
   unitprice
number(10,2) check(unitprice>0),
   category
varchar2(8),
   provider
varchar2(30)
);
SQL
> create table customer(
   customerId
char(8) primary key, --主键
   name varchar2(50) not null, --不为空
   address varchar2(50),
   email
varchar2(50) unique, --唯一
   sex char(2) default '男' check(sex in ('男','女')), -- 一个char能存半个汉字,两位char能存一个汉字
   cardId char(18)
);
SQL
> create table purchase(
   customerId
char(8) references customer(customerId),
   goodsId
char(8) references goods(goodsId),
   nums
number(10) check (nums between 1 and 30)
);

表是默认建在SYSTEM表空间的

四、商店售货系统表设计案例二
如果在建表时忘记建立必要的约束,则可以在建表后使用alter table命令为表增加约束。但是要注意:增加not null约束时,需要使用modify选项,而增加其它四种约束使用add选项。
1)、增加商品名也不能为空
SQL> alter table goods modify goodsName not null;
2)
、增加身份证也不能重复
SQL> alter table customer add constraint xxxxxx unique(cardId);
3)
增加客户的住址只能是海淀’,’朝阳’,’东城’,’西城’,’通州’,’崇文’,’昌平
SQL> alter table customer add constraint yyyyyy check (address in ('海淀','朝阳','东城','西城','通州','崇文','昌平'));
删除约束
当不再需要某个约束时,可以删除。
alter table 表名 drop constraint 约束名称;
特别说明一下:在删除主键约束的时候,可能有错误,比如:alter table 表名 drop primary key;这是因为如果在两张表存在主从关系,那么在删除主表的主键约束时,必须带上cascade选项 如像:alter table 表名 drop primary key cascade;
显示约束信息
1)、显示约束信息
通过查询数据字典视图user_constraints,可以显示当前用户所有的约束的信息。
select constraint_name, constraint_type, status, validated from user_constraints where table_name = '表名';
2)
、显示约束列
通过查询数据字典视图user_cons_columns,可以显示约束所对应的表列信息。
select column_name, position from user_cons_columns where constraint_name = '约束名';
3)
、当然也有更容易的方法,直接用pl/sql developer查看即可。简单演示一下下...

五、表级定义、列级定义
1)、列级定义
列级定义是在定义列的同时定义约束。
如果在department表定义主键约束

create table department4(
   dept_id
number(12) constraint pk_department primary key,
   name
varchar2(12),
   loc
varchar2(12)
);

2)、表级定义
表级定义是指在定义了所有列后,再定义约束。这里需要注意:
not null约束只能在列级上定义。
以在建立employee2表时定义主键约束和外键约束为例:

create table employee2(
   emp_id
number(4),
   name
varchar2(15),
   dept_id
number(2),
  
constraint pk_employee primary key (emp_id),
  
constraint fk_department foreign key (dept_id) references department4(dept_id)
);

 

 

10.索引

创建索引

1.单列索引

语法:create index 索引名 on 表名(列名);
egcreate index nameIndex on custor(name);

2.复合索引

create index emp_idx1 on emp(ename, job);

同一张表上可以有多个索引,但要求列的组合不同

使用原则以及缺点

使用原则:

1)、在大表上建立索引才有意义
2)、在where子句或是连接条件上经常引用的列上建立索引
3)、索引的层次不要超过4

索引的缺点:

1)、建立索引,系统要占用大约为表1.2倍的硬盘和内存空间来保存索引。
2)、更新数据的时候,系统必须要有额外的时间来同时对索引进行更新,以维持数据和索引的一致性。

不恰当的索引在进行插入、修改和删除操作时比没有索引花费更多的时间。
例如:
1. 很少或从不引用的字段;
2. 逻辑型的字段,如男或女(是或否)等。
综上所述,提高查询效率是以消耗一定的系统资源为代价的,索引不能盲目的建立,这是考验一个DBA是否优秀的很重要的指标

显示索引信息

数据字典视图:

dba_indexs :显示数据库所有的索引信息

user_indexs :显示当前用户的索引信息

user_ind_columns :显示索引对应列的信息

显示索引信息:

select index_name, index_type from user_indexes

where table_name = '表名';

显示索引列信息:

select table_name, column_name from user_ind_columns where index_name ='IND_ENAME';

 

11.触发器

 

 

 

12.pl/sql

 

SET serveroutput ON;

  DECLARE

  V_SAL   EMP.SAL%TYPE;

  V_ENAME EMP.ENAME%TYPE;

  BEGIN

  SELECT ENAME, SAL INTO V_ENAME, V_SAL FROM EMP WHERE EMPNO = &NO;

  IF V_SAL < 3000 THEN

    UPDATE EMP SET COMM = SAL * 0.1 WHERE ENAME = V_ENAME;

    dbms_output.put_line('1111');

  ELSE

    NULL;

    dbms_output.put_line('2222');--不会被执行???????????

    END IF;

  END;

 

 

 

13.问题解决

问题:

ORACLE 入门

解决:

ORACLE 入门

1)测试窗口   (serveroutput命令是sqlplus命令,在pl/sql中只能在conmmand窗口使用)

执行:

ORACLE 入门

显示:

ORACLE 入门

2)command窗口

ORACLE 入门

3)存储过程procedure

定义:

ORACLE 入门

执行:

ORACLE 入门

 

 

 

 

 

 

查询示例:

查询相同记录下日期最大的一条:

  select edu.PERSON_ID,edu.EDUCATION_INFO_ID, edu.GRADUATE_DATE,edu.GRADUATE_SCHOOL  from TBL_HRM_EDUCATION_INFO edu

            where edu.GRADUATE_DATE in (select max(b.GRADUATE_DATE) from TBL_HRM_EDUCATION_INFO b where b.person_id=edu.person_id) order by edu.PERSON_ID

-----------------------

      查询人员表,其中人员学历信息由学历信息表查询,并且同一人的学历信息取时间最往后的一条:

 select  p.PERSON_ID,

         p.UNIT_ID,

         p.POST_ID,

           p.GRADES_ID,

           p.EDUCATION_ID,

           p.DEGREE_ID,

           p.GRADUATE_SCHOOL, 

          。。。。。。

           p.SUBMIT_STATUS,

           (select edu.GRADUATE_SCHOOL  from TBL_HRM_EDUCATION_INFO edu

            where edu.GRADUATE_DATE in (select max(b.GRADUATE_DATE) from TBL_HRM_EDUCATION_INFO b where b.person_id=edu.person_id)

            and p.PERSON_ID=edu.PERSON_ID) as GRADUATE_SCHOOL ,需要加别名,否则eclpse里面列名一长串无法识别

           (select edu.GRADUATE_DATE  from TBL_HRM_EDUCATION_INFO edu

            where edu.GRADUATE_DATE in (select max(b.GRADUATE_DATE) from TBL_HRM_EDUCATION_INFO b where b.person_id=edu.person_id)

            and p.PERSON_ID=edu.PERSON_ID) as GRADUATE_DATE               

    from TBL_HRM_PERSON p  where p.unit_id='137'

 

 

 

 

 

 

 

 

 

相关文章:

  • 2022-01-09
  • 2022-02-10
猜你喜欢
  • 2021-12-26
  • 2021-04-29
  • 2021-07-23
相关资源
相似解决方案