0.DBMS下是一个个的oracle实例
1.oracle10g 安装路径不能有中文
2.安装时,确保本机没有安装oracle,可以在计算机管理服务中查看是否有oracle的服务
2.1 oracle中的DB实例可以认为是一个数据库!
3.oracle的3层结构:
①client
② Oracle DBMS
③DB实例,每个DB实例可以包含若干的数据对象(如表,视图等)
4.每当创建一个数据库实例,会自动创建3个用户:
sys 用户 (超级管理员 权限最大)
system用户 (管理员 权限仅次于sys)
scott 用户 (普通用户)
把scott解锁: alter user scott account unlock;
5.oracle的企业管理器:
可以从浏览器去访问oracle数据库,但是需要保证OracleDBConsoleorcl服务启动
可以在浏览器输入:http://ip地址:1158/em
6.oracle常用命令:
6.1:conn[ect]
用法:conn 用户名/密码@网络服务名[as sysdba/sysoper] 常用于切换用户,建议登录时,使用
普通用户【如scott】登录
当用特权用户身份连接时,必须带上as sysdba 或者 as sysoper
6.2:disc[onnect] 该命令用来断开与当前数据库的连接 但是不退出sql*plus
6.3: passw[ord] 该命令用户修改用户的密码,如果想修改其他用户的密码,
需要使用sys/system登录
如果给自己修改密码,直接使用passw 密码 ,如果给其他用户修改,指定用户名【当然,要有这样的权限】
6.4: show user 显示当前用户名
6.5:exit 该命令会断开与数据库的连接,同时会退出sql*plus
7:其他命令:
7.1 & 可以替代变量,而该变量在执行时,需要用户输入
sql>select * from emp where job='&别名'
7.2 edit 该命令可以编辑指定的sql脚本
sql> edit d:\a.sql
7.3 spool 该命令可以将sql*plus 屏幕上的内容输出到指定的文件中去
sql>spool d:\b.sql 并输入sql>spool off
详细用法:
sql>spool on
sql>spool d:\bak.sql
sql>select * from emp;
sql>spool off
8.1 set linesize 140 用于设置每行显示多少个字符【默认是一行显示80个字符】
8.2 pagesize 设置每页显示多少行
9.给数据库创建用户:
用法:create user 用户名 identified by 密码
如 创建一个用户叫xiaoming 分配密码是m123
create user xiaoming identified by m123
注意:密码的数值不能以数字开头
学习提醒:如果在操作数据库的时候,发生错误,可以把错误号在google上搜索,查找解决方案
注意:这样创建一个用户后,还不能够登录,原因后面解释?
10.给用户修改密码:【需要有DBA权限】
alter user 用户名 identified by 新密码
11.创建用户细节:
create user zhengyi identified by zhengyi100
default tablespace users //默认表空间
temporary tablespace temp //临时表空间
quota 3m on users;
identified by 表示该用户zhengyi将用数据库方式验证default tablespace users//用户的表空间在users上
temporary tablespace temp 表示用户zhengyi的临时表建立在temp 空间
quota 3m on users //表明用户zhengyi建立的数据对象(表,索引,视图,pl/sql块等),最大只能是3M
名称解释:
表空间:表存在的空间【逻辑上的,其实表也是一个逻辑上的概念】
oracle设计者为了方便管理文件,创建表空间这个逻辑概念,
人为的给表设置存放的空间,指向具体的数据文件
12:上面创建的用户是没有权限的,需要DBA给该用户授权
sql>grant connect to zhengyi
sql>grant create session to zhengyi
如果希望该用户建表的时候没有空间的限制
sql>grant resource to zhengyi
如果希望该用户成为DBA
sql>grant dba to zhengyi
回收权限:revoke 语法跟grant一样
13.oracle管理用户的机制(原理)
①oracle的权限:大致上可以分为2中权限
一是:系统权限:【据说包括166种】,是和数据库本身的管理相关的权限
如create session 是登陆权限,create table/index/view/sequence/trigger……
可以查询数据字典视图:system_privilege_map ,来显示所有系统权限:
select * from system_privilege_map order by name;
授予系统权限:一般情况下,授予系统权限是由DBA来完成的,如果由其他用户来授予系统权限,
则要求该用户必须具有grant any privilege 的系统权限,在授予系统权限的时候,可以带有
with admin option //with admin option表示可以把获得的权限向别的用户转发【回收也一样】 选项,这样,被授予权限的的用户或是角色还可以把该系统权限授予其他的用户或者角色
【注意:】权限的回收不是级联回收
二是:对象权限【17种】:是和用户操作数据对象相关的权限,如update/insert/delete/select/alter/index/references/execute
对象权限:指访问其他方案对象额权利,用户可以直接访问自己方案的对象,但是如果要访问别的方案的对象,则必须具有对象的权限
查看oracle提供的所有对象权限(DBA用户可以查看)
select distinct privilege from dba_tab_privs;
②oracle的角色:【简化对权限的操作】
【创建每个用户,都去分配权限,很麻烦,所以把常用的权限集中起来,形成了现在的角色】
一是:预定义角色。把常用的权限集中起来,如DBA,connect,resource
二是:自定义.自己定义角色
方案:是oracle管理数据对象的方式,当一个用户创建了任意一个数据对象后,DBMS就会创建一个与之
同名的一个方案,该用户创建的数据库对象会默认放在该方案下。
14.综合案例:创建一个用户xiaohong,然后给她分配2个角色,可以让xiaohong
登录、创建表、可以操作(crud)自己创建的表,然后回收角色,最后删除用户
(1)使用system创建xiaohong
sql>create user xiaohong identified by m123
----------------------------------------------
(2)给xiaohong分配2个常用的角色
sql>grant connect to xiaohong ;
sql>grant resource to xiaohong;
----------------------------------------------
(3)让xiaohong登录
sql>conn xiaohong/m123
----------------------------------------------
(4)xiaohong修改密码
sql>password xiaohong 新密码
----------------------------------------------
(5)xiaohong创建一张简单的表
create table users(id number);
----------------------------------------------
(6)使用system登录,然后回收角色【自己不能回收自己的权限,角色,需要有DBA角色的人才行】
sql>revoke connect from xiaohong;
sql>revoke resource from xiaohong;
(7)删除用户
sql>drop user xiaohong [cascade];// cascade是可选项
注意:当删除一个用户的时候,如果这个用户创建过数据对象,那么
在删除该用户的时候,需要使用cascade进行级联删除
15.当一个用户创建后,而且该用户创建了一个数据对象,这时,
Oracle的DBMS就会创建一个方案(schema,也是逻辑概念)与该用户对应,并且,该方案的名字和
用户名一致,不同用户创建的数据对象都放在自己对应的方案中。
所以不同用户的方案中,表名是可以相同的!
小技巧:如果想查看某个用户下有哪些数据对象,可以使用pl/sql developer 这个软件,
用该用户登录进去,选择My Objects,就可以查看该用户的数据对象
16.如何让一个用户(如xiaohong)去查看另外一个用户如scott的emp表呢?
①先用scott登录
sql>conn scott/tiger
②赋权限
sql>grant select[update/delete/insert/all(all表示这4中权限都有)]
on emp(表名) to xiaohong(用户名)
③使用xiaohong登录,就可以查询scott方案中的emp表,
注意1:如果只赋了select权限给xiaohong,那么xiaohong只能查询,不能进行其他
操作(比如不能update delete等)
注意2:如果xiaohong的方案中也有emp表,那么查询的时候查询的是xiaohong自己的emp表,
所以,如果去查询别的方案中的表,需要带上方案名称【查询其他方案的表必须带上其他方案名称】
如对于xiaohong,查询scott方案中的emp表:
select * from scott.emp; //这样就可以正常的查询了
17.如果某个用户被授予某个权限后,如果该用户想把自己获得的权限赋给其他的用户
,可以使用with admin/grant option
系统权限:with admin option
对象权限:with grant option
sql>grant all on scott.emp to zhengyi with grant option
或者
sql>grant select on scott.emp to zhengyi with grant option
18:使用profile管理用户口令
profile是口令限制,资源限制的命令集合,当建立数据时,oracle会自动创建名称为default的
profile,oracle会将default分配给用户
(1)账户锁定:指定该账户登录时最多可以输入密码的次数,也可以指定用户锁定的诗句(天),
一般用DBA的身份去执行该命令
例子:指定scott这个用户最多只能尝试3次登录,锁定时间为2天?
sql>create profile lock_account(文件名) limit failed_login_attempts 3 password_lock_time 2;【数值的单位都是天数】
sql>alter user zhengyi profile lock_account【把lock_account这个文件分配给用户zhengyi】
(2)如何给用户解锁:
sql>alter user 用户名 account unlock
(3)终止口令:
为了让用户定期修改密码可以使用终止口令的指令来完成,同样命令也需要DBA的身份
sql>create profile myprofile(文件名) limit password_life_time 10
password_grace_time 2;【密码有效期是10天,过了10天后宽限天数是2天】
然后分配文件:sql>alter user 用户名 profile 文件名
解锁:sql> alter user 用户名 account unlock
(4)如果用户的密码到期了,oracle会强制提示用户修改密码,这时,如果不希望用户新修改的密码和以前一样,可以使用口令历史
[1]建立profile
sql>create profile password_history(文件名) limit password_life_time 10
password_grace_time 2 password_reuse_time 1;
//password_reuse_time 指定口令可重用时间,即10天后就需要修改
[2]分配给某个用户
sql>alter user zhengyi profile 文件名
(5)删除profile文件
sql>drop profile 文件名
19:oracle数据库的启动流程
oracle也可以通过命令行的方式启动:
在windows下:
1) lsnrctl start (启动监听)
2) oradim -startup -sid 数据库实例名【如orcl】[如oradim -startup -sid orcl]
在Linux下:
1) lsnrctl start (启动监听)
2) sqlplus sys/change_on_install as sysdba (以sysdba身份登录,在10g后可以这样写)
sqlplus /nolog
conn sys/change_on_install as sysdba
3) start up
20:在DOS下查看windows系统是什么时候装的:
命令:systeminfo
21.oracle的认证方式-windows下:
oracle登录认证在windows下和linux下是不完全相同的,以windows为例:
①操作系统认证
如果当前用户属于本地操作系统的ora_dba组(对windows而言),即可通过操作系统认证
②oracle数据库验证(密码文件验证)
对于普通用户,oracle默认使用数据库验证。
对于特权用户(比如sys用户),oracle默认使用操作系统认证,如果验证不通过,
再到数据库验证(即密码文件验证)。通过配置sqlnet.ora文件,可以修改oracle登录认证方式:
sqlnet.authentication_services=(NTS)是基于操作系统验证;
sqlnet.authentication_services=(none) 是基于oracle验证;
sqlnet.authentication_services=(none,NTS)是二者共存。
例子:如果当前用户是属于本地操作系统的ora_dba组,那么即使不知道oracle用户名和密码,也能进入:
如下:使用sqlplus:
sql>conn system/xxxxx as sysdba //这样也能进入
sql>show user; //发现结果是:USER 为SYS
sql>conn xxxx/ssss as sysdba //这样也能进入
sql>show user; //发现结果是:USER 为SYS
原因就是,当前用户是属于本地操作系统的ora_dba组,这样是很恐怖的一件事情
注意事项:
1:【只要改用户在ora_dba组中】如果登陆的时候使用conn system/xxxxx as sysdba ,当DBMS看到as sysdba,则认为,要以特权用户登录,前面的用户名和密码不看,登录后,自动切换成sys用户
2:如果当前用户不在ora_dba组中,则使用数据库验证方法【上面的方法就无法登录】
3:可以通过修改sqlnet.ora文件,让特权用户登录的时候,直接使用数据库验证,即
sqlnet.authentication_services=(NTS)//默认是NTS,改为none后就采用数据库验证方式
22.丢失管理员密码怎么办?
恢复办法:把原有密码文件删除,生成一个新的密码文件
恢复办法:
①搜索名为:PWD数据库实例名.ora文件
②先把这个文件保存一份,然后删除该文件
③生成新的密码文件,在dos控制台下输入命令:
orapwd file = 原来密码文件的全路径\密码文件名.ora password=新密码 entries=10
//entries 允许几个特权用户
注意:密码文件名,一定要跟原来的密码文件名一样,如果需要生效,需要重启数据库实例
23.如果某个用户离职,但是需要使用他创建的数据对象,可以锁定该用户,用法如下:
如锁定用户zhengyi
sql>alter user zhengyi account lock;//锁定用户
sql>alter user zhengyi account unlock ;//解锁用户
====================================================================================
1.oracle数据类型:
①文本、二进制类型(包括char, varchar2,nchar,nvarchar2,clob,blob)
char(size) 例如char(32)定长,最大2000字符,超过报错,不够2000字符的用空格补充[size最好是16的倍数,下同]
varcha(size) 例如varchar(32)变长,最大4000字符,存多少就是多少字符,超过4000的报错
nchar(size) Unicode数据类型,定长,最大2000字符【unicode编码】
nvarchar(size) Unicode数据类型,变长,最大4000字符
clob(size) [character large object] 字符型大对象,最大8tb
blob(size)[binary large object] 二进制数据,可以存放图片,声音,最大8tb
②数值类型
number(p,s),其中p为整数位,s为小数位,s可以为负数,number可以理解为可变的数值类型,放得多占的字节就多
其中1<=p<=38,-84<=s<=127,保存在机器内部的范围是1~22bytes
例如:123.89 number(6,-2) 实际存放进数据库后是100,可以理解为小数点左边2位,有四舍五入
167.89 number(6,-2) 实际存放进数据库后为200
【注意】实际开发中,如果没有特别的精度要求,直接写number
③时间日期
date 包含年月日时分秒,默认格式DD-MON-YYYY ,从公元前4712年1月,到公元4712年12月31日
timestamp(n) n的取值为0到9,表示指定timestamp中秒的小数位,n可选,如果n=0,timestamp与date等价【不推荐】
create table testdate(birthday date);
insert into testdate('2011-11-23')//这样插入数据会报错,但是用oracle的函数转换可以正常插入
insert into testdate('22-11月-13')//插入后是:2013年11月22日
【注意】在对数据进行更新时,timestamp会自动更新时间
2.dump(列名) 可以查看该列的详细类型[ascii码]
3.oracle中的有效位:从左往右,第一个非0的数就是第一个有效位
比如:number(5,2),表示有效位是5位,其中有2位小数,范围就是-999.99-999.99
【注意】如果定义时是number 没有写精度,那么默认是最大范围
===================================================================
1.对表的操作:
①添加新字段:alter table 表名 add(新列名 列的数据类型)
②修改字段类型:alter table 表名 modify(列名 新类型)
③删除一个字段:alter table 表名 drop column 列名
④修改表名:rename 旧表名 to 新表名
2.查看表的信息可以用:desc 表名
desc是description的缩写
3.oracle中字符和日期类型数据需要包含在单引号中
4.oracle中''等价于null
5.oracle也支持插入数据的时候,如果给所有列插入,可以直接写表名6.truncate table 表名 --> 删除表中的所有记录,表结构还在,不写日志,无法找回删除的记录,速度快
而delete table 表名 -->删除所有记录,表结构还在,写日志,可以恢复,速度慢
删除之前,设置个保存点,然后删除
sql>savepoint aa;
sql>delete from students;
sql>rollback to aa;
这样删除的数据就可以找回来了
7.oracle中的nvl()函数
sql>select nvl(salary,0)*12 from dual;// dual是虚表
注意:nvl(salary,0),当salary是null,nvl(salary,0)为0;如果salary不为null,返回salary自己的值
8.oracle中字符的拼接:
sql>select name ||'是一个'||job from emp;
9.oracle中日期转换函数:
sql>select * from emp where to_char(hiredate,'yyyy-mm-dd')>'1983-2-3';
sql>select * from emp where to_char(hiredate,'yyyy')='1983';//查询1983年入职的员工
sql>select * from emp where to_char(hiredate,'mm')='2';//查询4月份入职的员工
10.oracle中的模糊匹配:【like】
①% 表示任意0到多个字符
②_ 表示任意单个字符
11.oracle支持别名排序:
sql>select ename,sal*13+nvl(comm,0)*13 年薪 from emp order by 年薪;
12.avg(comm),count(*)函数会忽略comm=null的值,不计算在里面
13.group by ,having ,order by 如果同时出现有顺序:
顺序是:group by ,having ,order by
14.在多表查询的时候,如果不带任何条件,则会出现笛卡尔积,如何避免笛卡尔积?
【注意:】多表查询的条件至少不能少于表的个数-1
15.order by后面可以使用列号来排序,但是列号不能超过查询的列数
16.对于返回结果有多条记录的子查询可以把他当成一个临时表来看待,需要给该表指明别名,可以解决很多
复杂的查询!!
17:rownum是oracle内置的一个字段,用来显示行数
18:oracle的分页查询:
sql>select t2.* from
(select t1.* ,rownum rn from
(select * from emp) t1 where rownum<=6) t2 where rn>=4;
6--> 表示取到第几条
4-->表示从第几条开始取
如果需要针对不同情况分页,请在最内层进行处理,包括多表查询
因为oracle内部有优化!
对于这种语句:
select emp.* ,rownum from emp where rownum>=4 and rownum<=6;
查询不出结果!!!
19.oracle中的cube(xx,xx...)函数,用于对第一个xx排序后,然后对第二个xx排序,
以此类推,然后对整体进行排序
[排序有先后顺序,第二个的排序是在第一个排序后,如果第一个有相同的就按第二个排序,
因为不太可能所有顺序都满足]
20.
左外连接:左侧的表完全显示就是左外连接
右外连接:右侧的表完全显示就是右外连接
完全外连接:完全显示两个表,没有匹配的记录置为空
select .... from t1 full outer join t2 on xxx=xxx
21.平时使用的联查2个表,使用where作条件就是内连接
内连接的特点:两张表同时都匹配才被选中
22.对于复杂查询,总结如下:
①分组函数(avg())只能出现在选择列表、having、order by子句中
②如果在select语句中同时包含group by,having,order by 他们的顺序是:
group by, having ,order by
③在选择列中如果有列、表达式、和分组函数,那么这些列和表达式必须有一个
出现在group by 子句中,否则就会报错
23.union用于取得2个结果集的并集。查询的结果会自动去掉重复行【17讲】
union all 跟union想说,但是不会去掉重复行,且不会排序
intersect 取2个的交集
24.平时用的直接查2个表,就是内连接,如:
select * from emp,dept <===>
select * from emp inner join dept
25.外连接分为:①左外连接②右外连接③完全外连接
create table stu(
id number,
name varchar2(32)
);
insert into stu values(1,'Jack');
insert into stu values(2,'Tome');
insert into stu values(3,'Kitty');
insert into stu values(4,'Mark');
create table exam(
id number,
grade number
);
insert into exam values(1,56);
insert into exam values(2,46);
insert into exam values(11,22);
习题1:显示所有人的成绩,如果没有成绩,也要显示该人的id和name,成绩显示为空
方法一:select stu.id,stu.name,exam.grade from stu left join exam on stu.id=exam.id;
方法二:select stu.id,stu.name,exam.grade from stu , exam where stu.id=exam.id(+);//没有"+"的一方就是左表,需要全都显示的
方法三:select stu.id,stu.name,exam.grade from exam right join stu on stu.id=exam.id;
方法四:select stu.id,stu.name,exam.grade from stu ,exam where exam.id(+)=stu.id;
26.group by不能出现在子句中
27:使用子查询完成行迁移:
使用sql建表 ,//把原来表中姓张的迁移到临时表temp中
create table temp#
as
select empno,ename from emp where ename like '张%'
28:使用子查询完成更新:
希望员工scott的岗位,工资,补助与smith一样
update emp set (job,sal,comm)=(select job,sal,comm from emp where ename='SMITH')
where ename='Scott'
20:sql函数的分类
(1)当行函数:对每一行输入值进行计算,得到相应的计算结果,返回给用户,
也就是说,每行作为一个输入参数,经过函数计算得到每行的计算结果,比如length
(2)多行函数:对多行输入值进行计算,得到多行对应的单个结果,比如max,min
20.1:
单行函数之字符函数:
replace(char1,searche_string,replace_string)
如:select replace(ename,'A','中国') from emp;// 把ename列中的A替换为中国,
//注意这只是把查询的记过替换成现在这样,数据库中的值没有变
20.2:
如找到“oracle traning”第二个ra出现的位置:
select instr('oracle traning','ra',1,2) from dual;
//查找oracle traning 中从第一个位置开始,第二个出现ra的位置
20.3:ascii() 返回与指定的字符对应的十进制数:
select ascii('A') A_ascii,ascii('a') a_ascii from dual;
20.4: CHR 给出整数,返回对应的字符:
select chr(54740) zhao,chr(65) chr65 from dual;
20.5: concat 连接2个字符串
select concat('010-','1234556')||'hello' 连接 from dual;
20.6: length
select emp,length(emp) from emp;
21:oracle事务:
21.1:设置保存点【可以设置多个】:savepoint aa; //设置aa为保存点
21.2:只要事务没有提交,就可以回滚到保存点
21.3:回滚到保存点:rollback to 保存点
21.4:如果某个保存点已经回退过,不能再次回退,是一次性的
21.5:设置保存点是有资源开销的
21.6:取消全部事务:rollback
22.在类中,成员属性可以不赋初值,但是方法中的变量需要赋初值。
23.java中,对于操作数据库的非查询语句,默认是自动提交。
可以设置conn.setAutoCommit(false);
xxxx//更新语句
conn.commit();//这样就把上面的操作设置为一个事务
在catch中回滚
conn.rollback();
24:oracle中事务的级别中,serializable和read only的区别:
serializable 还能进行dml语句,
但是read only就不能进行dml语句操作了
这种设置可以在oracle中手动设置,也可以在java代码中设置
conn.setTransactionIsolation(Connection.Transaction_read_committed);
25:oracle中事务处理机制----事务隔离级别
事务隔离级别:
脏读(dirty read):当一个事务读取另一个事务尚未提交的修改时,产生脏读。oracle中没有脏读!
不可重复读(nonrepeatable read):同一查询在同一事务中多次进行,由于其他提交事务
所做的修改或删除,每次返回的结果集,此时发生非重复读。
幻读(phantom read):同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,
此时发生幻读。
oracle中的事物隔离级别:
1.read committed(默认):
保证不会出现脏读,但是可能会出现非重复读和幻读
2.serializable
理解:
①使事物看起来像是一个接着一个顺序的执行
②仅仅能看见在本事务开始前由其他事务提交的更改和在本事务中所做的更改
③保证不会出现脏读,不可重复读和幻读
④serializable隔离级别提供了read-only事务所提供的读一致性(事务级的一致性)
同时又允许DML(update,insert,delete)操作
3.read-only
26.oracle的事务隔离级别的设置:
set transaction isolation level read committed (默认)
set transaction isolation level serializable
set transaction isolation level read only
//设置整个会话的隔离级别
alter session set isolation level serializable
alter session set isolation level read committed
27.维护数据的完整性:
有3中方法:约束,触发器,应用程序(函数,过程)
(1)约束:共有5种
①not null(非空):指定某列的值不可以为空
②unique(唯一性):用于指定某列的值,不能重复,但是可以为null
③primary key(主键):唯一标示表行的数据,当定义主键约束后,该列不能重复,且不能为null
注意:一张表只能有一个主键,但是可以设置多个unique约束
④foreign key(外键):用于定义主表和从表之间的关系,外键约束要定义在从表上,
主表则必须具有主键约束或是unique约束,当定义外键约束后,要求外键列数据必须在主表的
主键列存在或者是null,而且类型必须一样【注意】主键列会自动创建索引
⑤check(check 检查约束):用于强制行数据必须满足的条件,否则出差
create table mytable(
id number primary key ,
salary number check(salary >=1000 and salary<=2000),
sex char(2) default '男' check(sex in('男','女')) //default放在check前面
);//这样就定义了check约束
28:修改表结构
①alter table 表名 modify goodsName not null;
②alter table 表名 add constraint 约束名称 unique(cardId);
③特殊的not null约束:alter table 表名 modify 字段名 not null;
④删除约束:alter table 表名 drop constraint 约束名
级联删除:alter table 表名 drop primary key cascade;[主键只有一个 所以可以直接写primary key]
29:约束的表级定义和列级定义:
表级定义:在定义列的时候,不指定约束,在最后定义
create table mytable (
id number,
name varchar2(32),
constraint pk_id primary key id
)
【注意】一般情况下,我们使用列级定义即可,但是如果遇到定义复合主键(2列一起定义为主键),可以使用表级定义。但是不推荐使用复合主键!!!一般复合主键都会带有逻辑的功能,如果变化,将会出现很复杂的业务处理,同时,复合主键的效率不高
列级定义:在定义列的时候,同时指定约束
30:oracle是通过序列(sequence)来处理自动增长列
用法:
create sequense my_seq //创建序列名:my_seq
start with 1 //从1开始
increment by 1 //每次增长1
maxvalue 999999 //nomaxvalue(不设置最大值) ---最大值
minvalue 1 //最小值
cycle //nocycle 一直累加,不循环 ;cycle 表示循环
nocache ---缓存
//cache 10 表示一次产生10个号,
//但是使用缓存产生号,优点是提高效率,缺点是可能产生跳号
//上面表示从1开始,每次增长1,最大值为999999,之后又循环开始
---创建表
create table test1(id number primary key ,name varchar2(32));
insert into test1 values(myseq.nextval,'abc');
insert into test1 values(myseq.nextval,'bdc');
(1)可以为表中的列自动产生值
(2)由用户创建数据库对象,并可由多个用户共享
比如:system用户使用scott创建的序列,从什么开始增长?
答:接着scott里面的增长
(3)一般用于主键或唯一列
31.序列细节说明:
一旦定义了某个序列,可以使用currval,nextval
currval:返回sequence的当前值
nextval:返回增加sequence的值,然后返回sequence的值
比如:
序列名.currval:select 方案名.序列名.currval from dual;//用于查看当前序列是多少
序列名.nextval:select 方案名.序列名.nextval from dual;//用于查看当前序列的下一个值是多少
【什么时候使用sequence】
①不包含子查询,snapshot,view的select语句【用的少】
②insert语句的子查询中【用的较多】
③insert语句的values 中【用的多】
④update的set中【用的较多】
32:使用sequence注意事项:
①currval总是返回当前sequence的值,只有在第一次nextval初始化后,才能使用currval,
否则会出错。每使用一次nextval,就会增加一次sequence的值,同一个语句里面要是有多个nextval,其数值就是不一样的
②第一次nextval返回的值是初始值:随后的nextval会自动增加定义的increment by值,然后
返回增加后的值
③如果指定cache值,oracle就可以预先在内存里面放置一些sequence,这样存取会更快,
cache里面取完后,oracle自动再取一组到cache,使用cache或许会跳号,比如数据库突然不正常
down掉,cache中的sequence就会丢失,可以在定义sequence的时候,使用nocache防止这种情况
33.索引
①单列索引:是基于一个列所建立的索引
create index myindex on 表名(列名)
②复合索引:基于2列或者2列以上的列建立的索引
create index myindex on 表名(列名1,列名2,列名3……)
【注意事项】
①在大表上建立索引才有意义
②在where子句或者连接条件上经常引用的列上建立索引
③索引的层次不要超过4层
34.索引优缺点分析:
索引有些先天不足:
①建立索引,系统要占用大约为表的1.2倍的硬盘和内存空间来保存索引
②更新数据的时候,系统必须要有额外的时间来同时对索引进行更新,以维护数据和索引的一致性。
实践表明,不恰当的索引不但于事无补,反而会降低系统性能。因为大量的索引在进行插入,修改,和
删除操作时比没有索引花费更多的系统时间。所以索引不能盲目的建立,比如在性别(男女)上建立索引就不划算