1 row created.
只有运行了序列号的名称. nextval后序列号的名称. currval 才有效才有值.
3. 查询序列号的情况
SQL> select sequence_name, min_value, max_value, increment_by, last_number from user_sequences;
其中last_number指的是序列号的下一个值.
4. 改变序列号
SQL> ALTER SEQUENCE sequence [INCREMENT BY n] [{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n | NOMINVALUE}]
[{CYCLE | NOCYCLE}] [{CACHE n | NOCACHE}];
注意: 不能改变它的起始值
如果要改变序列的起始值, 先把序列号删除掉, 再新建一个.
5. 删除序列号
SQL>DROP SEQUENCE sequence;
6. 不能用序列号的nextval和currval的地方
视图的查询
有distinct的查询
有group by,having,order by的查询
有子查询的查询
表里的缺省值
十四、创建视图
1. 视图的概念和优点
视图是基于一个或多个表及视图的一些查询语句, 它象显示数据的视窗, 它本身是不存储数据的.
视图可以限制数据库的访问, 更好的控制权限
使用户使用简单的查询语句
数据的非依赖性
同一数据的不同表现形式
2. 创建视图的语法
SQL> CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view[(alias[, alias]…)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY]
参数解释:
FORCE 表不存在时,视图仍然可以创建成功
WITH CHECK OPTION 只有符合视图定义的记录才能被插入或修改
WITH READ ONLY 不允许DML操作
Oracle8i以后创建视图可以用order by
3. 创建修改视图的例子
SQL> CREATE OR REPLACE VIEW salvu41 AS SELECT id, first_name FIRST,
last_name LAST, salary MONTHLY_SALARY
FROM s_emp WHERE dept_id = 41;
SQL> CREATE VIEW dept_sum_vu (name, minsal, maxsal, avgsal) AS SELECT d.name, MIN(e.salary),
MAX(e.salary),
AVG(e.salary) FROM s_emp e, s_dept d WHERE e.dept_id = d.id GROUP BY d.name;
注意: 如果用select * from table_name创建的视图
table_name的结构改变后 view要重建或compile后才能显示新的字段内容
4. 查询视图的数据字典
SQL> set long 1600;
SQL> select view_name,text from user_views;
说明: 可以根据视图text_length来设置set long 数字;
User_updatable_columns视图能查询视图里能被修改的字段
5. 简单和复杂的视图对比
特 性 简单视图 复杂视图
表的数量 一个 多个
有函数吗? 没有 有
有分组操作吗? 没有 有
有基于视图的DML操作吗? 有 没有
6. 在视图上可以用DML命令吗?
可以, 但有一定的限制条件
没有下面的情况, 可以删除view里的记录. group function, group by, distinct
没有上面和下面的情况, 可以修改view里的记录. 字段表达式,
例如: salary*12 含rownum的view
没有上面两种情况, 且view里含基表里所有非空字段的情况, 可以往view里插入记录.
7. 在视图里使用 WITH CHECK OPTION约束条件
SQL> create or replace view empvu41
as select * from s_emp where dept_id = 41
with check option constraint empvu41_ck;
如果运行下面命令会出错ora-01402
SQL> update empvu41 set dept_id=42 where id=16;
原因: 视图empvu41里规定只能看部门号为41的记录 修改后会把记录排除在视图empvu41以外
与它的约束条件冲突
8. 删除视图
SQL> DROP VIEW view_name;
十五、创建索引
1.索引的概念
索引是数据库里的一种数据对象
它利用B*树, hash, bitmap结构直接快速地访问数据
它和表是分开存放的两个实体
索引创建好了后, 由系统自动调用和管理
2. 什么时候创建索引?
自动创建的索引:唯一关键字, 唯一的约束条件
手工需要创建的索引:大表查询时, sql语句where后经常用到的字段或字段组合
字段内容差别很大有大量NULL值表很大, 返回记录数较少
3. B*树索引的结构 每个索引由字段值和指针或ROWID组成
4.创建索引的语法
CREATE INDEX 索引名 ON 表名 ( 字段1, [字段2, ……] ) TABLESPACE 表空间名;
5.创建索引的注意事项
创建索引时会加行级独占锁
一个表的索引最好不要超过三个 (特殊的大表除外)
最好用单字段索引
索引最好和表分不同的表空间存放
结合SQL语句的分析执行情况, 也可以建立多字段的组合索引和基于函数的索引
大表的索引会占用很大的存储空间
不要建唯一的索引, 而应该加唯一的约束条件
6.查询索引的方法
查询数据字典user_indexes和user_ind_columns
例子:
SQL> SELECT ic.index_name, ic.column_name,
2 ic.column_position col_pos,ix.uniqueness
3 FROM user_indexes ix, user_ind_columns ic
4 WHERE ic.index_name = ix.index_name
5 AND ic.table_name = ‘S_EMP’;
注意: 数据字典里存放的字符都是大写的.
7. 不用索引的地方
表很小
where后不经常使用的比较字段
表被频繁修改
返回记录数很多
where后含IS NULL /IS NOT NULL/ like ‘%输入符%’等条件
8. 重建索引的语法
ALTER INDEX 索引名 REBUILD TABLESPACE 原来表空间名 NOLOGGING;
定期重建索引可以减少索引的碎片, 更有效地使用表空间.[NextPage]
9. 删除索引
SQL> drop index 索引名;
SQL> alter table 表名 drop constraint 约束名;
十六、控制用户访问
1.权限的类别
系统级权限: 针对整个系统操作的权限
如: 用户名/密码, 使用表空间的限额等
对象级权限: 针对某个具体object操作的权限
如: 针对某个表, 视图, 表的某个字段的select, update, delete权限
2. 查看当前数据库的用户信息
SQL>select username,default_tablespace,temporary_tablespace from dba_users;
查看在线用户信息
SQL>select count “number”,username “current username” from v$session group by username;
用户查看自己的缺省表空间SQL>select username,default_tablespace from user_users;
3. 创建新用户
SQL> create user username identified by password
default tablespace tablespace_name temporary tablespace temp
quota unlimited on tablespace_name
quota 1k on system
[quota 1k on other_tablespace_name ……] ;
给用户赋权限
SQL> grant connect, resource to username;
查看当前用户的权限角色
SQL> select * from user_role_privs;
查看当前用户的系统权限和表级权限
SQL> select * from user_sys_privs;SQL> select * from user_tab_privs;
4 、常用的角色及其权限
CONNECT 8 privs 连上Oracle,做最基本操作
RESOURCE 8 privs 具有程序开发最的权限
DBA 114 privs 数据库管理员所有权限
EXP_FULL_DATABASE 5 privs 数据库整个备份输出的权限
IMP_FULL_DATABASE 64 privs 数据库整个备份输入的权限
查看角色明细的系统权限
SQL> select * from role_sys_privs;
5、改变老用户 可以改变老用户的密码, 缺省表空间, 临时表空间, 空间限额.
SQL> alter user username identified by password
default tablespace tablespace_name
temporary tablespace temp
quota unlimited on tablespace_name
quota 1k on system
[quota 1k on other_tablespace_name ……] ;
撤销用户的角色或权限
SQL> revoke role_name or priv_name from username;
注意事项
撤消用户的角色dba时, 同时撤消了用户unlimited tablespace的系统权限,
切记要再次赋予resource角色给此用户
SQL> grant resource to username;
6、删除用户
如果用户下没有任何数据对象
SQL> drop user username;
如果用户下有数据对象
SQL> drop user username cascade;
注意事项
如果用户下有含clob,blob字段的表, 应该先删除这些表后,才能用cascade选项完全删除.
7、角色的概念和管理
角色是命名多个相关权限的组合. 能把它赋于其它的用户或角色我们能创建角色,
使权限管理更容易一些.
8、赋于系统的权限语法和例子
语法:
SQL> GRANT sys_priv TO {user|role|PUBLIC} [WITH ADMIN OPTION];
例子:
SQL> GRANT create session TO sue, rich;
SQL> GRANT create table To scott, manager;
注意:
如果用WITH ADMIN OPTION通过中间用户赋于的系统权限中间用户删除后, 系统权限仍然存在.
9、赋于数据对象级的权限语法和例子
语法:
SQL> GRANT object_priv [(columns)] ON object TO {user|role|PUBLIC} [WITH GRANT OPTION];
例子:
SQL> GRANT select ON s_emp TO sue, rich;
SQL> GRANT update (name, region_id)
ON s_dept TO scott, manager;
注意: 如果用WITH GRANT OPTION通过中间用户赋于的对象权限
中间用户删除后,对象权限就不存在了.
10、rownum表中的行号,自动生成的,只能用<,<=操作符
rowid用来唯一表示数据库表中的一行
在oralce上的分页需要用到伪列,只所以这么做,是因为oralce不支持rownum比较
比如说找出第三行纪录,那就是
select last_name, salary
from (select rownum a, b.*
from s_emp b)
where a=3
如果找出第10行到第20行的数据的话,那就必须用到
select last_name, salary
from (select rownum a, b.*
from s_emp b)
where a > 10 and a < 2;
这是sql级别的分页,优点是速度快,缺点是可移植性差;
| 广告合作:400-664-0084 全国热线:400-664-0084 Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号 珠峰网 版权所有 All Rights Reserved
|