首页 > Linux操作系统 > Linux操作系统 > PL/SQL学习笔记(六)
序列:
自动产生的唯一值;
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博客 ” ,链接:https://blog.itpub.net/15037413/viewspace-600898/ ,如需转载,请注明出处,否则将追究法律责任。