该用户从未签到
|
复习:SQL语句0 L: e: S* f N1 r5 P5 g! e" ~
select2 x; D% w, l3 q7 Y1 h: G( t
DML: insert / update / delete0 ]' c+ U( V8 T' o8 ~1 M$ r+ k7 Y: W9 N
- \ f. @, o1 J$ P& V Z
CRUD
* ?( r" G; [0 y+ j. q) A1 b9 QC:Create
1 Z' C; b) S$ l, _ oR: Retrive, ?9 L2 q/ T+ P! m
U: Update
$ [& ^6 P0 D+ W! CD: Delete
2 Z$ N) O. }6 X7 |1 P, `1 I
$ B- H2 K9 w9 XDDL: create / drop / truncate / alter _5 _ c1 N3 M$ a0 J
; T& _5 ?/ o$ B3 G8 f- b
TCL: commit / rollback / savepoint
3 x q7 h4 k3 K, b7 L$ p: G4 P' k, m8 N' u/ ^
DCL: grant / revoke2 F5 p* T4 b$ Q/ c0 ]: l8 |; p
+ {3 q t1 E5 m) R/ g
grant: 赋予权限( E. S! C, Q/ q( v6 O
revoke: 剥夺权限6 F' p x$ U9 h; \" u
数据库中的用户: openlab hr scott% C$ d; b8 U( u& L, H
emp
& L% r- b* J0 @; l0 ^3 M9 G- z, b( ~) d. \7 @( W
假设现在的用户是openlab
+ k* O! X- z" x4 j" GSQL>grant select on emp to scott; K' z2 T2 N$ P& v% x! w
SQL>revoke select on emp from scott;2 i# M2 Q! T8 C. C% [7 G/ I
7 M0 R* G0 a h3 Y
scott的会话:
8 ^! |; t6 \$ y& C q% pSQL>select * from openlab.emp;0 U3 k6 G4 D7 X9 N: d- b
SQL>select * from emp;! o, X' ]0 z6 _* j, g
5 n9 Z; U; U, _5 ?* f) _7 F2 M0 c% X# \6 o& O4 Y& k
Oracle数据库的用户:
! E c) [- Y$ I2 ~$ ?7 Zsys
3 U1 t% [4 ^: s+ nsystem$ J% K2 f! _) L3 X$ b; B4 o$ V5 d
# U+ d+ {3 o' ]- Z) c5 p/ ]
scott/tiger
- M2 S0 c7 E9 V% J; J' xopenlab/open123
, y# n5 x; }/ z$ p- r- `6 Mninglj/******
9 {) C3 P/ d! c/ Y/ eexam/exam123
0 @3 }0 C" ]( N0 X& X+ k
8 S/ K F" B; T" HC:>sqlplus scott/tiger@192.168.0.26:1521/tarena
3 [( X9 y+ |6 L8 u: \3 U; @, [SQL>! c/ w' M6 S8 X' v
5 {: ^$ L: L6 U w5 @2 Q1 z6 v' {- o
" ]$ f6 p0 o: u. s& {8 p. W
今天的内容:
8 u# | y/ K# Q& r0 x8 k1、约束条件
3 ^9 U' b) {6 ~1 s# S6 J2、数据库的其他对象6 n" H) u% ?/ W. X" f4 P4 K
! f. L [' C) P一、约束条件 Constraint8 f1 z% c, ?9 n9 e" K
1。主键约束:Primary key, 简称PK
2 Z) ?' f2 ?0 ]/ H ~* M, k: t--建表时增加主键约束条件% p; l/ ^& B# @8 ^+ T* E) @
create table dept_ning1(
" q' `6 Q( o' r! t& Cdeptno number(2) primary key, --列级约束条件; D* l' \- O) `. r2 D, j
dname varchar2(20),
. S) M4 O8 {3 `& y, M, Rlocation varchar2(40)# W7 ?% D4 `' l: x; R2 W
);
) [2 \0 ?# l' z, B! A( d5 ?" Y5 {insert into dept_ning1 5 J8 ]; p. } a, s
values(10,'developer','beijing');4 d0 t ^# n9 y/ \6 Z, ^: m
insert into dept_ning1
. t6 t/ L' E) t- n1 Y' `( Mvalues(10,'market','shenzhen');& G0 }/ |" z, K1 z
--如果插入重复编码,会提示:3 C+ i) P+ m, K
ORA-00001: unique constraint (NINGLJ.SYS_C00634053) violated
7 B7 M& [* b7 z- }6 X& ~8 N其中,SYS_C00634053是数据库自定义的主键名
1 a% ^# N5 ?7 D% |" J--约束条件如果没有显式命名,
" g6 E& D" q. l数据库给约束条件命名:SYS_C*****. j# D& _7 A/ _4 H1 G4 g
, f$ t2 B3 A6 B2 q7 ^9 s! ^( ?8 B7 f
--在建表时自定义约束条件名/ S8 s q+ N9 R1 W* {) t6 P, h% f
--建议命名规则:表名_列名_约束条件的类型
% j" N* \0 q$ y5 L, W/ X$ @8 @2 G+ |create table dept_ning2(/ ^' z6 j) G4 o; f7 b5 w3 c7 t( a" K
deptno number(2),% G8 U5 q( n0 s/ P( X' i3 @
dname varchar2(20),
( T8 @9 o+ \& t5 f& U7 Y' glocation varchar2(40),
* {* t. w) h+ z1 p! `constraint dept_ning2_deptno_pk * x2 y" r* [# A3 g% b
primary key (deptno) --表级约束条件
$ Y& w8 J, R' S, s: ]3 _6 P);
5 x# c" l. R* Z$ u: W--当插入重复编码时,会提示具体的约束条件名字错误。( h" k& i( |+ f4 ^1 W5 M; q
--方便定位出错的原因0 l4 O) m" w. ~* T3 x1 F5 U
g4 T N& n! |# h6 h
主键约束:primary key = 不能重复 + 不能为空
9 b- K! Z/ \9 v* `# n, t; V8 s: O4 P F7 P) T
2、非空约束: not null,简称NN2 d2 C- C5 @0 c* o8 P5 @
学生姓名必须提供,但是可以重复
3 [$ N7 G! ~2 r. ]- d: A9 N--只能定义在列级
3 H: p, g0 V* V) o8 a. ?3 O7 R7 Rcreate table student_ning(/ G* R3 u0 L" o) C# B& D/ P6 J
id number(4) primary key,# O1 j8 d; w% B# M' q
name varchar2(10) not null,* K4 @. z; J) V
age number(2)9 s( S- V# o% n; _" T
);
1 H* w( y# \' xinsert into student_ning
" j. {/ ~6 r) j. H2 Rvalues(1, 'zhangwei', 20);! k* r) |4 v4 d0 `, A! G1 R
--名字可以重复! }, Y4 z7 l/ _2 q) x! S7 v6 b( E, O
insert into student_ning ; s' G: X4 r% S
values(2, 'zhangwei', 19);
/ u- L5 C8 z2 \, ?4 g# u# z9 j5 g--提示name列不能为NULL* ~% Y( p- v9 ~, E5 {
insert into student_ning
3 V+ V* M: v& b4 }5 W6 M: jvalues(3, null, 18);$ [9 [; b: V' I" {
, A% v G {2 u3 A' P5 W3、唯一约束:Unique,简称UK- b1 }+ J- T4 {5 K% t
create table student_ning1(4 E) {) u1 Q9 U- O+ A6 e
id number(4) primary key,0 p2 Q4 u9 f a0 |" o
name varchar2(10) not null,
+ W7 s9 q- [/ I2 W' X4 C6 F) _ \email varchar2(30) unique,! F4 Q! ?& {# j$ _0 t Z1 y
age number(2)1 l" a/ }# t7 b) B/ j* G" x
);6 @" M: d% K5 F3 i
insert into student_ning1 0 X7 O# [5 \, E( W' i! O
values(1,'amy','amy@doctor.com', 19);( K# l; F I6 v; }2 _; }# k5 G
--ORA-00001: 唯一约束条件被违反, M% u$ R5 @- r+ m# N) N! s/ M
insert into student_ning1 5 \6 A8 L' ~/ c7 t4 S# C# |
values(2,'rory','amy@doctor.com', 19);
4 ^: ~) C/ E# a5 s2 S) Z, B3 j K. s' {5 V
--唯一约束建立在表级
# z3 B4 O A+ p, _/ N--主键约束建立在表级
: x' q$ Q) u4 k; C6 e mcreate table student_ning2(
& _& X, G/ F" G; Lid number(4),
) U* A. E o2 _ U* c7 C, mname varchar2(10) not null,0 {& C e" D' Z
email varchar2(30),
4 M3 q- j% k) E! n$ }age number(2),- k! ?' m# V4 J
constraint student_ning2_id_pk
- T$ U$ Q) a) N4 A2 i v$ e+ y2 j2 Zprimary key (id),
2 O" K, p9 N# k5 M& Mconstraint student_ning2_email_uk p) [4 a |, [
unique (email)
! B2 T' _% X" e5 |1 z) |) t L);
9 y# r% W5 f) u @
, w. g+ z1 m Y; y3 Linsert into student_ning2% _" C$ t- g: k
values(1,'amy','amy@doctor.com',19);
0 v: ~7 D2 R( [# e @
9 ?5 W" ^3 J2 L+ o A& B--unique约束只要求不能重复,可以为NULL
% }. C8 e) m" n8 ?insert into student_ning2
7 H3 e7 j' \6 nvalues(2, 'rory', null, 20);
5 Q7 Q% w6 `! T% o6 y: ] d. n$ Y. G w3 }" U0 q
--不管是insert还是update,email都不能重复。
( X9 ^/ W( w8 ~! ~8 wupdate student_ning2 set email = 'amy@doctor.com'5 O: v3 }) q' O- B6 J) B
where id = 2;
1 a; G, e& f: J! t. @
" `/ [& x4 x/ J4、检查约束 check 简称 CK. Q) F/ m1 |7 W& l h( d0 z( s/ R
create table student_ning3(
" r2 H7 Q( ], B* s0 t! x+ [8 Uid number(4),8 P: y) \9 D3 T3 N' b6 w& q
name varchar2(10) not null,
! K% |3 P h. {5 p' h, }email varchar2(30),( \5 h: }# ~/ P9 O& p
age number(2),# _/ D% y+ }3 ^. A! ~0 ]
gender char(1), --'F':女生; 'M':男生
: i" |+ V7 \! ]- O8 e! Q, Bconstraint student_ning3_id_pk9 ?3 q' L5 d- j: a5 J
primary key (id),
! u- I" r( o' A, Cconstraint student_ning3_email_uk6 k) f, b9 a: t& j, G/ L/ H
unique (email), L" ?, h. F# N% ?& y
constraint student_ning3_age_ck
- { ]; ]+ p% W) z5 jcheck (age > 10),( z) _ k$ ~* o
constraint student_ning3_gender_ck
2 J7 S) M3 v4 L6 Y! ]# L& Ycheck (gender in ('F', 'M', 'f', 'm'))6 s3 r0 s7 H) \ l" J$ D2 M6 N
);0 A- L3 ^ c2 o! T0 l+ l: S1 c
insert into student_ning32 O" Y/ ?" g# } P9 X, v, P5 s( k8 u
values(1,'amy',null,19,'F');
/ r; S; L8 q9 Q1 }9 minsert into student_ning31 |- \ G& Y& f R! _5 @3 U
values(2,'rory',null,8,'M'); --违反check约束 age > 10$ Z& l0 D; j9 T' {5 I* ?" ]
insert into student_ning3 % p" K- H4 i* I+ I! V
values(3,'doctor',null,50,'A'); --违反check约束 gender in ('F','M')/ M# e8 @" R& m9 D2 P$ V8 `
* @) L2 I9 e9 S" z7 E! K! A
PK / NN / UK / CK / FK" t7 n$ k. V- H- Q+ T
& J' F+ `$ [3 N* _+ z& w, W$ z5.外键. Foreign key, 简称FK& [" g+ x! ~$ Z. r) `* j1 ]: _) h+ U
create table major_ning (. }9 q/ O9 e* t2 @9 B4 J, }4 {7 j$ I
id number(2) primary key, / h) m4 _6 T X% D4 m/ t% l
name char(20)5 s1 B" u4 A* ?/ C' B( d5 m' q
);5 u1 w" Y9 [7 v( d
insert into major_ning values(1, 'computer');4 V4 d+ H* s" N4 d) z' y% k
insert into major_ning values(2, 'history');: t) s( {4 i8 B4 [# q# c
insert into major_ning values(3, 'music');
; w' g- Z2 K; P+ l, jinsert into major_ning values(4, 'sing');
4 ^" k+ }# c' F. gcommit;8 {! l, x1 A' a4 L- m1 u
create table student_ning4(3 K$ c# \8 ]5 G! P6 K
sid number(3),: x# m+ `) _6 g) w& M
name varchar2(20) not null,
" i: {6 r( ]- \3 T* ~email varchar2(30),
8 J0 X2 f Q2 u( u$ I8 m2 ]0 Ygender char(1),) C1 C7 n! A& a5 y2 E+ b8 c2 t
majorid number(2),
1 u) Y# B2 ^6 J" L6 Pconstraint stu_n4_sid_pk primary key(sid),; d$ I# d5 ?. U7 Q, s8 [2 p9 D
constraint stu_n4_email_uk unique (email),
3 r& a( y9 C0 \+ {, [: |4 {" E9 d2 [constraint stu_n4_g_ck check (gender in ('F','M')),: ]$ n% G& B! P
constraint stu_n4_mid_fk foreign key ! x4 p) X9 N* w
(majorid) references major_ning(id) e% ?, b% ]' @" D3 [& ?7 J) F/ ?
);
8 v3 R9 m5 C% S( d& q
) _ w9 t; F0 X6 i" N% g, x, ~insert into student_ning4
. O- p$ I* a; F! L) o" S/ h8 Lvalues(101,'amy',null,'F',1);
" q$ w4 K# p/ r--新增数据,不存在9这个专业
& I6 I$ W2 ]* Winsert into student_ning4
- e8 S! F1 c3 X3 p6 I9 d+ @values(102,'river',! ]* C1 T! x! C# |9 o
'river@sina.com','F', 9);
) C3 k$ Y# d7 r0 U8 ?6 y--提示错误:4 q4 d& x c( y
ORA-02291: integrity constraint (NINGLJ.STU_N4_MID_FK)
+ S B- H2 o" k! S* Q8 z/ _6 S4 B violated - parent key not found
. V+ F. w' a$ y: zinsert into student_ning4
+ b& u' _( B( W' ~( B! T% L) s( L2 }values(102,'river',: A8 _, W: t: W
'river@sina.com','F', null);
9 J1 ^: s2 p" X* t, ~6 k6 |4 O. Z: `6 m4 I+ d
--有学生属于专业1(computer)0 E+ r/ [! P: j1 k1 `5 O
delete from major_ning where id = 1;
& o# Z$ J [4 i) L. O% `% h--ORA-02292: child record found
- v8 J7 M$ @- x, W: s' u) G5 o1 F7 W `$ X
create table student_ning5(5 P5 S+ c5 S) H" ]2 [, @
sid number(3),4 v$ |+ T$ B: f. q! q( z0 y
name varchar2(20) not null,- K5 P2 Q+ U. w) r6 y1 G8 `
email varchar2(30),
# w7 U. D9 W# z! l* p8 tgender char(1),
3 s& i% O& h* I Z& Gmajorid number(2),- |6 ]' _ w3 j5 i3 p7 N
constraint stu_n5_sid_pk primary key(sid),6 y( y b# Z6 R" Y1 `7 o$ _
constraint stu_n5_email_uk unique (email),
" h- X* w J# ?- D* D) u6 i: mconstraint stu_n5_g_ck check (gender in ('F','M')),& J+ {& k4 K) x0 D" q/ `
constraint stu_n5_mid_fk foreign key
v4 D' c1 ^: |" ^3 r% F1 c/ A (majorid) references major_ning(id)/ w" U4 v7 z. _( i: e
on delete set null);
$ [6 ?! r4 Y4 E! ]! }
: D8 U, P1 V- G& g7 K( t3 jinsert into student_ning5/ G1 S$ S7 J# j! k
values(101,'amy',null,'F',4); --amy是4专业的学生* m7 H; Q5 K3 N7 _3 E
--删除编码为4的专业
7 ~4 s/ x Q1 Z; j! ydelete from major_ning where id = 4;
+ k- z+ x9 {* i9 i: N--amy的专业被设置为NULL
. k% a' z3 l4 Dselect * from student_ning5; - d. i% g7 Q7 x: T
# S$ c9 i5 `" j3 C& c
create table student_ning6(
& o" @' n7 S; Q1 S( T6 x8 g9 [: fsid number(3),
0 e0 k& I7 X3 B. i4 x# \name varchar2(20) not null,/ a) l. L& M) Q9 X( _
email varchar2(30), V9 G6 @2 Z4 I6 B) u! h
gender char(1),
R" z7 d$ m" z8 k8 Kmajorid number(2),) b6 B' j7 x4 J' p8 G
constraint stu_n6_sid_pk primary key(sid),
/ r/ Y, @; C h9 xconstraint stu_n6_email_uk unique (email),. L: y8 i6 P3 }2 d1 i
constraint stu_n6_g_ck check (gender in ('F','M'))," v! Z8 }, }/ S" ~; R
constraint stu_n6_mid_fk foreign key ! e* s2 t! v0 w# Z. v: v
(majorid) references major_ning(id)
# Z& ~0 |3 c- ?) M" [2 c# d on delete cascade);
' o5 Q6 b; }' N' P; ^5 h5 Y. {5 l, k2 O" R/ w1 t. z/ g* ]5 N
--复制表,不复制约束条件。
6 X7 C8 q6 ?; S* p) \create table 表名 as 查询语句
9 A, E6 k5 ?* ?/ k) l7 r
# E, O1 O9 F: M5 x; E8 G--建立约束条件的时机8 ?; E2 w4 ]% F2 q
--建表同时建立约束条件:7 S' u+ T2 `7 T |5 n7 ^# |) |9 I9 ~
create table student(
& Y" X/ n9 B4 X, O" t# J9 `# a$ h% eid number(3),; ^' l2 \ } l# J) ? j, J
name char(20) not null,) h8 n9 j/ y; O6 k P7 P; o0 L6 G
majorid number(2),4 p6 j7 f6 T" a9 d
constraint stu_id_pk primary key(id),* r5 J7 |& e+ E- i
constraint stu_mid_fk foreign key(majorid)
7 \ ^' Q8 ]7 b: D c! w8 j references major(id)
/ L) k# K' U' `) J* E4 j: D( o);
% t; n0 J. o* f1 X! Q; _--在创建完表以后创建约束
1 I* u5 g5 w+ [create table student(
' P9 F) z5 d8 {) ]2 V* }id number(3),0 W0 D& k$ k9 |
name char(20) not null,
{* n0 s/ F6 ^7 \majorid number(2));; k8 g. v; t6 E: { r0 l
alter table student
. H+ ^7 k- d" W( Y3 T- z add constraint stu_id_pk primary key(id);
' H: z3 V, k! |alter table student3 V9 z* Q3 @% |& b' c, N# c7 Y
add constraint stu_mid_fk foreign key(majorid)1 e |+ [" Z, y, i- O0 ?0 [
references major(id);
' J6 Y+ X q$ ]0 [! }' k9 g& L/ G# @7 m. J: M
-----------脚本文件begin---------
+ H% X* w5 F' v1 Galter table student drop constraint stu_mid_fk;5 g, v- x& E( h* r/ @$ C7 e& d
drop table student;3 I1 P' w& h2 q M
drop table major; ?0 j$ p: y- D: B$ e+ v( |6 Q8 g
create table major(....);
E" m# [4 U# W @5 J E" t$ Ucreate table student(....);! J) p7 x. k9 D/ R& m2 ~
alter table student add constraint ....
/ e% H1 W( o% T-----------脚本文件end------------- @' M2 ~, D) q2 C3 X4 \: A4 b" e
, L# U K4 \- A' P! |user_tables :用户所有的数据表 m; h! l) [( ]0 i
user_constraints:用户所有的约束条件
, r" l$ O0 e% Buser_objects :用户所有的对象(表、视图、索引...)- n& o8 b* h0 K- d
9 g% T' T' t& l1 H& W* l. uall_tables :用户能访问的数据表,8 k7 y! W ~* o5 G7 P5 q; l
包括自己的和别的用户允许自己访问的
0 ]6 B! s) o' |2 Vall_constraints:用户能访问的约束条件' e# e3 l4 x+ g9 B
all_objects :用户能访问的对象(表、视图、索引...)) l/ m+ u5 T. ~/ t3 V: q
! R; i8 K4 z1 k) h4 a0 f
PK / FK+ m7 \* K, O% |9 F# ~' |: z3 X8 b
NOT NULL / UNIQUE' \# U" T( }1 q z* V: S9 p1 e! A( T
CHECK
& e. s/ s( J/ W+ j) {& A其中:CHECK和NOT NULL可以在程序级别控制5 b2 l$ A7 v( @( s4 w
, j1 V' ~0 ^% h) D
二、数据库的其他对象4 f( U ]0 q* y" g
表 Table
% E! ]- D0 Q! _; f视图 View
6 ~6 L) u F+ q; f% {1 p! W; d0 G索引 Index9 P( S' V F7 ]5 j# `$ W. ^
序列 Sequence6 X" L6 F( m; i% Y$ s/ b5 h* I
过程 Procedure- D) n9 \! k3 b2 ^! p+ B4 S
函数 Function
Y3 r% z! W* J$ v( Z1 Y包 Package
, }5 S) w q6 K" y) O0 g触发器 Trigger
5 s7 ?' R i0 d同义词 Synonym
1 |) v* t. P5 v....
" |2 [5 H6 @! p: B
1 P; d5 F( @( ]3 F' E9 h1.视图View# c# Y, S% v& H, k
create view v_emp_ning( V! X( o# v1 H0 A; q: a2 ~
as
, H) f e4 u6 T: J rselect empno, ename, job from emp_ning8 w! H8 h, H3 M7 o3 E- a
where deptno = 20;- f$ O" p1 Y* P$ N9 E
--使用和表相同 U; R: u1 u) p4 O1 d, a5 d Q2 D
desc v_emp_ning8 @ n8 `0 p$ o+ H: v5 V2 M2 u& Q) A
select * from v_emp_ning;/ J0 b, I X3 m' b/ Q1 y9 V8 C/ N
--视图的好处:简化查询;隐藏数据表的列4 i0 b- x! u0 @) R1 {8 i6 o" ]
2 G3 F3 m8 X, \- j0 d2 A7 o
create view v_emp_count
* N, {! @, i7 c8 T* zas0 o8 o/ Q2 m* G7 y
select deptno, count(*) emp_num
s; \0 c# @0 z- A2 }# a2 Kfrom emp_ning6 e m) ]5 H1 O ]( p" p
group by deptno;
( o- }9 W% g" e--修改基表数据
: R( k9 ~# Q: o update emp_ning set deptno = 10
& d7 r% f0 x$ H( N$ Z where deptno is null;
5 U1 |: S6 A* C1 ?6 E& p5 g5 @--视图查询到的是修改后的数据。
0 N7 R& `- {+ i& q# {" B" i; F, @--视图不包含任何数据。是基表数据的投影。
5 G$ K& g& A. Z+ dselect * from v_emp_count;
: u) Z+ H$ z! h! N$ Y( K) j3 U" Q1 o3 d6 m) d6 A" s7 n
--创建或修改视图
! j) |: G6 o& d/ y& o5 O: i6 E( Q9 |: mcreate or replace view v_emp_count# G! I/ A1 [9 R4 P X. L
as
V% |9 z3 a1 k: S& O- Y5 Sselect deptno, count(*) emp_num,' b' ]( I9 B& ?
sum(salary) sum_s,3 n) d0 q, F$ E1 a+ f& |
avg(nvl(salary,0)) avg_s,. ^ W: N9 s" K$ m! J
max(salary) max_s,$ m2 V- ?, b8 q* O& S
min(salary) min_s
% ]( i6 N; \" x- [6 g4 qfrom emp_ning
$ n* K) i$ g/ g% v) {' ?5 Rgroup by deptno;" ~7 |( h) R6 ?' u z% a
3 w: z$ y: A# y: `7 y--查询视图的定义
1 N* j0 _4 w3 i ^# b; P5 F m% Iselect text from user_views1 y6 \ e1 G; ~
where view_name = 'V_EMP_COUNT';
/ F( m! `* \# r5 u# |! p--如果视图对应的sql语句显示不全
! g9 ~ ~8 Y# B/ Gset long 1000
6 E6 u( j! M6 q: G# w) ` S4 H; i7 e& f# w) R/ F& Q7 ?
2.索引 Index :用来提高查询效率的机制。
7 ~" r- U# u& ]0 m! N全表扫描: Full Table Scan: 查询效率极低: U P' I7 ]. [6 p- k
索引查询:比全表扫描快。. k" h6 x7 c! h% `, q- |1 t7 J4 ^
, M6 n& v ]) {8 P& i# w索引的结构:数据 + 地址
. B& N+ \% L, c, K9 M 张三 + Room203! V0 ]- b$ H% u6 O) T
, n( s6 y6 Y) y( A' U1 B: C# ~9 p& X
对于数据变更频繁(DML操作频繁)的表,: i& ?( P; K- H/ |
索引会影响性能。$ l4 v. z0 `0 H( h: {+ K
' X o a8 h% d ]9 M) _ A2 R
如果数据表有PK/Unique两种约束,索引自动创建& l1 K( W% e8 o5 x
除此以外,索引必须手动创建。) g7 Y! F! z. j4 d
create table student_ning7(
7 X3 y6 h- K" [& O1 w, oid number(4),- T: H6 s- P; P4 |1 r2 f
name char(20),0 A; @8 G% {1 h
email char(40),
. \ Z ~$ j7 Nconstraint stu_n7_id_pk primary key(id),
" i! z6 C+ E* z3 ]6 x/ \9 ^4 Y$ Tconstraint stu_n7_email_uk unique(email)
5 H. `+ M) c3 F9 G& M. E);4 r( h9 Q) p6 x( B& I9 Y2 ?
select constraint_name 2 ?2 k# j. ^/ N5 I8 j3 p4 u1 ?
from user_constraints2 l+ f5 ^& s- c$ X1 m U( P
where table_name = 'STUDENT_NING7';
" |2 Y" s* ?1 \$ T8 t# D/ g" m7 s( \+ i4 J
--查询student_ning7表上的索引," `; `* M% p; f1 W" R
和主键/唯一约束条件同名,数据库自动创建的索引。. J9 |( ?, ?4 m) K# q1 ^0 k5 S
select index_name from user_indexes
) P( F& z/ g) h$ U7 a% s( dwhere table_name = 'STUDENT_NING7';# n: {- o }" w+ t2 F! r. B3 z8 A
1 s2 [. l' S. q- m8 ?6 {# ^, R--凡是id或email上的查询,会使用索引7 ~$ Z% Q8 q2 y6 }% y1 [9 y
select * from student_ning7
4 c9 a7 Y& @; b. o3 a% z) z0 Qwhere id = 1001;# p. a R; W5 k, I5 B- m$ R. q; J& W
$ R2 \* X U$ K/ k; ?' N* A5 ~
--这种查询用不到索引:全表扫描7 ?; w/ c' q" \, [
select * from student_ning7
% {4 P5 B( b% t' \- d0 iwhere name = 'zhangsan';3 {) b ~5 Z K/ K5 Q) r; ^# C3 }( P' V
/ n2 v9 W5 ?. O& V! h X# [4 C
--创建基于名字字段的索引,索引名自定义
/ l/ H/ p$ Z% _ Y2 ucreate index 索引名 on 表名(列名);2 L) A. w* J+ Y
create index idx_stu7_name . I2 @2 x) p0 }7 h i
on student_ning7(name);: I" X' x$ M# x# i9 u
! S% F% k& f' F% j4 d# E/ _索引:! M3 b) Y/ ~0 U( ~) N0 p
1)了解索引的工作原理! S5 X; J6 m- w0 S; Z
2)pk/uk自动创建索引: n" Z. d- s2 U# Q( F4 q
3)根据查询情况决定手动创建哪些索引。 @" I5 K/ l( u- o# t
6 }; x3 M3 } O- e& S/ j9 ?, `# x f+ B
3、序列 Sequence --Oracle独有的
6 j" u- U! Y( ~0 {, A( y, n--产生从1开始的数字值,步进是1( z% Q, h4 N% R9 W6 y- f: c
create sequence myseq_ning;3 ]$ |8 R0 y" G# Z* }1 n
select myseq_ning.nextval from dual;
, \' z q; M& l5 P2 m% d- e9 B" t; \/ N- X+ n$ n7 M, [
序列的特性:产生连续的不同的数字值3 q+ z" H6 Y. C6 T+ W. H$ G
用来作为数据表的主键。3 l5 }' K4 k0 [* r& ]* K
. k) L5 V f. ~ b# O \1 v--使用序列产生的值作为表的主键值
; D* ^( e" R+ | U# T. `insert into student_ning7(id,name)5 S: G5 t, a& b+ \
values(myseq_ning.nextval, 'amy');
3 n h( _5 I" Q& v9 D& h, K; ^ @ l H4 J& G; V2 J9 d
student_ning7和序列myseq_ning的关系:
6 g- p+ O9 W; k; t/ f4 c: @是数据库中的独立对象8 b' D/ N+ K) d; C
--表可以用序列产生的值作为主键,也可以不用; p% }- Q& X6 Q7 ?
--序列可以为一个或多个表产生主键,也可以不用 y O3 E- P( U9 A1 ?9 _8 t
insert into student_ning7(id,name)$ M, Z/ b. o% r C: h+ S+ N% u9 p D
values(100,'river');
; }$ P0 V- i- E+ \6 [1 ninsert into dept_ning
0 P9 y: S8 `8 F4 e. yvalues(myseq_ning.nextval,'market','bj');
) i% s; Q3 K; X. d. C% s/ P# d% M' _
--建议:一个序列为一个表产生主键' _' h/ x2 ^- T' E) D' s) m
) H3 {* {% E; t R8 z- v" D/ Y
希望主键值从1000开始,步进是2?' }4 E$ I& A T1 V# o1 {, R/ b2 J
create sequence myseq_ning1
1 e& v0 Z3 ?! G9 L& R0 _6 N3 qstart with 1000
- u8 E) J5 y7 O7 p; ^& kincrement by 2;
3 c1 b& i7 F+ K( O4 H8 X, S: N) H9 O9 a
insert into student_ning75 b1 ~8 d: b/ n2 r/ m' l* K
values(myseq_ning1.nextval, 'song', null);( _5 R9 K# M. `6 W: ], t* k8 S
" u8 {% C! J v3 G; J5 G--删除序列,对曾经产生过的数据没有任何影响。" v, F$ ]/ E. M' B9 L% e
drop sequence myseq_ning1;
4 j* S1 d5 `( u" I/ L3 U: v8 P! r' s; x
SQL> edit
$ G/ A9 ]+ N7 g' x$ a1 ]
- \3 n) w# M1 ]' [* Y) ^ |
|