日期:2014-05-16  浏览次数:20604 次

Oracle学习小结

小型数据库:access,foxbase
你该用什么数据库?
1.项目规模:
a,负载量多大,用户多大
b,成本
c,安全性
成本在千元内
负载量小,100人内,比如留言板,信息系统
以成本在千元内,对安全性要求不高.

中型数据库:mysql,sql server,informix
比如在负载 日访问量5000-15000,成本在万元内
比如商务网站.

大型数据库:sybase,oracle,db2
负载可以处理海量数据库.
sybase<oracle<db2
这几个数据库安全性很高,相对贵.
-------------------------------
修改密码:
passw

create user xiaoming identified by m123;
drop user xx cascade

权限:
系统权限:用户对数据库的相关权限.
对象权限:用户对其他用户的数据对象操作的权限.
grant select on emp to xiaoming;
grant all on emp to xx;
revoke select on emp from xx;
grant all on emp to xx with grant option;
grant connect to xx with admin option;


Oracle用户管理:
创建profile文件
create profile lock_account limit
failed_login_attempts 3 password_lock_time 2;
alter user tea profile lock_account;
解锁:alter user tea account unlock;
定期更新密码(强制):
create profile myprofile limit password_life_time
10 password_grace_time 2;
alter user tea profile myprofile;

口令历史:禁止使用以前使用过的密码.
create profile password_history limit password_life_time
10 password_grace_time 2 password_reuse_time 10;
删除profile:
drop profile password_history [cascade];

表名和列名的命名规则:
必须以字母开头
长度不能超过30字符
不能使用Oracle保留字.
只能使用如下字符a-z,0-9,$,#等.

数据类型:
字符型:char,varchar2,clob
char的查询速度极快.
varchar 最长为4000
数字型:number
number(5,2):一共五位,有两位小数
number(5):五位整数
日期类型:date,timestamp
图片类型:blob,二进制数据,可以存放图片/声音 4G.
alter table student add(classid number(2));
alter table student modify(xm varchar2(3));
alter table student modify(xm char(30));
alter table student drop column sal;
rename student to stu;
drop table student;
修改日期格式:
alter session set nls_date_format = 'yy-mm-dd';
删除数据
delete from student;
drop table student;
delete from student where xx=xx
truncate table student;
savepoint a;
rollback; / rollback to a;
=====================
查询
查看表结构:desc dept;
select * from xx ; 对速度影响很大.
所以在查询时最好写出列名.
set timing on;

begin
for i in 1 .. 100000 loop
insert into users(userid,username,password)
select * from users;
end loop;
end;
如何处理NULl值:nvl(xx,xx)
使用LIKE操作符
% 表示任意多个字符
_ 代表任意单个字符.

--------------
对数据分组的总结
1,分组函数只能出现在选择列表,having,order by 子句中.
2,顺序:group by , having, order by.

多表查询
避免笛卡尔积
规定:多表查询的条件至少不能少于表的个数-1

子查询
单行子查询,多行子查询.
数据库在执行sql是从左到右,所以将条件强的写到最右边.
select ename from emp where job in(
select distinct job from emp
where deptno=10);

select ename,sal from emp where sal>
all(select sal from emp where deptno=30);的执行效率不如
下面的高:
select ename,sal from emp where sal >
(select max(sal) from emp where deptno=30);

在多行子查询中使用all,any
--------------
* 子查询中返回多列
select ename,sal,job from emp
where(deptno,job)=
(select deptno,job from emp where ename='SMITH')

select ename,sal,mysal from emp e,
(select deptno,avg(sal) mysal from emp group by deptno) a
where e.deptno=a.deptno and e.sal>a.mysal order by e.sal

子查询被看作一个视图来对待,也叫内嵌视图,因此必须给内嵌视图
起一个别名,不然是没法用的.并且起别名时,不能加as,为表起别名
不加as,列可以加as.
---------------------
分页查询
共有三种方式:
1,rownum分页
select * from (select a1.*,rownum rn from (select * from emp) a1
where rownum<=10) where rn>=6;
2,根据rowid来分
select * from xx where rowid in(
select rid from (select rownum rn,rid from(
select rowid rid,cid from xx order by cid desc)
where rownum<10000)where rn>9980 order by cid desc;
3,根据分析函数,效率最低

create table myemp (id,ename,