51CTO下载中科院ORACLE数据库视频教程总结Word格式.docx
《51CTO下载中科院ORACLE数据库视频教程总结Word格式.docx》由会员分享,可在线阅读,更多相关《51CTO下载中科院ORACLE数据库视频教程总结Word格式.docx(29页珍藏版)》请在冰点文库上搜索。
grantupdate(name)onmytabtolisi;
//把更新name列的权限授权给lisi(将权限限定到列)
(updatewuangwu.mytabsetname='
lihuoming'
whereid=1;
)
grantinsert(id)
onmytabtolisi;
revokeselectonmytabfromlisi;
altertablemytabaddnamevarchar(10);
//修改表结构
oracle默认的是手动提交数据(commit)
ddl:
数据定义语言(创建,修改表)
dml:
数据操纵语言(插入,删除,更新等)需要提交
dcl:
数据控制语言(授权和撤销权限)
权限的传递:
把权限给A,A在传递给B
showuser;
查看当前用户
sys把alter权限给lisi:
grantalteranytabletolisi;
默认lisi不能把alter权限给wangwu
可以这样:
grantalteranytabletolisiwithadminoption;
对象权限传递:
sys创建表A,sys把查询的权限给lisi,但是lisi不能把该权限授给其他人
grantselectonAtolisiwithgrantoption;
角色:
createrolemyrole;
grantcreatesessiontomyrole;
grantcreatetabletomyrole;
createuserzhangsanidentifiedbyzhangsan;
grantmyroletozhangsan;
droprolemyrole;
有些系统权限不能够放在角色里面:
比如:
grantunlimitedtablespacetomyrole;
会出现无法将该权限放在myrole里面
只能直接将该权限给用户!
createanytable的权限:
不仅可以给自己创建表还可以给其他人创建表
不过要先给他赋予使用空间的权限
表是属于某一个用户的,角色不属于某个用户
丢失管理员密码:
比如普通用户的密码丢失了:
sys登陆,然后alteruserscottidentifiedby新密码
如果sys密码丢失:
oracle三种验证机制:
操作系统验证:
密码文件验证:
数据库验证:
普通用户
sys用户可以启动和关闭数据库,那么数据库没有启动sys就可以进入数据库里面去(但是监听和实例必须启动,否则会出现协议适配器错误),所以sys用户采用操作系统和密码文件验证
linux下oracle的启动过程
lsnrctlstart(监听程序)
sqlplussys/密码assysdba
startup启动数据库实例
windows下oracle的启动过程
lsnrctlstart
oradim-startup-sidorcl
conn/assysdba为什么不写密码也能够进入数据呢?
?
因为sysdba是操作系统验证,右击我的电脑,选择管理,组,双击ora_dba,在这个组里的用户都是sysdba,所以不用密码,那么你可以将改组的用户给删除了,那么conn/assysdba就不能进去了!
然后conn用户名/密码assysdba就采用密码文件验证
为了安全应该删除操作系统验证,那么只能采用密码文件验证,如果密码忘记了.......
密码文件在d:
\database\PWDorcl.ora,可以先把他删除,然后在建立:
orapwdfile=d:
\database\PWDorcl.orapassword=123456entries(允许在该文件中建立特殊用户的个数)=10
createuserabc
indentifiedbyabc
defaulttablespaceUsers(默认表空间,存放用户的数据)
TemporaryTablespaceTemp(临时表空间,比如排序,将临时数据放在这个空间里面)
Quota50Monusers(abc用户只能用50M表空间)
临时表空间上不能使用限额
限制用户:
用户加锁:
alteruser用户名accountlock
用户解锁:
alteruser用户名accountunlock
注意:
commit
用户口令失效:
alteruser用户名passwordexpire
删除用户:
dropuser用户名[cascade强制删除用户下的所有文件]
中科院oracle视频:
1.oracle体系结构:
a.实例和数据库
.数据库实例也称为服务器,是指用于访问数据库文件集的存储结构(统称为SGA)和后台进程的集合,一个数据库可以被多个实例访问,数据库的物理结构和存储结构之间的关系是由后台进程来维持的,数据库拥有多个进程.........
.数据库指的是一个数据容器,包含了表,索引,视图,过程,函数,包等对象,并对其进行统一管理,用户只有和一个确定的数据库连接,才能使用和管理该数据库中的数据,数据库的内部结构:
表空间,表,列,分区,用户,索引,视图权限,角色,段,盘区,块等;
外部结构有:
控制文件(.ctl),日志文件(联机日志文件(redo01.log,第一个写满之后,写在第二个,然后写在第三个,然后再写在第一个,默认此时第一个文件被覆盖掉),归档日志文件是在进行热备份时候选择的日志文件格式),数据文件(.dbf).....
控制文件管理和控制数据文件和日志文件,启动实例后-->
启动控制文件-->
打开数据文件
.查看控制文件:
DESCv$controlfile
selectstatus,namefromv$controlfile
.查看数据文件:
DESCv$datafile
selectfile#,namefromv$datafile
.查看日志文件:
DESCv$logfile
selectmemberfromv$logfile
.参数文件(并不是数据里面的有效组成部分,数据库启动时候参数文件不直接参与工作,不过控制文件是由参数文件来寻找的):
物理结构
参数文件
控制文件
控制文件
数据文件
日志文件
日志文件
b.内存结构
.当oracle的一个实例运行的时候,他分配了一个称为SGA(系统全局区)的大的内存块,实例的SGA被该实例的所有后台进程所共享,整个SGA的区里面有:
数据库高速缓存池,大共享区,共享池,日志缓存池,固定SGA。
.数据库高速缓存池:
如果每执行一个sql查询的时候,oracle都从磁盘读取数据块,并且在改变之后,又必须把每一个数据块写入磁盘,那么oracle执行效率会非常慢,而oracle的缓存区经常能够使用内存里的数据块,在那里访问数据,内存中用来频繁访问数据的区域叫数据库的高速缓存池!
数据库高速缓存池包括:
默认缓存池(),保持缓存池(对于想在内存中长期保存的,频繁访问的使用该缓存池,这个缓存池在数据库关闭之前一直保留,并不释放内存空间),再生缓存池(想尽快从内存中排除的对象我们可以使用再生缓存池,例如频繁访问的大表,除此之外还可以考虑默认缓存池)!
.共享池:
主要由库缓存区和字典缓存区构成!
用来缓存pl/sql的程序单元,sql语句的执行版本以及相关的执行计划。
共享池的规模对于数据库的性能有着非常重要的影响!
库缓存区中包括:
PL/SQL区(保留了pl/sql的过程,函数等程序单元的编译版本,以便于所有的用户能够共享)和共享SQL区(保留了sql语句的解释版本,以便再次使用的时候,不用重新解释)
c.逻辑结构
.主要由块(block),盘区(extent),段(segment),表空间(tablespace)组成!
.其中一个表空间对应一个或者多个数据文件,在物理结构时候,知道我们存储的对象信息,记录,数据都是存储在oracle的数据文件中的,但是在逻辑上,我们是将这些的表和表中的数据存储在表空间中
.一个表空间可以包含多个段
.段和物理的数据文件并不存在一一对应关系,一个段可能跨的不同的数据文件来存储
.一个段可以包含多个盘区
.一个盘区可以包含多个块
.oracle存储数据的基本单位是块,windows下默认块的大小是8k,oracle的块大小一定是操作系统的块大小的整数倍
2.sql*plus基础
.sys登陆必须以sysdba身份
.startup启动数据库实例-打开控制文件-打开数据文件,参数mount(启动数据库实例的时候,打开控制文件,不启动数据文件),nomount(启动实例,连控制文件都不打开,一般在控制文件丢失的时候使用此参数,然后ALTERDATABASEMOUNT,alterdatabasesopen)
.我们进行热备份的时候,是不允许进行非归档方式的!
我们要修改在归档模式下进行热备份,但是在数据库已经启动的情况下是不允许修改的,那么我们只能先关闭数据库,关闭之后在启动实例startupmount打开控制文件,但是不能打开数据文件,然后:
alterdatabasesarchivelog然后alterdatabasesopen
.关闭:
shutdownimmediate(迫使每个用户执行完当前的sql语句后立即断开连接)/abort(强迫关闭数据库,很可能造成文件破坏)/transactional(迫使用户在当前执行完程序后,断开连接,终止实例,恢复破坏的文件和数据文件,不能同其他的数据库文件保持一致)
.想使用oracle数据库,那么首先就得启动两个服务:
一个是启动监听程序lsnrctlstart,一个是启动实例oradim-startup-sidorcl
.sql*plus也可以在浏览器中控制,建议使用这中方式
常用的一些sql*plus命令:
保存缓存区的命令:
savec:
\oracle\test.txt
编辑缓存区的命令:
edit
执行外部文件:
@c:
查看外部文件:
getc:
列出缓存区的命令:
list
再一次执行缓存区的命令:
/
查看命令的用法:
?
命令
对部门的名称给一个标签:
coldeprnoHeading"
编号"
或者是格式化输出:
coldepartmentformatA10(显示10个字符)/999,999,999(整型的格式化)
heading"
设置报表:
设置行宽:
setlinesize50
标题居中并且指定名称:
ttitlecenter"
我的主题"
skip1-(指的是报表空一行)
left"
测试报表"
right"
页"
-(指sql语句换一行写)
format999sql.pnoskip2(页和数字之间空2行)
关闭标题:
ttitleoff
报表的重要的命令:
break和comp
重复的记录值显示一条:
breakonpub
select*frombook
统计:
compcountlable"
计数"
ofbooks_name(字段)onpub
将数据保存起来:
spoolc:
\orcle\test.txt
select*.....
spooloff
3.sql语言基础:
.语言分类:
DDL(数据定义语言):
create,drop,alterDCL(数据控制语言):
grant,revokeDML(数据操纵语言):
selectinsertdeleteupdate
.常用的系统函数:
字符:
查看字符个数selectlength('
abcdef'
)fromdual;
截掉左边空格:
selectltrim('
截掉右边空格:
selectrtrim('
截掉空格:
selecttrim('
abcdef'
查看字节个数:
selectlengthb('
取子字符串(从第二个位置取三个bcd):
selectsubstr('
2,3)fromdual;
右取三个:
length('
abcdefg'
)-3+1,3)
时间:
查看当前时间:
selectsysdatefromdual;
selectcurrent_datefromdual;
设定当前时间的格式:
altersessionsetnls_date_format='
dd-mon-yyyyhh:
mi:
ss'
;
当前日期为准,星期三是多少号:
selectnext_day(sysdate,'
星期三'
转换类型:
日期转换为字符串24小时制:
selectto_char(sysdate,'
yyyy24-mm-ddhh:
日期转换为字符串16小时制:
yyyy-mm-ddhh:
字符串转化为日期:
selectto_date('
12-3月-04'
字符型转换为整型:
selectto_number('
99'
聚集函数:
sum:
selectsum(price)frombooks;
max:
......
min:
........
avg:
平均值
count:
count(*)表的行数count(price):
字段的行数
其他:
查看当前登陆用户:
selectuserfromdual;
查看性别为男和女分别有多少人:
selectsum(decode('
sex'
'
男'
1,0)),sum(decode('
女'
,1,0))frome;
decode和if差不多
selecta1,nvl(a2,'
没有输入'
)a2fromaa;
nvl查看是否为空值
分组语句:
selectpub,sum(price*qty)frombooksgroupbypub;
groupby后面可以多于前面select中的字段,但是不能少!
聚集函数不能出现在where下面,只能用having
selectpub,sum(price*qty)frombooksgroupbypubhavingsum(price)>
50;
模糊查询:
select*fromaawherea1like'
a_'
'
a__'
a%'
__a'
%a'
%a%'
连接查询:
selecteid编号,ename姓名,sex性别,d.name所在部门frome,dwheree.id=d.id
内连接(完全匹配):
selecteid编号,ename姓名,sex性别,d.name所在部门fromejoindone.id=d.id
外连接(不完全匹配):
左外连接:
selecteid编号,ename姓名,sex性别,d.name所在部门frome,dwheree.id=d.id(+)
右外连接:
selecteid编号,ename姓名,sex性别,d.name所在部门frome,dwheree.id(+)=d.id
子查询:
无关子查询:
select*fromewhereidin(selectidfromd);
select*fromewhereexists(selectidfromd);
相关子查询:
select*fromewhereidin(selectidfromdwhereid=e.idandid='
03'
);
select*fromewhereexists(selectidfromdwhereid=e.id);
把符合的查询出来
select*fromewherenotexists(selectidfromdwhereid=e.id);
把不符合的查询出来
合并行数据:
selecteid,enamefromeunionselectid,namefromd;
选出都有的数据:
selectidfromeintersecselctidfromd;
每次插入多条记录:
insertintoe(eid,ename)selectid,namefromd;
把另外一个表中的数据写入e表中,类型要匹配。
复制表:
createtablettas(select*frome);
4.PL/SQL基础
pl/sql块结构如下:
declare
...(变量声明)
begin
....(代码处理)
exception
....(异常处理)
end;
变量声明:
赋予变量适当名称
赋予变量正确的数据类型
定义变量(标准,记录)
控制变量范围
变量长度范围:
1~30
例子:
Declare
xvarchar2(10);
x:
='
thisis..'
DBMS_OUTPUT.PUT_LINE('
xis'
||x);
END;
让服务器的输出打开:
setSERVEROUTPUTONSIZE10000
上面的DBMS_OUTPUT是个包
行注释:
--
块注释:
/*
*/
赋初值:
xvarchar2(10):
abcde'
xSTRING(10):
yINTEGER:
=123;
yNUMBER:
分支语句:
if分支
.....