友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
喜书网 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

oracle从入门到精通(PDF格式)-第14章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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(伪列)  

  层次的级别:不固定值。  



   
返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!