该用户从未签到
|
复习:SQL语句
5 v. S0 J% m( b1 d; pselect
3 G. F5 K5 \8 D2 U6 [1 z7 MDML: insert / update / delete
" c! a; b/ g! E1 n- I3 r2 [0 p; e2 O% L" g/ x. k3 q
CRUD/ o! k7 S7 s( u" d+ B! x& z/ J
C:Create6 H+ f5 U, k; Y7 g {: q
R: Retrive2 X# j- u; ^7 D/ m7 m% f
U: Update4 h4 H- r! b0 W9 F3 R }1 o% T
D: Delete3 ^6 T3 L5 T* p* I
9 @* a( Q/ [8 _( p$ @7 t! ]
DDL: create / drop / truncate / alter
( G4 ~2 i/ [" n" T, |
, ^* Y1 i+ Z9 Y) ETCL: commit / rollback / savepoint( z" J5 ~. X( h
; o e' l& @8 hDCL: grant / revoke( ?, x/ d }" Y
; Y, K/ \* d# R- `7 h. E
grant: 赋予权限
) R( t. s6 p& f- E: _' L# F# {revoke: 剥夺权限
) y4 z% F- W3 B5 p数据库中的用户: openlab hr scott4 g& w- a, ~, R4 f" m7 u
emp1 ?" M2 L9 j( o
3 _7 R6 o# N; y+ ]7 ?
假设现在的用户是openlab$ f1 ?5 G9 m0 Q) p7 M3 i0 B. ~0 G
SQL>grant select on emp to scott;! `7 f0 s3 q# P/ a$ A" p7 L
SQL>revoke select on emp from scott;; P$ X& {' I" E5 S; e6 t
. u- ]9 y2 _$ @2 {
scott的会话:
3 j& v, J3 e: v& N6 W3 C ]* ISQL>select * from openlab.emp;! l6 F' o8 h, h" Z; d6 ]
SQL>select * from emp;5 t, b' w( F3 s8 `/ v! M+ ~! J
" u' X2 Z3 Y2 e$ `
" u/ Z% M8 m2 U7 y5 SOracle数据库的用户:
# R7 M/ {$ I" x. M% Jsys7 F \& R' h W2 c. H u; i
system
9 l- c/ G$ b, i, o" m) B7 g z$ t( j$ h& ^) O
scott/tiger
( O1 A2 t Y. Ropenlab/open123
" Q7 X9 e3 `" @& I$ \. _ wninglj/******
* l; J8 K7 @* @" i% ^; L% sexam/exam123! B5 O; Z$ s8 L0 o/ k
: y+ W7 V1 {, B/ v3 ?9 M) w# V) ~
C:>sqlplus scott/tiger@192.168.0.26:1521/tarena0 y6 _8 T8 x% p, p
SQL>4 B$ ?4 M2 ?) L7 P
- e, s+ k1 C& M
) o5 ~. [3 m( M7 f6 T& u2 g今天的内容:
( b0 ^& w' D0 i, L5 T1、约束条件, s, L# k9 _( d( b4 W
2、数据库的其他对象
! {4 v# i. O. E
5 ], S3 g3 o+ c8 ]一、约束条件 Constraint
g' d5 b7 m' W) f# n, A" F7 |& X1。主键约束:Primary key, 简称PK
2 Z8 k2 I4 Z, R8 w--建表时增加主键约束条件4 @1 a* |8 y8 V1 N, T7 ^& W
create table dept_ning1(
: _8 W V4 }% r2 U" d/ l6 Z6 Ydeptno number(2) primary key, --列级约束条件. |( T& @# N. N6 U. v7 j3 U
dname varchar2(20),: W7 i" j" z7 ~& `
location varchar2(40)
: ~+ j) a$ {% J6 D* ^! b1 E);5 s. A9 t$ v6 N4 ~3 F6 V/ V
insert into dept_ning1 7 M% l+ X, Z, n" A+ v. ^
values(10,'developer','beijing');
7 |2 @: D0 ]5 t2 hinsert into dept_ning1
7 {, r0 c: y3 `. B+ _" nvalues(10,'market','shenzhen');- l7 K* X h0 j% r0 E
--如果插入重复编码,会提示:
4 p' _2 B, a, F8 Y& J6 f1 SORA-00001: unique constraint (NINGLJ.SYS_C00634053) violated
( ^" [% w0 e# V3 r其中,SYS_C00634053是数据库自定义的主键名
5 `% u3 b* G0 @* c. i--约束条件如果没有显式命名,
8 W( ~, ~& ?0 `% Z' W0 V数据库给约束条件命名:SYS_C*****: I$ m5 t" R8 ^1 d, `; R% `
* l* ~+ u: `1 S4 U+ G--在建表时自定义约束条件名$ V5 ^& B- X" G( }
--建议命名规则:表名_列名_约束条件的类型/ D f1 r( `7 I6 n- j c
create table dept_ning2(
5 M" ?3 _- D9 \& C0 vdeptno number(2),
. r6 z! r: C" C! l0 F% Pdname varchar2(20),
1 U. V; f& C- [ n. }9 Hlocation varchar2(40),
% t7 ] Q5 X, D# Q1 i/ i* qconstraint dept_ning2_deptno_pk & r9 |7 {7 x) {# O: ~
primary key (deptno) --表级约束条件
. z, d% [( S8 _2 E P5 j. R6 u);. [1 w' _$ P1 E$ ^- O7 z4 Z9 @8 c) v
--当插入重复编码时,会提示具体的约束条件名字错误。. t/ ?; @8 D i0 k0 d" f/ n
--方便定位出错的原因
6 s3 R) y; h# d4 c2 Q: H! ?$ j8 d I4 o: k$ _: s0 H; T
主键约束:primary key = 不能重复 + 不能为空! I, g8 W7 \ F6 ^* o' E
, ]: \- a8 C0 u1 ~1 _$ z' u" p A2 Y2 ?9 K2、非空约束: not null,简称NN
/ L3 R3 U+ Y2 y9 k) w学生姓名必须提供,但是可以重复# }% H& |3 g2 I% M. u% T# D3 G+ s) G
--只能定义在列级
% z* X* f" w; r8 [) |9 G: {9 zcreate table student_ning(
+ h. U, Q6 W+ R' t" y+ ?id number(4) primary key,3 g3 H, ~) B) b" ^
name varchar2(10) not null,/ \5 A* v$ L! f: K3 r3 F
age number(2)
( O+ Z6 {9 u" L);
0 m( a3 m% |' m/ Q1 E* Jinsert into student_ning ' \4 t: N, O/ l e2 Q. x
values(1, 'zhangwei', 20);. X! u# D1 B& Z( |8 {, P
--名字可以重复
; Z: O- X( F' finsert into student_ning
* p! o( L ]# v+ n/ d+ Tvalues(2, 'zhangwei', 19);4 a# U3 z% o* z+ ~% c! V5 P* o, R3 N
--提示name列不能为NULL
7 B# M$ b$ T( V8 ]) I; y6 l& Ninsert into student_ning
$ f( I6 {$ I# M1 Y& Fvalues(3, null, 18);
) K j7 v. s- Q9 W' ~
" e b# r: {2 \5 S6 k! ^) F3、唯一约束:Unique,简称UK
# E. W$ _4 V( t, |: Screate table student_ning1(
6 u* B& R5 N) E( C4 E; _# Uid number(4) primary key,
. I2 ^' F# O1 I' q5 nname varchar2(10) not null,
9 C3 L3 h3 e; Z yemail varchar2(30) unique,- N1 J/ W$ f: S* I+ ~0 g# u9 S+ `3 X6 |
age number(2)' U6 H; I' D% W- |* o1 M5 C9 G
);; x A1 v: J$ o$ R) e" {& s2 V7 u
insert into student_ning1
0 c* d4 z, x0 }/ ivalues(1,'amy','amy@doctor.com', 19);7 k5 S- _; }( F3 F- t# I+ w# {
--ORA-00001: 唯一约束条件被违反/ D4 t v( d9 V9 E: o
insert into student_ning1
2 ]# ^7 g8 S, X1 d2 ^) ovalues(2,'rory','amy@doctor.com', 19);
# q" N+ {# z* e0 I- n- h& V+ q( c }; B: g) J* i
--唯一约束建立在表级( J: l' |0 Z. \- J/ K' P6 h
--主键约束建立在表级1 T# M- O5 `9 ?% Q
create table student_ning2(" C; c- i! X" z, f* s* a$ Z
id number(4),
! d x4 h) v# @+ L$ i* ?name varchar2(10) not null,
/ x8 Q; v! b' d8 v. Y6 Lemail varchar2(30),/ n9 a) {4 {7 D( [) m7 r
age number(2),
4 J0 d; K n+ W5 tconstraint student_ning2_id_pk# B% \8 ~% k9 Y7 O( `7 i+ |
primary key (id),
0 @ l) _, {/ T9 G9 m2 xconstraint student_ning2_email_uk1 l, w( i/ _! J. r: d$ R9 {# A& ?
unique (email)3 i, q% }1 m: f7 x
);
1 q% N+ o, g, K' ]* x, s& m0 f M$ r" n! l
insert into student_ning2" @( c( h8 q+ A- A, d( b
values(1,'amy','amy@doctor.com',19);
' c& \! C J b" \0 z
' ]3 d- M* Y) `5 s0 \3 l# d--unique约束只要求不能重复,可以为NULL7 B. M( y1 s. S, L1 o7 L
insert into student_ning28 J. }/ h- K) i4 o; `. g
values(2, 'rory', null, 20);
' n8 p% ]* X9 N R1 E
( d. y( ^/ o, |% l--不管是insert还是update,email都不能重复。3 M5 p+ n l" i2 c
update student_ning2 set email = 'amy@doctor.com'3 C! H3 ]$ F$ Y
where id = 2;
: i! A3 e5 `8 x9 P# I) ^ O N" n( I! O
4、检查约束 check 简称 CK1 c0 ]: h. \( }" c8 A0 ~
create table student_ning3(5 i2 }+ G2 }3 h/ B0 U$ \
id number(4),
$ _5 ~" K3 q7 w" c. cname varchar2(10) not null," r$ Q" N( T6 z, y" p5 ?7 D/ |- |
email varchar2(30),; G! K8 U& a, u' B* S1 U
age number(2),
* e7 q$ [8 h7 n s& Rgender char(1), --'F':女生; 'M':男生
. h3 T1 B' ]% E' b) \constraint student_ning3_id_pk
/ D b% I7 A7 Z/ p+ Gprimary key (id),
* A s! }& b$ g: X0 ? Z% Cconstraint student_ning3_email_uk* d/ D5 E7 E5 ^- v
unique (email),
4 F. I1 B& m- e- D3 Bconstraint student_ning3_age_ck7 x, j1 X5 ?8 p2 |0 q9 F; U& a, \
check (age > 10),
5 p3 H$ A; c7 uconstraint student_ning3_gender_ck
2 Y! F! s' Z1 x' _$ e- J' y4 X! _; ?check (gender in ('F', 'M', 'f', 'm'))
- V5 \$ \6 L# G# F);* c: k7 H ]+ Z @/ T! u, J
insert into student_ning3) l5 ~: b: u0 I9 i- Q2 B
values(1,'amy',null,19,'F');$ X% f& H t4 S
insert into student_ning3
) m' S ~$ z0 q( ], p f. u3 I( Ovalues(2,'rory',null,8,'M'); --违反check约束 age > 10
' j/ a" ]( n9 t# Minsert into student_ning3 ! b$ o# Z* g- u! ?' e
values(3,'doctor',null,50,'A'); --违反check约束 gender in ('F','M'). S* f* J8 {4 s2 s- r4 ^3 Z
! h! l8 |+ g% \$ b
PK / NN / UK / CK / FK
4 j2 n7 l2 j* |& ]4 h, c& S
: n/ J1 J6 Z6 u) q3 b/ c8 V5.外键. Foreign key, 简称FK; z. ^3 a9 F7 a7 K7 A R4 L
create table major_ning (- j# e2 A2 D: C+ I, s- ?
id number(2) primary key,
; V* H! ]0 V7 S( W% P: b8 t: Bname char(20)
! R9 f' z- ~7 T" J);
+ m" E2 H9 M) [: J. F8 K5 ~insert into major_ning values(1, 'computer');
4 R4 B/ Y& o) |4 d6 H8 x# ainsert into major_ning values(2, 'history');
, K/ y& Y6 c O# x! Rinsert into major_ning values(3, 'music');- y1 b7 T5 t) H, b, }3 T1 U4 Q
insert into major_ning values(4, 'sing');$ O; {2 M; d4 l# W; z% F
commit;
% f R2 m, ~2 ^' Y7 |% h( ~create table student_ning4(- w8 W( O6 o$ {! r4 P4 z
sid number(3),
- o4 b5 z/ i4 Wname varchar2(20) not null,
* `* z8 v* v, m% y' g. bemail varchar2(30),
" s; T! G2 V2 [; M e% _0 Pgender char(1),
9 E( y0 [- J1 W8 ^5 c. F2 Cmajorid number(2),
% I# [/ V0 w1 Nconstraint stu_n4_sid_pk primary key(sid),$ d" I2 e; r# _' H
constraint stu_n4_email_uk unique (email), F5 n2 v/ y s6 r% U; n
constraint stu_n4_g_ck check (gender in ('F','M')),1 |2 R1 R4 V5 {, x" T9 A3 X
constraint stu_n4_mid_fk foreign key
$ h, v; J5 g3 p; u$ I# G5 @+ j (majorid) references major_ning(id)
3 M7 o% J0 g7 T$ n) _/ @);4 H' H: I) V) H/ A' q
: r0 `8 m) H8 T9 J' Dinsert into student_ning4. c2 y, G$ O4 e2 C, O
values(101,'amy',null,'F',1);
1 |. z" }" i) Q. w' V- W7 {4 T--新增数据,不存在9这个专业8 p4 T( P" Q( H5 F0 o
insert into student_ning4% u) t3 N5 ?& A+ E
values(102,'river',
2 \4 k# X. u1 o, x; }'river@sina.com','F', 9);
' W( v9 ?0 U2 D: _--提示错误:% H4 j/ L; n E8 ~$ | w2 O
ORA-02291: integrity constraint (NINGLJ.STU_N4_MID_FK)
* W6 _6 [0 C% Y% H% f+ S2 `7 G violated - parent key not found. w1 L5 u v% w5 u7 V& M( Q
insert into student_ning45 U8 x+ c |# A# b) T
values(102,'river',: R% p+ Q/ Y6 r K4 K0 o
'river@sina.com','F', null);. o" @; Y6 l/ Q$ o# H" X- c! h
- I) z4 e; T/ N7 g+ H- e
--有学生属于专业1(computer)- {: f) V1 B8 v2 @
delete from major_ning where id = 1;* d8 _: \1 [7 k0 C
--ORA-02292: child record found
* b2 Z* n0 M. k p+ A: d8 G' @, V& ?
create table student_ning5(, h, n7 j7 A4 \# u5 {
sid number(3),
7 m$ ?8 u8 P: y$ Dname varchar2(20) not null,0 o' z+ [0 k3 A u
email varchar2(30),3 ?& R5 H6 x( h Q
gender char(1),
& D" M1 J* ~& r# Xmajorid number(2),
* A8 ^& l- A' X$ {$ B. R Oconstraint stu_n5_sid_pk primary key(sid),
, |1 _" X0 ~7 |0 cconstraint stu_n5_email_uk unique (email),+ J6 ~5 G) O7 A3 E
constraint stu_n5_g_ck check (gender in ('F','M')),
, \. A; R: y( g8 Vconstraint stu_n5_mid_fk foreign key ) I8 ~: N$ G/ E; [$ ?
(majorid) references major_ning(id)) Q% S) n; G& _3 H5 M
on delete set null);& m/ }+ o0 O/ \4 r) v
8 v6 H b- h- z8 _- Y; i
insert into student_ning57 ?6 Q# p: k; k& A6 Q O% }
values(101,'amy',null,'F',4); --amy是4专业的学生
- I& E) G, d( O; W {# c--删除编码为4的专业
0 j s6 P5 j) P( x! B+ T9 ^delete from major_ning where id = 4;
' I' g. B; ]( t7 { D4 `6 J( y--amy的专业被设置为NULL) V0 K* T$ |& L7 y( O$ R
select * from student_ning5;
# s6 b# d! ^) t
# u' R/ \# d1 G1 i5 h5 hcreate table student_ning6(. H- f7 _0 [' V
sid number(3),
; \3 V5 J b7 w8 S1 S# h3 }2 ]9 W; sname varchar2(20) not null,
+ E2 E" R7 j+ a E* Cemail varchar2(30),5 }, J2 K$ O2 v
gender char(1),* V" P% z! p5 z
majorid number(2),
4 |1 O3 g. Q! Z" O5 ~constraint stu_n6_sid_pk primary key(sid),& _, R- P; ~4 q4 x9 S7 q
constraint stu_n6_email_uk unique (email),
4 F9 |; u" Z- M+ b( {constraint stu_n6_g_ck check (gender in ('F','M')),
# w& ^& |) A) }constraint stu_n6_mid_fk foreign key
( y2 w @# y6 S$ i (majorid) references major_ning(id) a; _- D3 n9 {5 h5 }2 n: z
on delete cascade);
@ }; l" ^5 O0 y g5 a! k/ n3 C3 M: l' _2 M I" h
--复制表,不复制约束条件。& o- N( J" H5 ~3 g. b+ C# Q3 _6 t
create table 表名 as 查询语句
' g" K5 g* b, B- o- m/ J1 b& w$ B: {" f, ~
--建立约束条件的时机/ o2 f% O4 Q4 L# ?& a6 ]
--建表同时建立约束条件:
1 q. A; U: u s- u0 R3 j/ F7 K7 @( dcreate table student(+ B4 X7 E$ L% o' D
id number(3),( J. c9 Y2 a! h2 o% d; W: I
name char(20) not null,
1 T4 ^! I4 q/ y' Amajorid number(2),) a {3 u% l, I
constraint stu_id_pk primary key(id),9 s/ m$ g5 b/ f% `
constraint stu_mid_fk foreign key(majorid)0 a' y+ q* L4 I) r5 H
references major(id)
- Q8 \1 h9 |2 `9 [( p);
* b' L: q3 _. X8 ?--在创建完表以后创建约束/ ]- A7 P" t0 o `- H
create table student(2 l8 w$ D: w% F& o5 X% K" a
id number(3),
- I0 F' h' x) I4 U+ ]name char(20) not null,# L* }: f2 |9 X9 ~3 e
majorid number(2));( D0 _/ L; G/ Y3 f7 W4 ?4 H
alter table student# Q; p: r4 B. P. t; H
add constraint stu_id_pk primary key(id);# A: i0 y) T6 |4 j$ V ~& x' {+ n1 o
alter table student: N: e8 |3 z$ w2 t! ~) A4 I
add constraint stu_mid_fk foreign key(majorid)
' w5 j! L" k" b! u& E7 C) p, N) w) K references major(id);+ n; N( U& c8 _; ?- Z& ]/ V* l
: H1 O$ Y& \7 g& C5 w
-----------脚本文件begin---------1 @* D: ] L! }9 Q0 w
alter table student drop constraint stu_mid_fk;2 ?% H0 m+ D( v8 F* Y
drop table student;
. H6 ?4 W" j& u$ n9 c! _* C2 hdrop table major;/ J S& i$ \* t4 I' d& a
create table major(....);
/ p+ `: O; }* D2 A( P8 e! @create table student(....);6 L9 L# h I3 F9 C6 S
alter table student add constraint ....# E# w" `* f+ I1 Z
-----------脚本文件end------------
; p2 }" `) G/ R( R# q% ]0 [" u1 Y8 X( X+ d9 q) l( x
user_tables :用户所有的数据表0 r8 _- b; \- t7 z
user_constraints:用户所有的约束条件- ~) ^$ R: X& e& M/ a
user_objects :用户所有的对象(表、视图、索引...)
1 R. f- G! d! Y% D) H. [
: K5 ]9 A% }% T: i4 o" o3 K" P$ qall_tables :用户能访问的数据表,
9 J- g# s8 i+ u1 V 包括自己的和别的用户允许自己访问的
) P$ ~. V' v9 k; x1 P6 }all_constraints:用户能访问的约束条件. Y' {+ h# Z0 j$ }) e4 L6 v
all_objects :用户能访问的对象(表、视图、索引...)
8 f: ?- v7 n+ `8 N$ w9 f, s0 I* R% Z1 i9 c$ G* z; f3 c+ F. ]: Y
PK / FK
* z) s! k' ], p1 y) KNOT NULL / UNIQUE! e. L0 m" ^; `
CHECK0 D; G0 s0 H% R# f- R
其中:CHECK和NOT NULL可以在程序级别控制
% E5 e& h8 }/ s" I7 R
, g, W" @& M1 m9 N7 o# u, c二、数据库的其他对象 U# Y1 d; _, Y7 X/ u' b
表 Table) w8 B7 A/ ~ G9 P( \
视图 View
( p4 q( `" T- [索引 Index
7 l) S3 U9 ?! O- y1 m序列 Sequence
6 @0 \+ g! b1 T7 V过程 Procedure
$ r3 a6 X7 x$ X函数 Function
5 k0 }! w. }4 g, s, H5 D包 Package
- s1 l) \- C; U4 Q" ]! s: }触发器 Trigger
9 z* P' F9 E ^! {9 f$ E同义词 Synonym
/ u3 `: L" l9 Z# ]7 O# h" \% M+ ^....
S" w" V6 s( Z* r# k
# f9 K. ^5 @* { Z1.视图View& b3 ^& G% b0 x: r6 O4 u
create view v_emp_ning
/ U. M) D; X! _+ b& V1 Aas
. H! v( W8 U9 w1 wselect empno, ename, job from emp_ning6 ] g0 r; t7 P6 g4 J% O
where deptno = 20; d E0 C. z9 T, R4 G8 |- w+ n% V" o
--使用和表相同
; t% j' i ^& _6 a' @) M% `! Bdesc v_emp_ning1 ]; z$ K* Y- w' j9 x
select * from v_emp_ning;. [1 \) I, z! _7 n9 m
--视图的好处:简化查询;隐藏数据表的列1 o# t, A0 I. u! a8 \: i' x7 z
6 O) ^/ S9 s" U
create view v_emp_count
6 k" D( X- ?4 ?: O: r T, [+ o5 ras
" C# ^& W0 g$ k5 u3 wselect deptno, count(*) emp_num6 E0 v& ^2 V" Y: h( b# p
from emp_ning
; ^% R4 p4 s# vgroup by deptno;1 k( P! R! ^' @1 Z- |3 p
--修改基表数据$ G" N0 K5 A/ r0 N0 Z F5 B
update emp_ning set deptno = 10, j9 |1 x2 {* [9 o* ?( f9 G
where deptno is null;: t$ J. R8 o7 r" U4 c3 B. m
--视图查询到的是修改后的数据。
4 [/ U9 ^ h1 [/ O--视图不包含任何数据。是基表数据的投影。
: y. d. s2 \& z- P" e3 K, u! |select * from v_emp_count;& Q m* o4 Y& _9 Y+ ]) m
1 N5 H' l2 ^, W- F
--创建或修改视图4 j. J" |2 F) ]/ `3 j
create or replace view v_emp_count
' y- f% U9 F5 F6 k6 c2 s2 v% v3 Eas2 I8 h' j9 F6 H
select deptno, count(*) emp_num,1 Q9 L6 ^2 B c: I" G; V1 G3 r4 ?5 H; U
sum(salary) sum_s,7 z0 ~0 y, O' Q D
avg(nvl(salary,0)) avg_s,5 G" K0 b, C2 L% b9 z
max(salary) max_s,
* G t) N1 E3 j- ~* J2 [9 [2 p. Cmin(salary) min_s3 X" r2 J0 @( J/ v1 D2 S' B1 W
from emp_ning+ m% N* B( P. i2 x
group by deptno;
3 E2 P& }2 d1 e2 |0 b7 \. h. l- i, v! o, t0 R
--查询视图的定义; H7 l* q6 R8 J* N
select text from user_views) [* C6 J [' h! n+ y9 @% i; j
where view_name = 'V_EMP_COUNT';
1 ]) v/ r$ c0 T* K3 Z; O4 ?: V% J--如果视图对应的sql语句显示不全7 h' `) G# p9 v; z' f% F/ \/ U2 g
set long 1000
4 u9 z' {7 E7 I9 R2 d* [; e) @' s; ]& s7 P; j
2.索引 Index :用来提高查询效率的机制。. u( J4 U0 L s9 y5 `1 m
全表扫描: Full Table Scan: 查询效率极低
6 Q& z6 B I/ K$ g! n. c1 ]' v% m" T索引查询:比全表扫描快。
) c! x8 Q+ l* |+ y; \( d% }
; m' [2 R! A4 X索引的结构:数据 + 地址3 d4 w$ d" M9 o; o
张三 + Room203
1 w" f" [1 S6 a) V W7 d4 C0 V
, ]9 j9 \) t; g7 y6 p4 X. U对于数据变更频繁(DML操作频繁)的表,9 _/ Q* B3 D1 y& V* Z) m/ O' f$ Y( k
索引会影响性能。
2 e4 z8 s& Y6 F! M0 @ w
% F6 G% m% e9 s( i: o( P6 [; n如果数据表有PK/Unique两种约束,索引自动创建* P2 \9 {# H2 v+ U' z
除此以外,索引必须手动创建。 Z- `8 _, G' B( o
create table student_ning7(
* e8 Z" U( ^' e% f2 w0 Wid number(4),
9 a6 L8 z- V( W+ e& h: h! q2 Ename char(20),
! h" M& d( a% ]email char(40),7 C: d" K5 G/ }" T% x) O
constraint stu_n7_id_pk primary key(id),
. p3 ~* V$ e; E( Y6 r+ |constraint stu_n7_email_uk unique(email) H# e" B7 J6 B) z2 _1 l0 [( m9 ]5 E
);, B3 j( Y: B8 {" L" V4 B2 s
select constraint_name
* V; F; u- `/ `' A& ^from user_constraints9 t8 v; w5 P3 x7 N/ F5 n5 Y
where table_name = 'STUDENT_NING7';
' n; p! d( ? r. L8 J) R8 {, [/ u* V: N
--查询student_ning7表上的索引,5 Q! f# q$ N9 d5 Y4 q: F
和主键/唯一约束条件同名,数据库自动创建的索引。
8 M* D9 g! g, H" ]7 |2 A& iselect index_name from user_indexes
- c$ N9 _& A; ~8 p7 Lwhere table_name = 'STUDENT_NING7';
+ G" q- S: s7 m" C2 I/ Q2 T8 o) ?! w1 V' }' U1 t
--凡是id或email上的查询,会使用索引% G, K) L* w; B9 V8 D
select * from student_ning7
1 G8 K/ c6 r; s2 y8 W& z0 bwhere id = 1001;
3 P8 C& \6 J7 E9 \# M9 |
/ S& z$ |5 b, E1 O! Q--这种查询用不到索引:全表扫描
; x' s* |2 S1 m; dselect * from student_ning7
5 o& p* O+ L9 X* o3 owhere name = 'zhangsan';- u2 X+ h% I! E+ d5 ]4 J
9 ^# ?! _) o1 b- ^& X$ q--创建基于名字字段的索引,索引名自定义9 x% P. `+ H2 Z: ]6 b% i- Z
create index 索引名 on 表名(列名);
# L; F" ]1 L2 H5 ncreate index idx_stu7_name / Q+ Z1 ?1 j. `9 F) g
on student_ning7(name);
6 t) j+ l' ~. D4 [4 P6 V3 v
. k/ |8 O( D) ^/ h, A) L: \- M7 B( i$ Q索引:) g5 j5 ?! l7 e) b0 [( j& p
1)了解索引的工作原理" v, E* h) z) j4 A) {2 h
2)pk/uk自动创建索引9 F3 o4 \4 ~6 r
3)根据查询情况决定手动创建哪些索引。
}. r: @! s" S+ |) }9 r- v! C$ n6 A6 x' G
! P" i6 i. |* j6 q; H& x3、序列 Sequence --Oracle独有的
( a$ X% p5 n0 L' m" s9 m" b* B& V--产生从1开始的数字值,步进是1
4 x: A# _3 G0 |! I/ h: `create sequence myseq_ning;: G S: F4 \. E5 {1 ]+ a# n
select myseq_ning.nextval from dual;
- S$ _0 h; r6 A% v( u
/ m b& F" S7 g, g- d& I3 I x% U序列的特性:产生连续的不同的数字值
# C; J( x! h5 S3 o2 c用来作为数据表的主键。 I$ F* p; {4 x+ J; S/ P
$ `* ?- K+ E* `, A--使用序列产生的值作为表的主键值
' @$ M2 q/ p( j+ Y( P7 t1 i. p4 }& L" rinsert into student_ning7(id,name)
$ P& {3 V5 ]2 R7 A" ]3 R1 cvalues(myseq_ning.nextval, 'amy');$ R" T: ~6 A7 O: M
( ?# D( @4 `8 v9 v( B3 F( Ystudent_ning7和序列myseq_ning的关系:# p' H, ?8 A! [0 b
是数据库中的独立对象
+ \0 ^* o$ q4 M--表可以用序列产生的值作为主键,也可以不用6 M! n! u# [4 k6 ] E4 Q. O8 ?* K m
--序列可以为一个或多个表产生主键,也可以不用
$ X1 u+ ^1 p) u P% q# _# @insert into student_ning7(id,name)
5 C# J0 }" E8 Z3 u: Q kvalues(100,'river');
. V7 W5 s! {/ E- v, t* dinsert into dept_ning
5 s4 e4 Q7 j2 |7 c% `values(myseq_ning.nextval,'market','bj');
5 i6 l' H6 V5 M9 |* ]+ j; c) e. v; {$ `0 L% O( H& t) O
--建议:一个序列为一个表产生主键5 ?+ f7 j5 c$ v) ]! E
9 U( }% v: \! l$ a$ E. h' S% U
希望主键值从1000开始,步进是2?
; ~; m7 q- ~/ J) [$ |, a; {create sequence myseq_ning1' U/ U! P- f0 x8 N6 w( x) Q
start with 1000* X/ q7 |) h+ \9 t/ K3 P* L
increment by 2;
# F4 G9 e1 L1 F% R$ ^ D1 W: G1 V/ ?' l) J& T, U
insert into student_ning77 q2 n+ [. x0 f" P% |
values(myseq_ning1.nextval, 'song', null);: h# m8 t% ^' Q! C
3 U& R8 P1 U5 w3 [! @--删除序列,对曾经产生过的数据没有任何影响。
4 }8 b4 o$ V" \drop sequence myseq_ning1;
6 R' c; B; d) r l. M& }0 l) q7 m
SQL> edit
4 L6 M( t8 {; J+ l
# V' i& h' _2 i1 L) | |
|