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来判断字符串中是否有数字(已经用*代替),字母(已经用#代替)!!(小技巧)
查询完毕后我们就可以知道删除什么了,因为如果你使用一个名字,但是你发现名字已经存在,但并不知道这个名字所定义的是什么东西,就查询以上的
视图。
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来判断字符串中是否有数字(已经用*代替),字母(已经用#代替)!!(小技巧)