该用户从未签到
|
复习:SQL语句
; Z9 Q2 f% P- w ` m; Rselect
! w8 p1 q0 X+ {( }3 G0 V" eDML: insert / update / delete
+ c+ K2 O% o6 G4 d" u
# @0 ~% K/ @4 i/ X* \: d0 o/ K8 }5 MCRUD, c1 o6 o* I, l
C:Create
# x4 g8 {4 Q) p# q; N5 c) ]! IR: Retrive
% @; A% j% X8 o8 Z8 [. aU: Update
, R4 h% S* ]: a2 A" x; v/ {D: Delete
0 B( N. u! ~* B0 c8 n6 U. }" j. x* O8 ^7 U+ w. R$ R" n& w
DDL: create / drop / truncate / alter. s) a( W) a8 v: h
' m- G$ T4 e& A# Q$ K/ p* G
TCL: commit / rollback / savepoint2 Y& Y3 c7 g1 D! E$ }; i9 u
0 O" C8 S5 {" u3 A. V
DCL: grant / revoke: r) x# v' k5 u
5 h; z9 s2 i0 e$ Bgrant: 赋予权限% c R6 K) ]9 O; Z( z8 O2 r7 ?* v
revoke: 剥夺权限
" ?* }2 c# Y, n" s数据库中的用户: openlab hr scott, n) o, A7 F5 @9 G3 F/ }
emp7 ?! ]& t4 _' y! d, W' I
/ @! P, ]! {3 C: t b0 c& v假设现在的用户是openlab K4 u+ Z+ ^2 q6 x
SQL>grant select on emp to scott; ]* c- [3 a) c3 v. Q2 ]3 ^
SQL>revoke select on emp from scott;
9 q9 |/ A( ? ?! F
% d, B- u/ O8 t' a0 o1 ascott的会话:
( f: O' p# |! j6 V: r. b, YSQL>select * from openlab.emp;
8 `# c% M- |! Q0 _SQL>select * from emp;1 z6 ^4 F% q% M1 K& N
0 W5 |% z6 u: a9 M" b% b5 y
! _( O+ d6 S" G9 M1 A$ i3 MOracle数据库的用户:
+ p! G4 U+ y1 Y f( ?sys5 }9 [! r6 H* e$ g; Q
system
; z& }& R v0 i; ^ f, ~( u, I8 ]+ z! k- E7 \% y3 w! M
scott/tiger; _) q1 q8 @9 o+ F% P' {7 z
openlab/open123
; h" W. j# D1 o& wninglj/******# b# ?0 v9 E% c+ O/ b7 V2 c- Z
exam/exam123# r, y2 Z0 o0 Q* u; i7 F0 m
' E! R% @- J ^$ T0 O9 }' X+ z. _
C:>sqlplus scott/tiger@192.168.0.26:1521/tarena
1 q& d8 m( O% l YSQL>
8 v M. g- s! R3 O' X0 e; U8 q$ s
- e/ N$ S# w* S2 l4 ]' w D4 ~# a3 M; z( Q# D7 p
今天的内容:8 e, b; Y Z, {2 }9 [ z
1、约束条件
* l- o$ [- ^! v- i/ d) A2、数据库的其他对象/ [* h; q! r1 Q$ y9 g: L
% [7 f3 X, Z# T# d# g- p
一、约束条件 Constraint7 m$ E G9 D7 P' j4 c
1。主键约束:Primary key, 简称PK! c* L/ q0 m' I7 r
--建表时增加主键约束条件
; y; t' n8 h4 A3 y- ~create table dept_ning1(2 W5 t3 f" J5 X6 {) p2 M1 Q+ y3 k
deptno number(2) primary key, --列级约束条件# \/ ^. {! ], e% h. W( H
dname varchar2(20),4 b0 a* P6 z6 A5 Z
location varchar2(40)
. y2 G7 L. d! e+ R# _);6 _" x N, Q: u: t- q
insert into dept_ning1 0 g& `, v( F! Y" k" ]' Y
values(10,'developer','beijing');
' h2 o9 S9 C4 N2 W/ iinsert into dept_ning1 7 ]" W( h4 ?% y8 c7 p! N
values(10,'market','shenzhen');/ f6 T- X5 R; T+ F* Z# n) H5 \% r
--如果插入重复编码,会提示:' c* ~5 `3 y$ A- j/ W6 a6 g
ORA-00001: unique constraint (NINGLJ.SYS_C00634053) violated
, I- M4 _4 Z X: J4 z其中,SYS_C00634053是数据库自定义的主键名) S' a: P# d4 V& I5 @( w
--约束条件如果没有显式命名,9 S6 v! e {0 x: W$ c
数据库给约束条件命名:SYS_C*****
- }! ?" B p$ K% }$ N* s. ?
5 M2 e/ A1 @& P6 \# j* ?1 [. F* b--在建表时自定义约束条件名) T4 w8 `' D! v
--建议命名规则:表名_列名_约束条件的类型
# d# w; Q. g" T7 e, ncreate table dept_ning2(* p7 i/ w1 N9 r* v
deptno number(2),
& f8 [ N1 ]4 G3 p& bdname varchar2(20),
2 z7 x8 w3 | M# ~! I0 klocation varchar2(40),
2 A6 e$ e7 t' I" l& O* ^constraint dept_ning2_deptno_pk . d, ^9 u6 g- j1 M, q6 d9 r
primary key (deptno) --表级约束条件
7 @. b) b3 y' Q! E) i+ P);
0 K+ c% c9 ~8 D6 j--当插入重复编码时,会提示具体的约束条件名字错误。+ h& `# z: A2 J4 b5 S% z
--方便定位出错的原因 Y4 _: P8 W2 i. z
9 O+ r2 r# `9 @: Y7 i# H
主键约束:primary key = 不能重复 + 不能为空
" o) }1 w' Y& z( Q7 y
/ r& U" d$ q* d; H2、非空约束: not null,简称NN
. c [: Q3 Q: J7 x0 C4 Q2 z学生姓名必须提供,但是可以重复
* ]4 F$ y/ y3 R: V--只能定义在列级4 ~/ m/ p A2 O# ?2 m) Y
create table student_ning(
1 u6 ?: F* e8 |3 f: U" b+ gid number(4) primary key,9 S8 N; W- B+ B: _: l7 q
name varchar2(10) not null,
9 _8 h+ G, X; I0 b$ N1 }age number(2)" f& e* U( v& z6 V) v7 m
);
& |. Z& p) s% @) c/ p Kinsert into student_ning 8 p0 {) P- |' `4 ^' K
values(1, 'zhangwei', 20);
+ b: a+ [/ y5 z+ Q' Q--名字可以重复* @$ c: w+ R8 L% b
insert into student_ning + F5 E; q! P) q4 L9 }
values(2, 'zhangwei', 19);
/ X" }% m8 z! ~8 t8 c& y--提示name列不能为NULL; w. @5 d( ~' x# f
insert into student_ning * K. J2 O; q; W% {7 }
values(3, null, 18);7 `, w1 j7 ]2 q1 P. f' i
* q# v+ [; d8 H, u
3、唯一约束:Unique,简称UK6 T1 |* O$ Q8 ]+ q5 z$ `3 G
create table student_ning1(
) B4 k# a5 B D% Eid number(4) primary key,: L3 i4 S4 @+ C8 ]7 _
name varchar2(10) not null,# Z7 T2 r9 U3 C
email varchar2(30) unique, A5 z7 Z5 T$ O8 {
age number(2)& N# \3 |- I" L$ o: f; ]% G# r
);
$ [6 H3 I/ u# {insert into student_ning1
/ n, {8 o0 o: Q) B9 T- B- J0 jvalues(1,'amy','amy@doctor.com', 19);& V6 K2 L; F7 _
--ORA-00001: 唯一约束条件被违反; t" E! V8 z7 F5 i" S2 K% B
insert into student_ning1 ' U M) ?2 O; s# Q: |8 ^
values(2,'rory','amy@doctor.com', 19);3 G3 X6 B; o g# b# {/ C
- N% M$ W+ L* Y7 \--唯一约束建立在表级
, y8 ^; K) ~6 x% m6 s--主键约束建立在表级( ]; D! }$ n q5 j; d0 k
create table student_ning2(7 p4 v. l( C0 W8 u7 d1 D' E
id number(4),% R) _7 F. F% k1 M. x8 R, D
name varchar2(10) not null,6 y% c2 u* u1 ^1 \3 V9 L9 t$ T
email varchar2(30),8 k. D% N, A& |( g- [
age number(2),) z1 U# c1 m+ d9 o
constraint student_ning2_id_pk# ~ ^3 O: B9 o! W2 c) l% n1 o
primary key (id),
. B$ ]" n& H, d! t0 {# M2 Sconstraint student_ning2_email_uk
6 ?2 @: J ^$ Wunique (email)
- A, C1 a7 z( {/ t# a);
' y3 {) V0 `+ t& O3 |
/ a" y0 t) k4 d( E+ Jinsert into student_ning2. s9 U+ r) y1 o* ~7 _- ^0 W6 z" q
values(1,'amy','amy@doctor.com',19);6 D" h8 r, f1 `; }5 S) Y( }
$ v& J% T; d9 x. W--unique约束只要求不能重复,可以为NULL
' |- e! E7 G4 g/ l6 Cinsert into student_ning28 w( X0 m8 |( m
values(2, 'rory', null, 20);
7 f' b4 R/ a$ K+ R9 A1 [' c+ c9 a# N* a& Y Q) D3 z) E9 |6 E5 n
--不管是insert还是update,email都不能重复。
9 d4 g) `: ?) r1 Lupdate student_ning2 set email = 'amy@doctor.com'1 Y8 G+ V% \" S$ b$ S9 P
where id = 2;6 Z) ]9 A" M1 B; t. n' o+ c* d# ^
: S9 w$ G9 X& L$ A& J4、检查约束 check 简称 CK' q) p) U6 _- a! A, I. Y
create table student_ning3(
F7 X3 t5 M, v8 x! p5 N- Eid number(4),
7 }0 B9 _. k D2 K1 ^) `' t6 ^8 d+ Aname varchar2(10) not null,
0 p, V, c" Z9 X$ x) \email varchar2(30),
* y. y6 R% }1 s3 hage number(2)," {2 k# z2 e. ~
gender char(1), --'F':女生; 'M':男生0 Y' v) x9 l8 ^. q5 K+ V- Y. L4 g1 Z
constraint student_ning3_id_pk
; s( m0 r( K8 Z6 [( q- I! Z' _& vprimary key (id),
3 _! f3 Q! d2 |+ bconstraint student_ning3_email_uk
! B* x% o5 H9 B6 k; j% a; P" Y) c# ounique (email),
$ Q/ L! ~/ [* b+ yconstraint student_ning3_age_ck
/ v# O5 A: t! U; L- D5 N/ j( Gcheck (age > 10),
$ f, e' u4 B4 q K. U* N, P: }constraint student_ning3_gender_ck1 t8 z; ]6 y2 s. d
check (gender in ('F', 'M', 'f', 'm'))
$ k8 E# s- Y! r8 s9 Z2 V/ S);
( q; k: T/ p1 einsert into student_ning3
! ~7 ?6 ?: |. x+ z9 r5 X" a; vvalues(1,'amy',null,19,'F');# W3 D. `* c% I' ]; L9 q
insert into student_ning32 M2 @& u* t9 m7 R8 [9 ]
values(2,'rory',null,8,'M'); --违反check约束 age > 10+ s7 [; W9 a9 j s8 U }
insert into student_ning3 + `% `( t# T4 E0 N3 r' O0 u
values(3,'doctor',null,50,'A'); --违反check约束 gender in ('F','M')
7 T" l: w6 o2 Z) r+ ]' ^' a4 }. p# @+ ]; ~% q& Z. u$ h
PK / NN / UK / CK / FK
. b8 t5 e; V: q1 F4 ?
2 G* \- F5 u% L7 h1 }5.外键. Foreign key, 简称FK
3 Y# p( L/ q# O rcreate table major_ning (
0 p/ t7 T# n e U$ V" K% [0 ^1 Q fid number(2) primary key,
, y2 R# g Y/ uname char(20)6 ^4 R% R9 ^/ z6 P
);
0 C) g+ G/ A4 I4 K, Z: ~insert into major_ning values(1, 'computer');
8 v( @6 i! f/ V3 ginsert into major_ning values(2, 'history');1 G' t( r5 ^! R- G
insert into major_ning values(3, 'music'); y( W3 a* l- X
insert into major_ning values(4, 'sing');
. r* r D9 V3 M2 j8 g, K. a3 Jcommit;0 @( X$ Z: O( `
create table student_ning4(
7 s5 z, D0 ` H# K; lsid number(3)," d7 ^/ g8 `- J& b% x" X
name varchar2(20) not null, P3 t, v6 y7 D# B/ Q
email varchar2(30),3 L+ V9 l5 ~6 m5 Q5 x) I
gender char(1),
6 J# b" f* w; o" T i" Z: Smajorid number(2),
Z2 R& Q" y2 g R$ d% [constraint stu_n4_sid_pk primary key(sid),) \5 U4 \$ e$ v' S" ]' w( W
constraint stu_n4_email_uk unique (email),
- G& t i4 L X, @constraint stu_n4_g_ck check (gender in ('F','M')),* a- o! { f: w. x4 d
constraint stu_n4_mid_fk foreign key
# N/ y, n& f/ T- Y (majorid) references major_ning(id). S) H( ?1 E1 P8 M5 v. O0 G
);
7 z* X* ~- m( I; R, Q4 y. E; D( u% B! @5 k, t
insert into student_ning43 l) F* v9 _/ ], a1 [* T: y
values(101,'amy',null,'F',1);
; S! m: G7 j' J! R0 h/ T* o--新增数据,不存在9这个专业
+ C/ e, U1 C8 z# G# M1 linsert into student_ning4
2 A* {" r7 I1 S/ J" b& avalues(102,'river',' i- r4 @3 L, n0 ^* h0 g
'river@sina.com','F', 9);
+ w! R/ O5 }1 M( x--提示错误:5 [* h6 d: s3 J8 p6 ~7 ^
ORA-02291: integrity constraint (NINGLJ.STU_N4_MID_FK)
, i5 f$ V$ S( }0 P. p violated - parent key not found! e! z4 p4 G- t/ L1 s
insert into student_ning48 }. M5 U, f0 ?+ B8 L
values(102,'river',
, p$ h( z9 U; o'river@sina.com','F', null);, i) O4 T& k" I
- T; M' _5 ]4 f: `+ S% J
--有学生属于专业1(computer)3 z1 b4 V; E$ @* {* m: w
delete from major_ning where id = 1;
5 \2 `3 |- W8 g+ t--ORA-02292: child record found
% @! A* w+ Y. I; X ]
$ j% x" q3 m- {- x: T2 U% Y/ vcreate table student_ning5(
% m9 z! @" G6 T' V& [1 Q& Ysid number(3),1 b% P" u1 k3 }
name varchar2(20) not null,5 K' e4 [/ e- [9 A* h/ K
email varchar2(30),# T% Z! u; [4 x6 j" c \3 V
gender char(1),
y% \4 c& c+ d q% s/ A k/ J1 zmajorid number(2),- t4 X4 y* A$ U% ?
constraint stu_n5_sid_pk primary key(sid),
4 k- A! t* {* ]. ?! Y- m" ^constraint stu_n5_email_uk unique (email),
# |; u/ J- M4 {( C% |2 @( Vconstraint stu_n5_g_ck check (gender in ('F','M')),
/ ^8 H& J3 ~# ], p0 }6 qconstraint stu_n5_mid_fk foreign key
% _) ~- n X3 | (majorid) references major_ning(id)
% |$ ?& }+ `: \ on delete set null);/ t5 C P2 y3 B$ s$ Y
7 V# m7 R, l' v- I% X! K
insert into student_ning52 X8 n, i/ s" I
values(101,'amy',null,'F',4); --amy是4专业的学生
! t* l6 U9 w+ v& q7 j9 o--删除编码为4的专业
2 S; I8 u4 O+ N. ^; [delete from major_ning where id = 4;, m6 I: ?: `: S, D
--amy的专业被设置为NULL' n6 k* T$ a, F" c. K- G& z8 `& O6 r
select * from student_ning5; 3 G& J, J! F3 V L/ u2 c4 }) P! \4 n
. E6 Y) m3 B$ U8 C2 X( m& G% T$ t% }
create table student_ning6(
/ T0 q$ ^" f2 O6 R* tsid number(3),
2 B* Y7 U$ f$ N0 cname varchar2(20) not null,
$ |! h( c7 ]0 b8 @9 z% jemail varchar2(30),
3 m) j' ^: E0 t% w/ z- I ugender char(1),
* C! K) C' B5 T) Lmajorid number(2),
6 K: k, T4 P& ?4 M' j, p$ ]constraint stu_n6_sid_pk primary key(sid),
! V/ _' y& ?' M, aconstraint stu_n6_email_uk unique (email),/ J e4 x% D% Z k2 `
constraint stu_n6_g_ck check (gender in ('F','M')),
, i9 A0 B+ ?' c5 A7 {constraint stu_n6_mid_fk foreign key
, a8 O% T: `) ^1 }8 A: R: y (majorid) references major_ning(id)
; G+ D1 N8 V- T2 |; r" K on delete cascade);
~0 d$ m2 P! E. O4 M' n: G! D
, K6 @* n9 f/ n1 d9 j--复制表,不复制约束条件。
3 Q( Q9 t- v& k+ Mcreate table 表名 as 查询语句
- v) C0 Z) @' z+ ?" o" d: \, N0 c) }3 k
--建立约束条件的时机
8 e3 W2 a. \# ]--建表同时建立约束条件:
3 L* e' ]! m0 Z4 H! ^) K0 H5 Vcreate table student(. n' z5 t1 U; W y. i$ `0 q2 c& p
id number(3),. T- I( q$ S8 k5 a$ j
name char(20) not null,
0 ~5 N% {* M2 U/ |majorid number(2),/ C2 [" J' C% ]/ s+ j8 z
constraint stu_id_pk primary key(id),
" B4 t7 N1 ?( @1 \constraint stu_mid_fk foreign key(majorid)
4 l+ ?5 ]$ J" e& l references major(id)4 o. e h9 E- Y: E/ f* ?# ^: k
);: ?$ V ?5 x) u
--在创建完表以后创建约束
9 k5 W8 p6 z$ Tcreate table student(3 z& j7 c* ^$ }
id number(3),+ w; j" \3 _, E2 N; C
name char(20) not null,+ ^, A, j) Q. |) k
majorid number(2));
6 C" }8 O" _- I7 O, U5 h2 g4 T" I0 malter table student' @9 u; q/ H. `7 z; H
add constraint stu_id_pk primary key(id);
5 P. W% u. P4 O3 w" i' Y( Jalter table student l8 J" w8 ], E, x/ b1 J8 X
add constraint stu_mid_fk foreign key(majorid)
# X# F5 m& J: ^+ z- h; m references major(id);) }' ]4 J4 h) p* c/ U- D2 I
/ F) ?1 g" @! v# a
-----------脚本文件begin---------
- l6 a- B& _" K( ]2 Ialter table student drop constraint stu_mid_fk;, y' Y& N( a2 u
drop table student;0 L1 ], X" Y7 c0 E, k
drop table major;0 G/ n5 r* L" q% d5 u) U3 i
create table major(....);
; T! L4 C1 m/ V% n2 s5 lcreate table student(....);
) Z# w) }, n6 }# z# b; @' valter table student add constraint ....6 n; W5 b$ N- x
-----------脚本文件end------------* D8 Z* s" T4 x* V) [( T
$ C' W# ]% y6 Muser_tables :用户所有的数据表
2 d3 d6 b6 f+ h- x% Z3 P* i. euser_constraints:用户所有的约束条件
3 j0 n. b6 ?9 _+ I# quser_objects :用户所有的对象(表、视图、索引...)
% S; L4 F3 D7 V+ @& s* b- b9 V5 X9 F$ R6 _: M: G: p/ Y
all_tables :用户能访问的数据表,
0 h* a0 |+ ~: _/ | d$ F 包括自己的和别的用户允许自己访问的. p; E3 B* _$ X6 \) W
all_constraints:用户能访问的约束条件' d! G. M7 ^" b* b( }
all_objects :用户能访问的对象(表、视图、索引...)
% T) n, Y" q& [. f# h) Y) ~" d9 c% a
* g m7 ~4 @* oPK / FK
5 z' \- t {: gNOT NULL / UNIQUE% q8 ~: l( |/ P+ O: l) @
CHECK
4 d3 S/ h7 Z! o! e2 p- t其中:CHECK和NOT NULL可以在程序级别控制% ]* ^" z2 z" J: Y- _4 u
; `' m+ F* Z& m& [二、数据库的其他对象 q# w; ?7 ^; w8 V& R" x# F
表 Table
: ^0 O, {5 c) X: R视图 View6 \* y. r. O. m$ l$ P# z$ C) a
索引 Index- S% Q3 E. `) |5 y, M( n( e
序列 Sequence
/ B6 u& N' Z* [( n ~4 N过程 Procedure) i3 b) j9 d3 d7 F9 e& V
函数 Function% i" V& I+ G+ L( v5 S7 U6 W
包 Package
. T3 Z( j; a* J9 h* U0 N, N8 o触发器 Trigger
3 `1 u$ k9 ]" g% ]5 p" K, J" V同义词 Synonym
' X' |" N/ o! w- T- K$ J: |....
6 S {3 {, m/ g( w7 g6 d$ n9 A4 ?' Q- y C: Y' n. n |9 e5 r
1.视图View
5 M* P; U0 x. ^5 i) s, h+ d1 gcreate view v_emp_ning5 x! p4 z1 B @9 R1 r: a2 T
as2 B8 ]* k J! F, u6 S2 v7 D$ f
select empno, ename, job from emp_ning
* b- m; @4 c( W) Q, Ewhere deptno = 20;
( G% k1 y2 R) a+ u h! f--使用和表相同. V8 a* ]" ~2 f: @: h. v! ]6 L( f: d
desc v_emp_ning
* g, l! q- M9 b* rselect * from v_emp_ning;) o; l1 J" u' ?% A6 D1 P7 a" g' V
--视图的好处:简化查询;隐藏数据表的列2 m" v5 b4 Y9 g4 P7 x* f+ C
# B' r! T5 t3 y
create view v_emp_count( J7 Z4 Y; H7 n1 _, G7 _
as9 J$ [; D" x" G6 u
select deptno, count(*) emp_num& C; S! v: S) I! H0 ?- T
from emp_ning* p, @) z; A# `( W
group by deptno;) Y1 a5 i6 E1 A3 J: p9 k1 p& f
--修改基表数据) G& ^7 S* q- y
update emp_ning set deptno = 106 |% u# R8 Z q1 ~8 f# _
where deptno is null;3 T2 o8 I% Z1 b. h- Z2 C
--视图查询到的是修改后的数据。/ v7 ?' a! N. l+ _$ A0 i) U
--视图不包含任何数据。是基表数据的投影。 x5 f2 \6 ]) I7 r# A& y
select * from v_emp_count;( O. I/ @( H g& E, m: a+ [
1 |2 |: I+ s( U8 c5 O5 _
--创建或修改视图3 k* S' q7 J7 Z$ P7 T' B: K
create or replace view v_emp_count8 K, \4 _! l0 _
as
2 [: o' Z z2 r$ X0 \select deptno, count(*) emp_num,3 g3 i9 l# [+ V5 t
sum(salary) sum_s,5 T2 z% x5 `9 v B
avg(nvl(salary,0)) avg_s,. u! s8 q0 y) @3 m9 t% K# X3 ]
max(salary) max_s,4 ?1 n9 ^3 ?% l* y/ ^- O7 d
min(salary) min_s" h, M& K+ s% q9 }( C4 i
from emp_ning+ {% E' v4 j" x( j% A+ t+ K
group by deptno;
$ ]! `! D& c- z a8 z1 E0 c( w, ^2 a
--查询视图的定义7 F: W7 s* y1 O
select text from user_views! T( W9 Q) P' D% y! o
where view_name = 'V_EMP_COUNT';2 ^2 b& V, l" R# E7 ]* y$ p9 w
--如果视图对应的sql语句显示不全7 N% }5 m) e$ _5 c. s! S
set long 1000! {& q, \1 b( O; a: @1 e; F4 F7 v) a
L8 i1 K3 X0 Y2 a2.索引 Index :用来提高查询效率的机制。
) B. p% h: _' G3 b5 G+ F. d+ _全表扫描: Full Table Scan: 查询效率极低
, B ]6 ^- z) I$ `4 Z索引查询:比全表扫描快。
c. L$ J9 [, l0 Y6 H `
5 V* d# p* z3 C$ l) y( e; d索引的结构:数据 + 地址
6 t. I% w7 \, z* F 张三 + Room2033 L3 J' k/ X: i, q# B
9 r' v/ ]7 C8 I% R: p* X0 w
对于数据变更频繁(DML操作频繁)的表,
! B" x4 b' G4 `; X索引会影响性能。
$ M) d7 O3 {1 A+ t3 U) r8 D( b# `& g: b. G
如果数据表有PK/Unique两种约束,索引自动创建! x$ ]% H: v! w, Z
除此以外,索引必须手动创建。' A0 j* y ], M& _5 H f& | \
create table student_ning7(& L, P6 x0 D$ R; w' x1 e9 c4 z
id number(4),. S4 M4 W; u3 I8 _
name char(20),
; P; ?) O7 Z/ V# d' _" q$ @email char(40),
C! I' D4 c9 ~" Hconstraint stu_n7_id_pk primary key(id),
6 w; Y( w% Q. l6 |5 Z; Rconstraint stu_n7_email_uk unique(email)
2 V: @# X- I: c3 |% y3 K0 O);8 o" M- x; y5 @* r
select constraint_name
8 {) O$ z4 M/ l7 T* @1 |) Rfrom user_constraints6 i' w: T" C( i e
where table_name = 'STUDENT_NING7';
3 j1 I; {3 U0 l$ ~6 t6 v
' ~! v/ {) J' S! u--查询student_ning7表上的索引,% [3 n( o9 b: p
和主键/唯一约束条件同名,数据库自动创建的索引。$ P% X1 T+ k- c
select index_name from user_indexes7 U F; I2 C0 S0 r" Q8 Y9 I
where table_name = 'STUDENT_NING7';
+ Y7 C8 h& t* [; v1 z9 N8 \( N) r
--凡是id或email上的查询,会使用索引
; }; q5 n, f* [) E7 u: v+ _select * from student_ning73 r# @7 Z/ r; I9 H5 L7 w
where id = 1001;
1 w. q: N% x: @3 w
5 x/ {' o8 d/ m1 K, S--这种查询用不到索引:全表扫描% b* E4 c! @1 p: L6 ]9 w; z( u
select * from student_ning7
4 w- E3 a K( q8 S& r* gwhere name = 'zhangsan';
$ U7 A3 [' ~$ E4 F' d$ z! F; U6 G- |, V e1 x
--创建基于名字字段的索引,索引名自定义
8 p7 W: n( Q* j" ~# i# ~ O" Qcreate index 索引名 on 表名(列名);
2 l4 B0 C: `5 y Ucreate index idx_stu7_name ! }: J9 r$ v$ E! S
on student_ning7(name);( x, [& Y) \4 l
- x0 E9 z- Q: T# r
索引:
3 L5 o5 |2 k& g; c* u! y1)了解索引的工作原理+ d# g! [6 z' c
2)pk/uk自动创建索引, B6 p+ {5 B6 I' C; @. e5 d) H
3)根据查询情况决定手动创建哪些索引。) ], d) x; j. E$ z- E
; Z3 O, I# _! |) {' i( o7 ~; d. X2 Q$ Q7 z% ?; C( ]! V# O
3、序列 Sequence --Oracle独有的
; r" p) J) V6 }8 Q/ [--产生从1开始的数字值,步进是1
3 Y* ?) d' G, h- lcreate sequence myseq_ning;9 V0 \/ x% z+ Q7 z
select myseq_ning.nextval from dual;/ M8 Y y" ?6 B1 Z: x
# V& w- {: n( q% \; N2 g g
序列的特性:产生连续的不同的数字值
! D* f8 n4 O N用来作为数据表的主键。
& a3 [+ S+ ]7 `8 S% f" ]
/ U$ V- |$ T+ h9 L--使用序列产生的值作为表的主键值/ s2 n8 R3 c7 T3 ^' \# P- ^
insert into student_ning7(id,name)
0 G, q# p' f% \* ~$ Z* {values(myseq_ning.nextval, 'amy');
- s# o7 i5 U; S; t# V
H* Q1 N. [$ I/ P4 Bstudent_ning7和序列myseq_ning的关系:
: l5 B+ r3 T. i s( j是数据库中的独立对象; V @( W" m" I2 b+ v
--表可以用序列产生的值作为主键,也可以不用
( m! ^" \( d' b# H6 o4 m; {--序列可以为一个或多个表产生主键,也可以不用
' n, @, J# B4 i0 ]insert into student_ning7(id,name)+ ~" W. M. G: v5 E }& F
values(100,'river');
. N/ }# h! ]8 L/ y* a8 V3 q$ @" Rinsert into dept_ning9 q' l5 `7 }. ?
values(myseq_ning.nextval,'market','bj');1 A' Z5 e/ W7 o
6 z$ D& J4 c7 ]' u8 X2 N! V
--建议:一个序列为一个表产生主键2 P: u8 J4 N0 u+ D2 V
# I3 U5 ]& q3 N6 L( E希望主键值从1000开始,步进是2?2 |/ t7 I. l4 ^) ?; ^
create sequence myseq_ning1, Z: S, c% `' D3 [5 d* P
start with 10005 R g) v3 s6 G0 t3 @8 y5 W7 F
increment by 2;9 U& `$ d( ^% e- ? k2 R
! R3 a2 c2 C: N2 W8 i K- F
insert into student_ning7. ~+ J6 ]& E( s; ]9 O2 O# O3 j
values(myseq_ning1.nextval, 'song', null);
b" q8 ~ Y _; N4 u0 @
( l( b6 _& F% q( G# {% o--删除序列,对曾经产生过的数据没有任何影响。
Z( ^, F* T1 S: A- J+ Hdrop sequence myseq_ning1;* B7 j/ t9 w' Z6 P# o
! }6 z8 B4 h9 w' LSQL> edit% l; T) d# g4 P7 ]
% @( h; |1 {( d0 A, b, Z |
|