ITPub博客

首页 > Linux操作系统 > Linux操作系统 > PL/SQL学习笔记(六)

PL/SQL学习笔记(六)

原创 Linux操作系统 作者:yanxiaojun_007 时间:2009-05-24 13:35:38 0 删除 编辑

序列:

自动产生的唯一值;
4ji2Ri'WI)z0一个共享的对象;**博客首页%?_!dC [ W)O k
典型的用法是作为主键的值;
+|6vb'?Z6PcW[ T^0insert into 给主键提供值。**博客首页d+qlb&Kt
替代了应用的代码;**博客首页2GD+[XOq
通过将序列CACHE(预先生成一部分序列号,放入到内存中)到内存中,可以加速对序列的访问。

CREATE SEQUENCE sequence_name**博客首页+e7EvA `1vM
  [increment by n]//步长**博客首页 o?7dD0ty_)V
  [start with n]//起始点
U(zN\2D,L S MZ Gw0  [maxvalue n/nomaxvalue]//递增**博客首页$w E}m+N6? q&D
  [minvalue n/nominvalue]//递减**博客首页XF;imMMY
  [cycle/nocycle]//循环**博客首页(p{ wC:]#F8v xo&c
  [cache n/nocache];//n为预先生成序列号的个数,默认为20。

查询序列:**博客首页@MqV-Z-yr&x/@w
user_sequences**博客首页8Vl7Wu0ml
last_number 序列将要产生的下一个号是多少;

select sequence_name,min_value,max_value,increment_by last_number from user_sequences;

伪列:NEXTVAL 引用下一个可用的序列值,不同的用户每次引用都会获得一个唯一的值。**博客首页;HQ%y@x
      CURRVAL 得到当前的值(刚被领走的号)。
[,D#s:BJ V1j0在CURRVAL执行前必须先通过NEXTVAL得到一个初始的值。

序列名.NEXTVAL/CURRVAL**博客首页i Yp i9kV{FC
  
s-k3P(V/x0序列发生间隙是正常的,保证唯一即可。

**博客首页 i nU.[P.qY
序列的修改:
?-Zx*Ug9Hjq0o8dm0   ALTER SEQUENCE sequence_name 
W.v-^.ZW u0   increment by**博客首页Mf9u.Z3V |]CpOV
  maxvalue
7^:Dz0c m:H0  cycle    **博客首页|:MRSaX
  cache;

start with 不能修改。

删除序列:

drop  SEQUENCE sequence_name;

 

**博客首页l`\:dr9F/e2Y
索引:

一个方案中的对象;**博客首页0fa&p/j T w!W
被ORACLE服务器用来加速对表的查询;**博客首页vobx,J ePCn O [
通过使用快速路径访问方法快速定位数据;
*F(D"` O_'`g;zG BUS'l0与表独立存放;
(`#c?gl(B7c`*_0被ORACLE服务器使用和维护。

一定是 WHERE 条件的才有可能使用索引。


.uT-z ? FN0手动创建索引:**博客首页F7|^u(O MkD W2h
CREATE INDEX index_name on table_name (col_name);

考虑创建索引的情况:
r5]-N&j/}en^0*、包含了大量不同值的列;
9x9|"k;Q{2y&I0*、包含了大量空值的列;
8S `m Y1D6D0*、一个或者多个列经常被一起出现在 WHERE 条件中或者作为连接的条件出现;
2|L"zL c%s5|0*、表的数据量很大,而且对表的查询经常是得到表中数据的2%到4%(少量数据).


P2r8i2h b;r.^+f+e0不应该创建索引的情况:**博客首页&IY$l o,t
*、一个很小的表;**博客首页6o2P b eil}
*、列很少被用于查询的条件;
{A&G DtI0*、表上的大多数查询是得到大量数据的;
zK3bB1Uy8_0*、表中的数据经常发生变动;
E.f&aAB&O0*、要被索引的列被作为条件表达式的一部分。

**博客首页j|K1n2O;bn
查看:**博客首页gd4r3bT&t
user_indexes得到索引的定义和唯一性。

user_ind_columns 得到索引的名称,表名和列名。**博客首页P@z1i$y I
select ic.index_name,ic.column_name,ic.column_position,**博客首页 pl$[Z*N1V
 ic.uniquenes**博客首页y'D7^zcsL+_W
from user_indexes ix,user_ind_columns ic
;v4?P*Q)b*i0where ic.index_name=ix.index_name and ic.table_name='table_name';

删除索引:
$y,R.w,v K0DROP INDEX index_name;
4uw"uY.N8ma0为了删除索引,必须拥有索引或者拥有DROP ANY INDEX 权限。 

 

控制用户的访问

数据库的安全性

系统安全性:
s9U'UQ$~0 系统权限(system privilege),获得访问数据库的能力。**博客首页D2k8[,H+?+uF\f
  超过一百个
eDO6rn)O+Q0  创建新用户:
0^%c Y;{F#I)oR(sz0   CREATE USER user_name IDENTIFIED BY password;**博客首页tsLw)k"J HB)?
  删除用户**博客首页H_dr Hb$\,_|y
  删除表
Xv2?/d9`M z0 授予权限:
$U"p0i8X4z"I0  GRANT priv_list TO user/public/role(角色);
.N4G2Nx]x,h6mu.t0  grant create session ,create table,create sequence to user_name;   
$r5@X4Mg6K{0O e}#I |0  在授予建表权限的同时也应该赋予存储空间。
Mt'P)BC f3p M0 分配配额:ALTER  USER user_name QUOTA nM ON space_name;

数据安全性:**博客首页,W[E,k0v
 对象权限(object privilege),获得维护数据库的能力。
VtAY8]%jF0 **博客首页u!p?2UJ;S
 每种对象的权限都不相同。**博客首页5v8t\ |9N
 对象的所有者拥有对象的所有权限。**博客首页,ptu6_ u:p
 对象的所有者可以将自己的对象权限赋予其他人。   

 GRANT object_priv_list [(col_list)]
!a!ix5DUB%A d&j0 ON owner.object TO user/role/public
rMa,s$m U|0 [WITH GRANT OPTION];--将权限授予用户的同时,该用户也拥有了授予其他用户对象权限的功能。
N+Mh]8W3S3{0 (及联授予)会导致及联移除。

 移除权限:**博客首页c2c J^:D+h'r
 REVOKE priv_list/all  ON object FROM user;**博客首页"o!x;h4G#sdT h
 
PGzj8V4U%ge0方案:数据库对象的集合,包括表、视图、序列.....。


B&k,R nJ?d E!qT&~0角色:
NNo xl8k;b!EU0 CREATE ROLE role_name;
f&f&z9gL5? F;x!?0 GRANT priv_list TO role_name;**博客首页&C7ov+Z%sc`T
 GRANT role_name TO user_list/role_list;

修改口令:**博客首页*l jPk~
方法 (1)ALTER USER user_name IDENTIFIED BY password;**博客首页%uaR.JeE
 (2)password + 回车
LM!J[RD:H%V)J v*K0 **博客首页AQgL"g{ kU
USER_SYS_PRIVS 当前用户的系统权限。
Ac5C V2F T/~'r'`&[0USER_ROLE_PRIVS 当前用户的角色权限。
pS }Lia#_V0USER_tab_privs_made 用户对象被授予的他人的信息。

 

**博客首页%QD2]4?)dt
使用集合操作

