复习:SQL语句4 X2 U8 T/ ~' V' W6 _9 D
select q" ?3 q% G# j F
DML: insert / update / delete0 n3 M; B' R: H0 p+ ]( [; t* ~
9 V% X' [2 p" z, |$ N) A# o \) t; s
CRUD ; w4 q% Y' Q/ e4 NC:Create+ }8 }: N& i( M9 }8 u4 \, k* ]! d; u0 M
R: Retrive 6 s+ e. ^4 a" }2 L* yU: Update ) A8 A. v' @7 J6 K; FD: Delete * F; t+ b. _5 D, x$ C. a, R3 }# P8 j+ i( f z$ h
DDL: create / drop / truncate / alter 9 o. J5 X# R0 P" n w1 V( K: o 2 s( Z/ u2 C, l f4 uTCL: commit / rollback / savepoint1 s6 M7 S2 o* ^6 ~) u& ~6 B; W
! Y. ]+ V# R5 Y9 ?2 n3 N. @DCL: grant / revoke6 b& s! r0 C' \, Z. t6 n: k
1 J$ D: P6 I% }
grant: 赋予权限; n. s( l3 u# I5 n
revoke: 剥夺权限+ x, k/ h5 d: M; x. f0 H" P
数据库中的用户: openlab hr scott) k) ^: C# @' ?/ q) c3 p
emp( w- f2 p1 j) Y. t/ l% |
4 b+ c1 T% r8 U+ d2 n0 H
假设现在的用户是openlab 4 s6 m5 ?) [) v: R7 JSQL>grant select on emp to scott;, v& i8 q% d% s' |: A( L3 c2 |
SQL>revoke select on emp from scott;3 ]' `! j2 }" B# D
6 Z0 Y, V x- z, H+ o) E% \, nscott的会话:; Q+ ]) P/ d8 z* J9 ~* Y5 U# P
SQL>select * from openlab.emp;9 g( W$ b7 F! U' A5 k# w- L
SQL>select * from emp;9 K! }. v. w* B
/ ]) q. l/ {5 B' O
& j0 M* {% d. v0 D. g* k, g二、数据库的其他对象8 K, f" h$ Z2 t
表 Table 2 E$ q" Z1 I4 i% e视图 View , r# t+ I* N; i2 m" h. C j索引 Index s, b' D' U0 ]& M/ f+ V序列 Sequence , J$ l5 ?/ R. A( a {过程 Procedure - e7 S: n5 Z3 E% u( j函数 Function 9 g* N2 p z8 ]# R% k包 Package 9 a. T& S+ V' ]! ~( x6 F触发器 Trigger + L% Y# A& [3 Z' [" f同义词 Synonym - p" e2 {' A% G/ D8 P) O2 o.... ; y3 V, Y, |0 |3 l i v+ |4 G' l4 v$ e1.视图View 4 A" S) N& k$ g$ R9 lcreate view v_emp_ning# e+ s& l3 h1 r0 }1 H
as & K! y& N1 i) z) K: Jselect empno, ename, job from emp_ning ; }- u3 }- N* }8 ewhere deptno = 20;7 n0 H% f* s8 U) K: P8 Y8 h
--使用和表相同 $ @# S* `3 i; j. N( wdesc v_emp_ning+ _+ I0 l4 o7 s8 U+ `: c3 m& I& |
select * from v_emp_ning;+ ]- ]7 `- s) K( b% H
--视图的好处:简化查询;隐藏数据表的列 , m3 o" c; o: U3 @& J4 z4 N 2 Y* F1 {# i& V$ a; d$ B" R7 O2 f Gcreate view v_emp_count! ]# B! E# \9 K: x* p) l$ d7 H# }
as$ K; s/ j7 }+ U& ?& K2 r5 P
select deptno, count(*) emp_num6 }- @. Z* A3 @9 u
from emp_ning $ A2 Z; U( S% \4 j6 b& Sgroup by deptno; ! i8 w2 h: Q! ~! h$ z/ [, h4 L# h& S. j, t--修改基表数据 , ~# t* c1 q0 J! s: W o* V3 M1 X( B update emp_ning set deptno = 10 w5 v0 w0 U0 j9 z" ?3 s
where deptno is null;5 c% |! s& F7 V& y6 e6 {/ Y: a) Q
--视图查询到的是修改后的数据。. [) |& ~8 Y. v1 H B9 V0 P8 j& z
--视图不包含任何数据。是基表数据的投影。 * P2 W# ~- V( h4 o- Hselect * from v_emp_count; $ Z: Z Y. [4 Z# m * O7 V6 |, Q0 f- p! m--创建或修改视图; u3 P; I. s" i
create or replace view v_emp_count 7 V! o* A" R% ^* u6 T) I, [as# M! b' c |; S) ]/ G
select deptno, count(*) emp_num, ! l0 d* ~) N0 a6 Fsum(salary) sum_s,6 m$ p' f6 Q1 M }4 ~
avg(nvl(salary,0)) avg_s,. h3 o. N# _ |+ T
max(salary) max_s, ; n4 Y; |- n: i$ r* jmin(salary) min_s7 ^% f! }; g/ J- R4 t
from emp_ning9 U7 J/ R6 \3 Z" e" W' G
group by deptno;1 R! J' x: Y: \$ s/ ^
9 s' T" I7 F/ K) J
--查询视图的定义5 X; f5 O5 R) N+ r
select text from user_views& ?% ^& s1 ^& b$ K
where view_name = 'V_EMP_COUNT'; 6 b! N; {& K5 L" @' R8 ]6 m# C--如果视图对应的sql语句显示不全 & w* E& b6 l. v) x- Yset long 1000" J: Q$ { n; Q; j
! D x5 ^+ M9 e) X/ q
2.索引 Index :用来提高查询效率的机制。& U) b: V4 c$ z, O. W# s! t
全表扫描: Full Table Scan: 查询效率极低" {2 f8 q; o; R7 e( R% x* @
索引查询:比全表扫描快。 + ?3 {' w+ x8 l, u) e' S! ^. w , e% ~- O1 _" N: L+ Z6 J索引的结构:数据 + 地址 5 T5 y* N: B9 x7 ` 张三 + Room203 : E) J t y5 `4 I* n & v/ F' N) e" ]: |对于数据变更频繁(DML操作频繁)的表, 0 @ X0 _3 _, z) @! S+ `6 L8 c索引会影响性能。 4 l5 l! x% x0 ?/ w5 A, c2 `+ J# r& f! x
如果数据表有PK/Unique两种约束,索引自动创建1 k* N& \ }# W# @2 D! P7 A1 k
除此以外,索引必须手动创建。 6 S) n' c+ ~- P: F8 _# N! I2 ycreate table student_ning7(, B) b% h' k: ]" a. b, {7 ?' e
id number(4), * D2 t% s5 _+ ~4 jname char(20),( I9 L! `3 d3 M. {
email char(40), ; c W z7 r# H0 qconstraint stu_n7_id_pk primary key(id), - ^+ f* h$ j. d5 tconstraint stu_n7_email_uk unique(email) m- I" ~, ^3 ~ h' l( K' U; y4 f
);1 K- p4 }$ U4 t* c
select constraint_name , O) [, H. O0 Z' r6 k6 Y9 ^4 W7 o" Y
from user_constraints i! R5 t' Y* @5 O% ?3 j
where table_name = 'STUDENT_NING7'; f! E4 i; Z; t# V' @8 Y; M
3 n+ u {% h8 K' x--查询student_ning7表上的索引,( ?: Z3 r" X/ ?& B* k' `3 y
和主键/唯一约束条件同名,数据库自动创建的索引。* m3 Y, v' i5 S* a9 N2 W, v% w
select index_name from user_indexes1 t2 `; h5 p% u% q
where table_name = 'STUDENT_NING7';! v4 b8 u, N6 j- c, x# x
: p7 z' H9 L, a* H--凡是id或email上的查询,会使用索引. v2 n1 y- K# u) }8 u, z# p8 D
select * from student_ning7- b/ A: A; H. P$ R) ^7 ^* F
where id = 1001; ' G0 m1 D& \: S: c " D3 [ W! U) `' F' k1 c--这种查询用不到索引:全表扫描 0 W5 E) H1 g% W+ F% u# s* _select * from student_ning7& R5 m( ?( Q, a0 ^' L
where name = 'zhangsan'; S* i; N9 }1 q" @) M5 v5 A, ~. ~* o# r- P: M& I% K
--创建基于名字字段的索引,索引名自定义 6 g6 g6 P1 S6 Xcreate index 索引名 on 表名(列名); 1 V' _7 \+ n; wcreate index idx_stu7_name ! x) @, t+ h/ Ron student_ning7(name); ( Q* Z& j' a/ o y& d1 ?* x6 D, p- b/ A Q9 a+ V6 Y
索引:9 b1 c1 F4 D! s$ ` V$ N8 H
1)了解索引的工作原理2 O& d* X9 m) f
2)pk/uk自动创建索引 & w4 f7 t h4 n1 Y8 c$ Q3)根据查询情况决定手动创建哪些索引。, S% t" u8 r2 p" q- X* g
; B! H) `/ Q6 n
2 H' e5 P* q2 T1 l/ ^ d3 H3、序列 Sequence --Oracle独有的 A& {8 q- @, ?. m
--产生从1开始的数字值,步进是14 I) S( X- X g# R7 W' @
create sequence myseq_ning; 7 a7 W, c9 D! t: I# c! c D% Y3 K* Dselect myseq_ning.nextval from dual; L D4 }0 z' @8 m/ @4 C5 A w6 L3 h/ M$ s8 z. Q
序列的特性:产生连续的不同的数字值 V* k3 }+ b+ g8 _0 T
用来作为数据表的主键。 - J, Q7 L# q4 y) C" l6 P# j+ E, c8 T+ [9 q2 B# F1 E
--使用序列产生的值作为表的主键值8 @2 Q/ M3 j9 g) k+ Z7 i. W
insert into student_ning7(id,name)! Y6 f5 w: _7 b
values(myseq_ning.nextval, 'amy'); 9 _& y, o1 l: E4 n/ n e3 z1 N! P, f4 q* F$ |1 j
student_ning7和序列myseq_ning的关系:! Z1 C2 `. l3 _% b1 O
是数据库中的独立对象 ' d z+ [$ i+ Q" `* |/ x--表可以用序列产生的值作为主键,也可以不用 4 t# p9 p3 L/ I--序列可以为一个或多个表产生主键,也可以不用, a O1 z1 v6 v, s4 Z
insert into student_ning7(id,name) " ?" L' x% e$ c3 H, H1 fvalues(100,'river'); - P \& K8 w' zinsert into dept_ning+ y8 O# Q" G, M! B% b
values(myseq_ning.nextval,'market','bj'); * s8 o; m9 R3 y6 L( E / E( X# t% R9 N; U* ?- ?--建议:一个序列为一个表产生主键/ s2 X! n* b' r3 M
; H1 t/ ?# M1 H$ C" G
希望主键值从1000开始,步进是2?2 c& g B5 s, z l3 J- R* ^- S* i- T
create sequence myseq_ning1 ! ?) v& [* _5 T0 Y$ tstart with 1000 ! e1 D0 w) ^9 e) aincrement by 2; . z$ M2 U6 `5 u; Y5 d, k" Y j9 \' U: F0 v! q, x! C( F
insert into student_ning7 4 G7 \+ d; D+ A" j( Qvalues(myseq_ning1.nextval, 'song', null); 6 f6 M. E" c$ k# t( X' O t' \6 H+ w' W6 G. r% X8 n
--删除序列,对曾经产生过的数据没有任何影响。) o( @( X" D6 {9 U7 J
drop sequence myseq_ning1; : j+ Q' Q: ~6 Q2 y `3 p, f4 p% _* Q* I" a! \1 T
SQL> edit) l! [; l; n1 K; K