Oracle - SQL学习笔记 2

  • VPD visual private database 数据访问控制技术,通过策略函数来实现具体的控制。提供了对数据库信息的细粒度访问控制,归属在ORACLE Security框架下的成熟产品。介于用户SQL语句和实际执行对象之间的介质层。
    详见:EBS VPD介绍和使用实例

    注:只有企业版才有此功能。

--设定对数据表 T 的每个 select 语句都要添加一个条件 table_id >= 100,即使应用层发出了 SELECT * FROM T ,实际执行的也是 SELECT * FROM T where table_id >= 100 。

    -- 查询出所有表中的数据
    SELECT * FROM T;   

    -- 创建策略函数
    CREATE OR REPLACE FUNCTION emp(p_schema VARCHAR2, p_object VARCHAR2)  
    RETURN VARCHAR2 
    AS 
    BEGIN  
        RETURN 'table_id >= 100';  -- condition_expr
    END;

    -- 对数据库对象应用策略函数
    BEGIN  
          dbms_rls.add_policy(object_schema => 'USERNAME',  
                             object_name => 'T',
                             policy_name => 'VPD_TEST',   
                             function_schema=> 'USERNAME',   
                             policy_function => 'EMP');

    -- 通过查询数据字典,确认数据库对象上是否有策略函数
    SELECT * FROM dba_policies t 
    WHERE t.object_name = 'T'; 

    SELECT * FROM TABLENAME;   -- 查询出表中 'table_id >= 100' 的所有数据

    -- 失效策略
    BEGIN
          bms_rls.drop_policy(object_schema => 'USERNAME'
                             ,object_name=> 'T'
                             ,policy_name => 'VPD_TEST');
    END;
  • 物化视图

    特殊的物理表,有别于普通的数据视图。物化视图存储基于远程表的数据,也可以称为快照。oracle提供了主键物化视图(默认)和ROWID物化视图。

    物化视图日志 如果想采用快速刷新,必须建立基于主表的物化视图日志。

    CREATE MATERIALIZED VIEW LOG ON table WITH PRIMARY KEY;
    CREATE MATERIALIZED VIEW table_90 --创建物化视图
    BUILD IMMEDIATE --在视图编写好后创建  
    REFRESH FAST WITH PRIMARY KEY --根据主表主键增量刷新(FAST,增量) 
    ON DEMAND --在用户需要时,由用户刷新
    ENABLE QUERY REWRITE --查询重写
    AS
    SELECT * FROM table WHERE d_id = 90;  -- 筛选出table表中 'd_id = 90' 的所有数据,建立物化视图

    --刷新
    INSERT INTO table
    VALUES
      (208  ,'Steven'  ,'Lee'  ,'LEE'  ,'123.123.1234'  ,to_date('1998-06-13', 'YYYY-MM-DD')  ,'AD_VP'  ,16000  ,NULL  ,100  ,90 ,'Executive');

    select * from table_90;  -- 数据中没有新插入的 table_id=208 数据

    begin  
    DBMS_MVIEW.REFRESH('TABLE_90','f');
    end;

    select * from table_90;  -- 数据中有新插入的 table_id=208 数据

    --删除
    DROP MATERIALIZED VIEW LOG ON table;
    DROP MATERIALIZED VIEW table_90; 

详见:Oracle 物化视图

  • 闪回机制

    Oracle数据库中提供一种机制可以用来查询之前一段时间内修改行原先的值。需要注意通过闪回的时效是有限制的,具体能闪回到多久之前的数据和数据库的设置有关系。

    SELECT * FROM table WHERE  expr;  -- 删除某数据前先查询出看看是否是要删除的数据

    DELETE FROM table  WHERE  expr;  
    COMMMIT;  -- 提交事务 


    -- 闪回到5分钟之前  
     SELECT * FROM table AS OF TIMESTAMP SYSDATE-5/(24*60)   WHERE expr;
    -- 最后将查到的数据插入到 table 表中, 
    INSERT INTO table(…) VALUES(…);
  • over分析语句

    与聚集函数(Min/Max/Avg/Sum)搭配
    与分析函数(rank/dense_rank/row_number)搭配时建立在数据窗口(over在一定的数据库范 围进行数据分析),在一定的数据范围进行排序、汇总等。
    Oracle 分析函数
    sql – 练习

    注:OVER(PARTITION BY col_id ORDER BY col NULLS LAST ) 如果col中含有空值则将它排在最后一名,如果没有 NULLS LAST,将在第一名不符合逻辑

  • 全局临时表

  • 递归查询

    SELECT [LEVEL], column, expr... 
    FROM   table 
    [WHERE condition(s)] 
    [START WITH condition(s)] 
    [CONNECT BY PRIOR condition(s)] 
  • WITH语句

  • 同义词

    CREATE SYNONY tablename FOR db.tablename;
  • INSERT 增强功能
INSERT FIRST  WHEN sal > 25000 THEN
           INTO special_sal   VALUES  (deptid  ,sal)   
              WHEN hiredate LIKE  ('%00%') THEN 
           INTO hiredate_history_00  VALUES   (deptid  ,hiredate)   
              WHEN hiredate LIKE  ('%99%') THEN
           INTO hiredate_history_99  VALUES  (deptid  ,hiredate)   
              ELSE 
           INTO hiredate_history     VALUES  (deptid  ,hiredate)
      SELECT department_id deptid ,SUM(salary) sal ,MAX(hire_date) hiredate
       FROM employees
       GROUP BY department_id;
  • Group By 增强

    使用Rollup 产生常规分组汇总行 以及分组小计
    使用Cube 产生Rollup结果集 + 多维度的交叉表数据源
    使用Grouping 函数能在Rollup 和 Cube的结果集中很明确的看出哪些行是针对那些列或者列的组合进行分组运算的结果的; 没有被Grouping到返回1,否则返回0
    使用Grouping Set 来代替多次UNION

  • 权限

补充

    select  sys_context('USERENV','SESSION_USER') from dual;  -- 获取当前用户名信息
    select * from v$version;  -- 查看当前Oracle版本
  • First/Last排名查询
    --找出订单总额最多、最少的客户
     SELECT min(customer_id)
            KEEP ( DENSE_RANK FIRST ORDER BY sum(customer_sales) DESC) first,
            min(customer_id)
            KEEP ( DENSE_RANK LAST ORDER BY sum(customer_sales) DESC) last
      FROM user_order
      GROUP BY customer_id;

注:
min函数的作用是用于当存在多个First/Last情况下保证返回唯一的记录
keep是对排序结果保留2条记录

  • 分析函数 Ntile
    --找出订单总额排名前1/5的客户
    SELECT region_id,
           customer_id,
           ntile(5) OVER( ORDER BY sum(customer_sales) DESC) tile
    FROM user_order
    GROUP BY region_id, customer_id;
  • 窗口函数
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值