UNION

select employee_id,job_id from employees**博客首页'XHI*ao"m$B%?
union**博客首页v x$]s[)d
select employee_id,job_id from job_history;

两个表的并集,但不显示重复行。**博客首页z.?3t3sv1Y
执行的时候要先排序再剔重,所以结果集是有序的。

union all

也是两个表的并集,而且显示重复行。
N1{["B$pN0语法同上。

intersect

select employee_id,job_id from employees**博客首页JP?A R|Xn vP+R
intersect**博客首页RyEXcrOhcX
select employee_id,job_id from job_history;

**博客首页 {S'WJ HKl
minus

select employee_id,job_id from employees
2\rha6c${Q/j9VG0minus
n+E9Tm~0select employee_id,job_id from job_history;

e-j=e-e与j的交集;
9B&i5\X2x0j-e=j-j与e的交集;

注:**博客首页F N,WG!p hl
在select 列表中的表达式必须有同样的数目和类型。

 匹配 SELECT 语句**博客首页G``;^!K2r
 select employee_id,job_id,salary from employees
/J d2GX,kC)T!m G0 union
9OD-fL*H/`pf(YzL0 select employee_id,job_id,0      from job_history; 

括号可以用拉修改序列的执行顺序。

ORDER BY 子句:**博客首页4Pac/KY
 只能在整个集合的最后出现;
vw6YQS_ O3`0 可以按照第一个 SELECT 语句中的列名,别名或者位置号排序。  

 

 


3YtmZ&{0GROUP BY 子句的增强

CUBE 操作符的 GROUP BY

在 GROUP BY 子句中使用 ROLLUP 或者 CUBE 来产生分组小计;

**博客首页WU4ci^#Wj
ROLLUP 分组产生包括规则的分组结果和小计的结果的组合;**博客首页#Xw U+cMe
GROUP BY [ROLLUP](col_name_list)**博客首页4Y Wz s_R8nC\
ROLLUP:
9[|G+~Kl `6N'l0a       ab abc

  abc**博客首页6Pc-oVN"\P E0P
 ab ab
I9tSf] fk0a a a**博客首页j N Lhw
all all all

CUBE 分组产生包括 ROLLUP 产生的结果和交叉分组小计。
? J-`1[5fp$W(iX0cube:

a ab abc

a ab abc
4W&gb;M X)@U+t.\0all a ab**博客首页&C d1])A0zP[
 b ac
3MgK3s'Ie%\]&@0 all bc**博客首页9Bm1bXr'F
  a**博客首页 AEhXP6e
  b
6q aW \-?sV0  c
1q+?4H5YBO6EfT0  all

GROUPING 函数
G7V}1Xl6Z0参数一定是在CUBE或ROLLUP里进行分组排序的字段或表达式之一。

通过1或0来判断结果集中的空值是由于本身列的值是空的,还是由于使用CUBE或ROLLUP产生的空值。
5YD%eF;qu2Ay,h:PN"c01 代表是由于分组产生的空值,没有参与分组。
/@ nSB ?00 代表是由于列本身产生的空值,参与了分组,但分组中没有包含它。

GROUPING SETS

可以使用 GROUPING SETS 在同一个语句中定义多个组集。

只需要访问一次基表。
P8R#X(P r;n0不需要写很复杂的UNION语句。
q]8S E^4cvH}0GROUPING SETS 子句中组合的元素越多,语句的执行性能就越好。

group by GROUPING SETS((abc),(ab),(bc),(a),(b))

**博客首页5{rbp(j"P7Ec
组合列:

是一个列的组合,在分组计算时被作为一个单元处理。

 


`.|0AJ7J?[.L _0高级子查询

成对子查询:**博客首页 Z BAaP@8C0I9G{
行内视图的性能比成对子查询的性能高。

相关子查询:**博客首页C{yi4j)`u]R
主查询的字段在子查询里做条件(特征)。**博客首页%^#M1{N5GoHE
主查询先执行,取出第一条数据,把该数据传入子查询做比较,返回查询结果给主查询,主查询根据这个结果再做查询**博客首页-y i1\^ trH
依次类推
:@ E#e!ZW!rl5e0直到主查询中没有可查询列为止。

 

EXISTS操作符

EXISTS 操作符测试子查询的结果是否存在;
%L.y;C}z}z}5h0返回 TRUE 或 FALSE
T JkP0{L{:}(z:_$P0查询机制:


0VI,QVt Ng9X o0s0如果一个子查询找到了结果:

在内部子查询中不在继续执行**博客首页,VP;|S-Y
条件被设为TRUE

如果一个子查询没有找到结果:
6r?$O)l hAg0条件被设为FALSE

select col_list from table_name tab_alias

where exists (select 'x' from table_name where col=tab_alias.col);
i&j1~,L J^ G9W0用的是相关子查询

NO EXISTS操作符

和NOT IN 相对应,速度要快,性能好。

UPDATE 中的相关子查询

update emp e
0a4@a7Vs0set department_name in(select d.department_name from departments d where e.department_id=d.department_id);

delete 中的相关子查询

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15037413/viewspace-600898/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-05-24

  • 博文量
    51
  • 访问量
    51809