按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
第 39 页,共 106 页
…………………………………………………………Page 40……………………………………………………………
资源来自网络,仅供学习! Oracle 从入门到精通
CURRVAL 得到当前的值(刚被领走的号)。
在 CURRVAL执行前必须先通过 NEXTVAL 得到一个初始的值。
序列名。NEXTVAL/CURRVAL
序列发生间隙是正常的,保证唯一即可。
序列的修改:
ALTER SEQUENCE sequence_name
increment by
maxvalue
cycle
cache;
start with 不能修改。
删除序列:
drop SEQUENCE sequence_name;
2。7、索引:
一个方案中的对象;
被 ORACLE 服务器用来加速对表的查询;
通过使用快速路径访问方法快速定位数据;
与表独立存放;
被 ORACLE 服务器使用和维护。
一定是 WHERE 条件的才有可能使用索引。
手动创建索引:
CREATE INDEX index_name on table_name (col_name);
考虑创建索引的情况:
*、包含了大量不同值的列;
*、包含了大量空值的列;
*、一个或者多个列经常被一起出现在 WHERE 条件中或者作为连接的条件出现;
*、表的数据量很大,而且对表的查询经常是得到表中数据的 2%到 4%(少量数据)。
不应该创建索引的情况:
*、一个很小的表;
*、列很少被用于查询的条件;
*、表上的大多数查询是得到大量数据的;
*、表中的数据经常发生变动;
*、要被索引的列被作为条件表达式的一部分。
查看:
user_indexes 得到索引的定义和唯一性。
user_ind_columns 得到索引的名称,表名和列名。
select ic。index_name;ic。column_name;ic。column_position; ic。uniquenes
from user_indexes ix;user_ind_columns ic
where ic。index_name=ix。index_name and ic。table_name='table_name';
第 40 页,共 106 页
…………………………………………………………Page 41……………………………………………………………
资源来自网络,仅供学习! Oracle 从入门到精通
删除索引:
DROP INDEX index_name;
为了删除索引,必须拥有索引或者拥有 DROP ANY INDEX 权限。
2。8 控制用户的访问
1。数据库的安全性
系统安全性:
系统权限(system privilege),获得访问数据库的能力。
超过一百个
创建新用户:
CREATE USER user_name IDENTIFIED BY password;
删除用户
删除表
授予权限:
GRANT priv_list TO user/public/role(角色);
grant create session ;create table;create sequence to user_name;
在授予建表权限的同时也应该赋予存储空间。
分配配额:ALTER USER user_name QUOTA nM ON space_name;
数据安全性:
对象权限(object privilege),获得维护数据库的能力。
每种对象的权限都不相同。
对象的所有者拥有对象的所有权限。
对象的所有者可以将自己的对象权限赋予其他人。
GRANT object_priv_list '(col_list)'
ON owner。object TO user/role/public
'WITH GRANT OPTION';……将权限授予用户的同时,该用户也拥有了授予其他用户对象权限的
功能。(及联授予)会导致及联移除。
移除权限:
REVOKE priv_list/all ON object FROM user;
方案:数据库对象的集合,包括表、视图、序列。。。。。。
2。角色:
CREATE ROLE role_name;
GRANT priv_list TO role_name;
GRANT role_name TO user_list/role_list;
修改口令:
方法 (1)ALTER USER user_name IDENTIFIED BY password;
(2)password + 回车
第 41 页,共 106 页
…………………………………………………………Page 42……………………………………………………………
资源来自网络,仅供学习! Oracle 从入门到精通
USER_SYS_PRIVS 当前用户的系统权限。
USER_ROLE_PRIVS 当前用户的角色权限。
USER_tab_privs_made 用户对象被授予的他人的信息。
3。使用集合操作
UNION
select employee_id;job_id from employees
union
select employee_id;job_id from job_history;
两个表的并集,但不显示重复行。执行的时候要先排序再剔重,所以结果集是有序的。
union all
也是两个表的并集,而且显示重复行。
语法同上。
intersect
select employee_id;job_id from employees
intersect
select employee_id;job_id from job_history;
minus
select employee_id;job_id from employees
minus
select employee_id;job_id from job_history;
e…j=e…e 与j的交集;
j…e=j…j 与e的交集;
注:在 select 列表中的表达式必须有同样的数目和类型。
匹配 SELECT 语句
select employee_id;job_id;salary from employees
union
select employee_id;job_id;0 from job_history;
括号可以用拉修改序列的执行顺序。
4。ORDER BY 子句:
只能在整个集合的最后出现;
可以按照第一个 SELECT 语句中的列名,别名或者位置号排序。
第 42 页,共 106 页
…………………………………………………………Page 43……………………………………………………………
资源来自网络,仅供学习! Oracle 从入门到精通
5。GROUP BY 子句的增强
CUBE 操作符的 GROUP BY
在 GROUP BY 子句中使用 ROLLUP 或者 CUBE 来产生分组小计;
ROLLUP 分组产生包括规则的分组结果和小计的结果的组合;
GROUP BY 'ROLLUP'(col_name_list)
ROLLUP:
a ab abc
abc
ab ab
a a a
all all all
CUBE 分组产生包括 ROLLUP 产生的结果和交叉分组小计。
cube:
a ab abc
a ab abc
all a ab
b ac
all bc
a
b
c
all
6。GROUPING 函数
参数一定是在 CUBE 或 ROLLUP 里进行分组排序的字段或表达式之一。
通过 1 或0来判断结果集中的空值是由于本身列的值是空的,还是由于使用 CUBE或 ROLLUP 产
生的空值。
1 代表是由于分组产生的空值,没有参与分组。
0 代表是由于列本身产生的空值,参与了分组,但分组中没有包含它。
GROUPING SETS
可以使用 GROUPING SETS 在同一个语句中定义多个组集。
只需要访问一次基表。
不需要写很复杂的 UNION 语句。
GROUPING SETS 子句中组合的元素越多,语句的执行性能就越好。
group by GROUPING SETS((abc);(ab);(bc);(a);(b))
组合列:
是一个列的组合,在分组计算时被作为一个单元处理。
第 43 页,共 106 页
…………………………………………………………Page 44……………………………………………………………
资源来自网络,仅供学习! Oracle 从入门到精通
2。9 高级子查询
1。 成对子查询:
行内视图的性能比成对子查询的性能高。
相关子查询:
主查询的字段在子查询里做条件(特征)。
主查询先执行,取出第一条数据,把该数据传入子查询做比较,返回查询结果给主查询,主查
询根据这个结果再做查询
依次类推
直到主查询中没有可查询列为止。
EXISTS 操作符
EXISTS 操作符测试子查询的结果是否存在;
返回 TRUE 或 FALSE
查询机制:
如果一个子查询找到了结果:
在内部子查询中不在继续执行,条件被设为 TRUE
如果一个子查询没有找到结果:条件被设为 FALSE
select col_list from table_name tab_alias
where exists (select 'x' from table_name where col=tab_alias。col);
用的是相关子查询
NO EXISTS 操作符
和 NOT IN 相对应,速度要快,性能好。
UPDATE 中的相关子查询
update emp e
set department_name in(select d。department_name from departments d where
e。department_id=d。department_id);
delete 中的相关子查询
2。层次查询
select 'level';column;expr from table 'where condition'
'start with'起点(自底向上/自顶向下)
'connect by prior + 主键/外键=外键/主键'//看你往哪个方向查
自顶向下 左边放主键,右边放外键
select employee_id;last_name;salary;job_id;manager_id
from employees
start with manager_id is null
connect by prior employee_id=manager_id;
自底向上 右边放主键,左边放外键
level(伪列)
层次的级别:不固定值。