oracle菜鸟日记6

1. 查询触发器,函数,过程的名字可以通过视图user_source来查询,名字对应的类型查询表或者视图的名字可以通过视图user_tables或者user_views;
查询完毕后我们就可以知道删除什么了,因为如果你使用一个名字,但是你发现名字已经存在,但并不知道这个名字所定义的是什么东西,就查询以上的
视图。


2. lpad和rpad应用于使输出左对齐或者右对齐的时候,比如rpad是左对齐,lpad是右对齐,记住!!!!!!!


3. 对于数字类型,如果使用函数,例如lpad或者rpad类似的函数给数字类型的量进行左或者右添加空格时,函数输出的时候这个量就变成字符型了


4. 在触发器中可以添加声明
  例如:create trigger adc
              before|after ...... on ....
             for each row
             when.......
             declare
    变量
      begin 
      ......


5. 对于pl/sql快中使用ddl,应该用dbms_utility.exec_ddl_statement来代替,用法,dbms_utility.exec_ddl_statement('create table...asselect * from... '),在单引号里面不要加分号,dbms_utility.exec_ddl_statement(‘过程...end;’),不要加/,因为这个函数dbms_utility.exec_ddl_statement就是执行单引号中的ddl语句,它自身就带有执行的意思,所以这一点应该注意。


6. 对于表上的触发器,如果,是before触发器,那么先执行触发器,如果有异常,那么就不能对表进行改变处理,若没有抛出异常,则可以对表进行改变。


7. with子查询因子化


8. 使用pivot函数进行行转列(也就是把一列变为多列)
例子: with test_pivot_emp as 
          (select deptno,empno,sal from emp)
         select * from test_pivot_emp
        pivot(
        count(empno) as "号部门人数",
 sum(sal)     as "号部门总工资"
         for (deptno) in  (
          10 as    d10,       
  20 as  d20,
                   30 as  d30   
)
);
输出为:
            D10_号部门人数 D10_号部门总工资 D20_号部门人数 D20_号部门总工资 D30_号部门人数 D30_号部门总工资
            -------------- ---------------- -------------- ---------------- -------------- ----------------
              3              8750              5            10875              6             9400
总结:pivot其实是对与它相近的那个表进行处理,之间没有分号,相当于按照for括号里面的列进行分组,然后再进行上面的聚集函数运算,for子句中的
每一列的或多列的指定组合,都会在结果中生成一个派生列,注意的是,如果pivot所处理的列并不是表中的全部列,那么就会返回更多行,看下面的例子
(多了ename列,结果就不同了)
例子:
    SQL> with test_pivot_emp as
  2  (select deptno,empno,sal,ename from emp)
  3  select * from test_pivot_emp
  4  pivot(
  5          count(empno) as "号部门人数",
  6             sum(sal)     as "号部门总工资"
  7           for (deptno) in  (
  8                        10 as    d10,
  9                                20   as  d20,
 10                     30      as  d30
 11                             )
 12     );


ENAME      D10_号部门人数 D10_号部门总工资 D20_号部门人数 D20_号部门总工资 D30_号部门人数 D30_号部门总工资
---------- -------------- ---------------- -------------- ---------------- -------------- ----------------
ALLEN                   0                               0                               1             1600
JONES                   0                               1             2975              0
FORD                    0                               1             3000              0
CLARK                   1             2450              0                               0
MILLER                  1             1300              0                               0
SMITH                   0                               1              800              0
WARD                    0                               0                               1             1250
MARTIN                  0                               0                               1             1250
SCOTT                   0                               1             3000              0
TURNER                  0                               0                               1             1500
ADAMS                   0                               1             1100              0
BLAKE                   0                               0                               1             2850
KING                    1             5000              0                               0
JAMES                   0                               0                               1              950
你可以理解为,pivot是处理表里面的全部列,虽然在pivot里面的for子句中的列只包括(deptno),但是它还是根据全部列(deptno,ename)来进行
分组的,也许你会问,为什么不写成for(deptno,ename),那如果你写成这样的话,你想想会有多少派生列???派生列的名字就是for子句中的as后面的
别名再加上聚集函数后面的别名!


9.unpivot行转列(也就是把多列变为一列)
例子:
      SQL> select * from test6;


US FR FR FR
-- -- -- --
a  b  c  d
e  f  g  h
i  j  k  l
m  n  o  p
q  r  s  t
u  v  w  x


已选择6行。


SQL> select username1,friend,friendly from test6
  2  unpivot(
  3       friendly for friend
  4       in (friend1,friend2,friend3)
  5              );


US FRIEND  FRIENDLY
-- ------- --------------------------------------------------
a  FRIEND1 b
a  FRIEND2 c
a  FRIEND3 d
e  FRIEND1 f
e  FRIEND2 g
e  FRIEND3 h
i  FRIEND1 j
i  FRIEND2 k
i  FRIEND3 l
m  FRIEND1 n
m  FRIEND2 o
m  FRIEND3 p
q  FRIEND1 r
q  FRIEND2 s
q  FRIEND3 t
u  FRIEND1 v
u  FRIEND2 w
u  FRIEND3 x


其中的friend和friendly是新增的例,friend后面括号里的列,它们是需要合并的列名(多列合一列)并且,合并完后是以friend为总列名,我们可以
看到username1列有多个重复值,就相当于username1列和新增列进行了笛卡尔基所得到,然后,friendly列的值是通过原表里面的username1列所对应
的那几个合并列对应的值传递过来的,这就完成了,原表里面的username1值与合并列值的
一一对应关系。
值得注意的是:需要合并的列最终在进行select的时候,不能单独又出现在select后面,比如如果friend(username1,friend1,friend2,friend3),那么
username1就不能再出现在select后面,否则会报错。


10. where instr(字符串,‘*’) >0
      and(or)  instr(字符串,‘#’) >0;
     可以用instr来判断字符串中是否有数字(已经用*代替),字母(已经用#代替)!!(小技巧)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值