该用户从未签到
|
复习:SQL语句
% d/ L' T& f& p2 {+ kselect3 K1 K! l5 b$ @8 a, ]
DML: insert / update / delete
: u& r% j5 ^; N9 H9 p7 p- E" s4 _$ S, L. j# ~! W' b! r5 ~
CRUD
O' w/ [- q1 X9 L5 t/ {- ^% ?C:Create1 U6 W# _; o! q! L6 d
R: Retrive
2 j; j; t0 E; W" p4 HU: Update
( e2 ]3 d; R. V1 b$ QD: Delete
1 {5 ?. t8 c+ L1 U
7 h) z, T! M$ G; ^5 ^/ h3 IDDL: create / drop / truncate / alter1 k ^0 e. _# b" B. A! n
) T! o: _. @6 y/ T8 ~
TCL: commit / rollback / savepoint% B4 C; m; s. J. @* |
' a8 @ W; z: U' a7 z' ]* }DCL: grant / revoke( D( Q. I& o% N2 y5 I7 G
) _) d& d: d+ B+ s
grant: 赋予权限
+ b8 _9 ?3 F( d( W; [, Erevoke: 剥夺权限( e- H1 k# a( |9 I
数据库中的用户: openlab hr scott2 A4 Q8 U. Y W0 f3 X0 X& Y! Z
emp
& B0 Q; `; I' N& K( s8 A- s; g! L9 R1 f9 g4 d
假设现在的用户是openlab b3 H' s8 Z/ J# |8 q6 J" ~/ j- \0 V
SQL>grant select on emp to scott;
9 @: e8 ]* b: W1 m# A4 d& Z7 YSQL>revoke select on emp from scott;
/ p9 |& l2 K5 F) G4 a$ v2 K6 K# ^' g9 s- t% g) \# x+ E+ c% a% j
scott的会话:
. Y3 E4 k0 c6 L( u% PSQL>select * from openlab.emp;
4 U" B" D: F. r; U" Q: q6 vSQL>select * from emp;, Q: Q+ L4 w9 @: X3 }9 d- G, {3 a
3 F/ t/ S1 K' `# v* ^% k0 ~* Q0 N2 d$ F" X$ V
Oracle数据库的用户:
& I2 s; _* e8 S, p3 ~! Nsys
( {$ W, s' k) [8 osystem3 ~8 |! Q' ~& g
) I& _9 K6 a6 R- Xscott/tiger$ u! s1 B, \; q& b2 c6 F
openlab/open123$ @; |. H3 S% p! @7 W: F
ninglj/******1 g) h! [, \( d- |; t
exam/exam123
* n4 ^% w1 A% _6 B, X. Y# a! D. `5 h# \9 l) h' V; z H
C:>sqlplus scott/tiger@192.168.0.26:1521/tarena
( K4 ?' S2 |9 r4 N: SSQL>
( { q8 d1 Q2 v7 A' {% s D4 W1 u3 O3 i6 J& i4 s- F* |
o: e: _' Z6 _% x+ q8 I4 H
今天的内容:
3 i/ j1 K0 [$ Y1、约束条件, z* h ` I* J5 E3 ^
2、数据库的其他对象
/ s7 ~4 W8 Y! x/ S, s3 z/ p F; r8 m% b! q2 U8 w" p: N
一、约束条件 Constraint
. S! i8 r6 f8 r9 ]1 L1。主键约束:Primary key, 简称PK
8 E& O) L2 e6 [5 Y2 e! D--建表时增加主键约束条件
" s; z! a k( fcreate table dept_ning1(* ^; b0 f- j5 }
deptno number(2) primary key, --列级约束条件+ c& q8 @- T9 N! h
dname varchar2(20),# ]7 y! z9 C" Y! \+ ?
location varchar2(40)
3 k f$ n+ v' s% U# H. A);
/ j' e* h/ U1 y# Linsert into dept_ning1 $ ]+ t5 p$ |( O$ f% p
values(10,'developer','beijing');' E, i; e0 L) V* C, A$ W
insert into dept_ning1
( t+ b" W9 a6 u1 kvalues(10,'market','shenzhen');
- T' x/ P; ~! j1 H& f--如果插入重复编码,会提示:5 u: h3 D5 _" G5 [7 v! X G
ORA-00001: unique constraint (NINGLJ.SYS_C00634053) violated
) y) G* w# c& Z1 J8 i. E* s5 V; n其中,SYS_C00634053是数据库自定义的主键名
1 b3 w2 S& |" l: T# V--约束条件如果没有显式命名,
5 ^' l6 x( Y5 T6 A7 G数据库给约束条件命名:SYS_C*****" Q$ m) q+ v0 w7 l8 ]
; f4 d# p/ H2 Q7 v" L Y- v--在建表时自定义约束条件名& t; m% p. e) _8 Y4 Y( \/ N
--建议命名规则:表名_列名_约束条件的类型
2 E1 Q# p5 i5 u2 z1 v5 A! W2 ycreate table dept_ning2(
7 K$ L9 y% k! \/ ?deptno number(2),
. Y* {' A5 m& c) |! [dname varchar2(20),% u* I* ?) D+ _7 N8 E- X+ h
location varchar2(40),/ s* s8 I" t3 e! P6 k1 H( S8 V9 n/ }
constraint dept_ning2_deptno_pk * k7 X8 y; d5 ^+ o5 u: \: A
primary key (deptno) --表级约束条件0 `( P! U a3 N% C+ o5 ? \' A
);& X$ U' h) U8 C4 o
--当插入重复编码时,会提示具体的约束条件名字错误。% F a5 s4 e7 F" C, i1 }8 S
--方便定位出错的原因. Y2 R; j, E) |) b1 Y N
* ~% J E. |2 }# \$ B4 R% I, H
主键约束:primary key = 不能重复 + 不能为空# w+ d: }1 s7 Q" e% g5 H
# H" h! [5 ?6 d0 { e
2、非空约束: not null,简称NN& _. y' d e$ @' o/ C0 V
学生姓名必须提供,但是可以重复! _1 \# P* g1 O. e& ]8 s' A; E
--只能定义在列级
( @% g; ]6 U% J+ j% W* |: v5 `6 Mcreate table student_ning(
/ A$ C' ~* f7 C+ Q. Sid number(4) primary key,0 `* d6 D8 w; C, K
name varchar2(10) not null,9 Y" ^3 ~- A' S
age number(2)# z' \7 T+ F5 C5 m
);
$ J( h0 j N Z: d4 Oinsert into student_ning
/ E5 ~/ f& ] L! q4 [values(1, 'zhangwei', 20);$ h( T* O& z. A. E: t6 [7 }0 G8 D
--名字可以重复
# ^2 Z/ d1 t. q5 B& xinsert into student_ning
* E/ i" y/ q0 Gvalues(2, 'zhangwei', 19);
6 o+ U6 q. G7 @; E--提示name列不能为NULL
" ^! K6 o! U9 _# f1 Ninsert into student_ning w b" E0 A6 y7 y1 _: a. y
values(3, null, 18);& }. d. v- r/ |4 B {" A% H
' D% |9 S) f" C% r3 q) h
3、唯一约束:Unique,简称UK% a% n3 e4 h U D" j" N
create table student_ning1(
0 s' Z1 U. h3 Q M1 Z) {/ lid number(4) primary key,
& Z3 X, j6 P, H" |2 O8 Qname varchar2(10) not null,
' k2 |; H& o7 }' ]. r3 D) T; Lemail varchar2(30) unique,
& g0 c' W- Y- u" Yage number(2)
2 w6 H7 Y$ x" z* G);
. M* ~6 a, E% ^. m# winsert into student_ning1 7 T- Y" q+ j& @# [' j
values(1,'amy','amy@doctor.com', 19);& o4 N* b1 M+ m# ~9 J4 O
--ORA-00001: 唯一约束条件被违反6 F/ X6 }0 D; d! v! Y4 g
insert into student_ning1 9 i9 I( C9 _( E
values(2,'rory','amy@doctor.com', 19);
7 z/ ?; w9 o$ _( t1 u% x; H+ X+ K' k1 r+ |" F/ Y
--唯一约束建立在表级# U! J0 @. U5 N2 f
--主键约束建立在表级4 a! R" R" j" G) M
create table student_ning2(; ~2 _6 V% [$ d8 H
id number(4),
9 G# [& k, m3 U4 C5 g% Q T& ]name varchar2(10) not null,
$ ^) s! W, C+ M% S' semail varchar2(30),
6 w5 ]+ \: e6 [" M: e$ eage number(2),9 X) Y8 B6 X# e4 U+ G( Y
constraint student_ning2_id_pk
% u, P& q9 g/ ]) ]primary key (id),
7 |- R6 a7 S0 w. G0 lconstraint student_ning2_email_uk
" R/ p: D& n, w1 z- i1 F7 Lunique (email)+ \' | @! ?/ @$ ~9 R8 P7 ]0 @5 D4 h$ w
);* n, ]* C5 t3 C z( @
+ G# j; O* c9 N0 |( B
insert into student_ning2% ]: N' K, E4 }
values(1,'amy','amy@doctor.com',19);% w* O1 g; w% {& k* L
( B5 S x# p$ O# t" W
--unique约束只要求不能重复,可以为NULL: C% p3 Y7 j# j" T1 q8 w
insert into student_ning2
: B8 u& ~- U; v6 L( Kvalues(2, 'rory', null, 20);+ v& c- F. g' p
b/ o3 f; u. m7 ]' F--不管是insert还是update,email都不能重复。$ l. ?1 |& S3 M2 f% L& U Y
update student_ning2 set email = 'amy@doctor.com'. O' T3 ?4 @" y( l z
where id = 2;
4 v8 Y3 |. }2 @3 ^
$ j$ r {5 r6 W- `+ l4、检查约束 check 简称 CK& z+ d3 A" a0 @' w4 [ T0 g, t
create table student_ning3(
5 X+ p* I9 _* xid number(4),
, o1 F" l/ Q# i3 k& `# `+ Fname varchar2(10) not null,0 [' O" ~0 a d! b; q0 R
email varchar2(30),
6 V9 n+ p8 l3 C2 \" j: _6 aage number(2),
0 P- T8 N% D) r3 F4 _: i% vgender char(1), --'F':女生; 'M':男生9 w; }- x5 T; e1 r, }
constraint student_ning3_id_pk
4 u0 d* c2 v4 {7 B0 d& @1 Sprimary key (id),
1 J5 X2 A, \! `. w) }$ g7 ~constraint student_ning3_email_uk
$ ~9 \1 T" x d3 lunique (email),
5 m2 w( h9 M1 A( xconstraint student_ning3_age_ck
+ H; B: i' D* q5 D1 m% C- [8 @check (age > 10),
8 X" {2 \- F2 q X4 n( ^constraint student_ning3_gender_ck
+ @0 y0 C+ ~/ H1 e+ mcheck (gender in ('F', 'M', 'f', 'm'))
$ d( r6 p' D! P7 c# B0 l- u0 ^);
: ~! A+ M, [4 L8 B) dinsert into student_ning3" v! B3 }% A9 M) s4 m" N
values(1,'amy',null,19,'F');! K. n& r* a( d1 I6 l4 p) b: D+ G3 N
insert into student_ning3% y6 |3 g7 P. e. N
values(2,'rory',null,8,'M'); --违反check约束 age > 10 P- j- k! j. z7 P1 O
insert into student_ning3 % ?( R3 A4 ?( `
values(3,'doctor',null,50,'A'); --违反check约束 gender in ('F','M')1 e# L, Q, _" e& D
! s+ @" O8 }: p
PK / NN / UK / CK / FK
3 p; i5 m U3 D$ |1 n, B0 [& x6 _% X) |4 Y7 j
5.外键. Foreign key, 简称FK. Z8 T, [- P# ^
create table major_ning (
- o% ^$ O6 r% l( E1 L6 pid number(2) primary key,
9 @, n3 y: I6 zname char(20)+ C/ T$ v/ p S1 \
);
7 C, t( J, h0 Linsert into major_ning values(1, 'computer');: e1 s: ]$ B3 c' N: p9 Z- L- R
insert into major_ning values(2, 'history');
( b$ U+ p& Z4 i6 a8 o0 x9 yinsert into major_ning values(3, 'music');% M# b6 L6 h. m; }" }0 @* g
insert into major_ning values(4, 'sing');% A) @0 u' k3 R, } o
commit;% J. H; v( x2 I# Q
create table student_ning4(
, d B5 x! f1 |2 i; W! w2 [& Osid number(3),8 J: ?$ Z9 J2 {) w: H, d x6 c
name varchar2(20) not null,
4 K3 q6 a8 L' [, _. }' pemail varchar2(30),
& f. Z8 F, T+ V( q5 ~9 F/ E: Ygender char(1),
/ }- l* M1 [' z. C" s( mmajorid number(2),( Z: e( `# q1 ~+ U
constraint stu_n4_sid_pk primary key(sid),
4 k o1 R$ s" Yconstraint stu_n4_email_uk unique (email),
1 D) N3 L7 W4 x; c/ g* P/ Q! wconstraint stu_n4_g_ck check (gender in ('F','M')),2 b, `- {5 C, T* A) q; g! y
constraint stu_n4_mid_fk foreign key
" K5 j. M! ?* d (majorid) references major_ning(id)
% w" R6 Q/ ?: v. u& g6 B( D8 z( X" \2 C);
5 `* A4 k) i4 w+ }6 _
4 D' b# y& U* tinsert into student_ning4
! p" T1 u# t8 Zvalues(101,'amy',null,'F',1);! Y; o! H$ b; ^% ]: r+ Q' S4 Q
--新增数据,不存在9这个专业
" j* g( I: ^" a. x5 I' s6 Xinsert into student_ning4* m* K5 Y5 B! h* E, e8 @( p, F
values(102,'river',
5 {4 z/ N. I" R3 Y'river@sina.com','F', 9);4 H8 _- _) K) _% K, x. m
--提示错误:2 g# [3 l/ |/ s$ J$ b5 `; q% ]/ T
ORA-02291: integrity constraint (NINGLJ.STU_N4_MID_FK)4 O0 ?: J. j0 h( ?
violated - parent key not found+ }0 ` }/ ?' F# F0 S+ t$ E1 r0 m' n
insert into student_ning4
6 x5 y+ H. E' R( O3 }values(102,'river',
' ]& w& S5 T% N" ]'river@sina.com','F', null);
! q" D7 m% c& {7 e. z; W
5 E' V6 T7 F8 l6 W6 f: R--有学生属于专业1(computer)1 D- o. K+ z4 o5 B5 Y
delete from major_ning where id = 1;6 w4 ]* \% S6 o1 h$ L% _
--ORA-02292: child record found
: ` i7 a6 R. q1 R$ V2 S9 ^: W2 r6 ?$ p8 V; |. S* k( E
create table student_ning5(6 Y5 I) j8 ~! Y8 V: ]0 H0 |
sid number(3),9 a9 M$ O' n5 Q; I- M, U
name varchar2(20) not null,
7 F* r# N) a. U+ c$ C* W9 qemail varchar2(30),$ u" z/ B; A0 r& A5 z4 P
gender char(1),, R; z9 C# `, \5 a9 v) ?
majorid number(2),3 H7 l3 P9 a5 E. n" j
constraint stu_n5_sid_pk primary key(sid),
& _7 ]3 f4 e: t' n3 ?constraint stu_n5_email_uk unique (email),9 f: m2 p1 g2 i J% O
constraint stu_n5_g_ck check (gender in ('F','M')),4 V$ Y2 [, v+ n& P3 b9 a% O. p
constraint stu_n5_mid_fk foreign key . J7 y% T/ `5 c( O' W& n
(majorid) references major_ning(id)
8 P# M! T2 z/ J on delete set null);, K( b3 K; g' u4 k
% h# L/ h7 r1 `$ ~' T! P
insert into student_ning5
# }$ r" s( @" uvalues(101,'amy',null,'F',4); --amy是4专业的学生% c+ D% p; |2 w3 O; t
--删除编码为4的专业* Q2 c( j3 Y5 f8 ?- L$ ]2 h; N( R* @
delete from major_ning where id = 4;6 C: n& L! \) a9 D* \7 B2 `
--amy的专业被设置为NULL
) p" W2 @0 z2 E0 a, Zselect * from student_ning5; & ?0 J, M8 J* S5 J- D. b
- T/ g/ u4 W& P1 v. |# k. G: hcreate table student_ning6(1 ]# O9 ] V9 u# E* t5 S
sid number(3),
) E! _! D3 x4 X. t: e8 h+ N1 kname varchar2(20) not null,/ U8 I5 r) r( `0 w/ J8 N& ~
email varchar2(30),
; G0 }9 s8 D* K" X7 I+ Ngender char(1),$ v' m2 o# f4 {' F' C
majorid number(2),, y- x4 P. _, m1 f' ?
constraint stu_n6_sid_pk primary key(sid),
. H2 {1 E7 a* H Bconstraint stu_n6_email_uk unique (email),
" R$ W; G3 E. V4 }- A( G$ \$ |constraint stu_n6_g_ck check (gender in ('F','M')),. N, ?0 {# d4 ]4 }/ T3 H( a
constraint stu_n6_mid_fk foreign key
' u7 k& l* i7 u4 C4 r2 E (majorid) references major_ning(id)! }) @6 O% w6 v2 I/ T, Z
on delete cascade);
6 A$ C+ M8 ?* d$ e. `+ G0 @! H5 e; O z* x
--复制表,不复制约束条件。
9 Z( L( A) e( {( B, Qcreate table 表名 as 查询语句2 y1 [6 o4 _: J4 ~
( j# i) ?5 q b( F E
--建立约束条件的时机
5 y6 _8 y& ?( i9 v: {' m--建表同时建立约束条件:: b* B% Z5 ?5 p$ c5 W) c/ W- [
create table student(
: z; J5 P5 c5 o$ a, Hid number(3),
$ J# \0 m- A) x2 {name char(20) not null,
3 m- P) @" U& b$ \majorid number(2),- w6 I0 H9 S5 x! \0 Q5 m, ]
constraint stu_id_pk primary key(id),
9 Y' z ^* v. y, J3 Qconstraint stu_mid_fk foreign key(majorid)' \9 }# r z, r. |& c- @
references major(id). n: V/ ?# _4 n$ ^
);
1 k% F5 D0 a: R, W--在创建完表以后创建约束
' f; S* ~& Q5 l! N' j6 O% ycreate table student(
, l, x2 g( p/ Oid number(3),( u$ [% s% l7 }4 [6 v3 O$ _
name char(20) not null,
# k2 |4 T6 D6 T2 c$ \* \* ?majorid number(2));
. R% G6 p; L) x; X5 i' |4 jalter table student
' Y. B% _* [* P9 A add constraint stu_id_pk primary key(id);
4 |4 L0 j( d L, Ualter table student
: O" }9 k0 ]) m3 o: v0 Q- X% g( F3 }" z add constraint stu_mid_fk foreign key(majorid)
1 k4 u1 m/ N/ \( [0 N- u$ `% C$ g3 m references major(id);. O9 `- I8 E1 {; Z3 @+ P
$ p+ I" r5 x8 o9 q. C. G. P, i) t
-----------脚本文件begin---------
/ H. `1 Y( x' O$ h- T' B, t+ E! ~" Galter table student drop constraint stu_mid_fk;
- l3 B2 g: v3 u* v' p* N) Adrop table student;
, G2 k4 ^& p7 Jdrop table major;
( ?* h) E+ R. o+ {6 W1 D. e7 ]create table major(....);
& c: ]7 ^1 Z- z& P, i# Rcreate table student(....);
# Z! o- h/ |- y1 T2 ealter table student add constraint ....( l1 N- @: K% L, `6 ]$ `: _2 T
-----------脚本文件end------------! s8 |+ y8 h [0 o
5 g8 |2 H0 e0 {( t8 ]! [% Quser_tables :用户所有的数据表
# v3 k' S6 p; tuser_constraints:用户所有的约束条件$ E# x7 l+ d1 s
user_objects :用户所有的对象(表、视图、索引...)
& R1 v# K- l+ H9 z4 F/ m% _& d* t
( @9 b! I9 _' W/ |4 rall_tables :用户能访问的数据表,
6 k& Q. p& B5 o0 s" _ 包括自己的和别的用户允许自己访问的
# b1 u6 Z% ?" {+ L& @% nall_constraints:用户能访问的约束条件# w$ @% ~: ^6 @7 Y
all_objects :用户能访问的对象(表、视图、索引...)( ~9 G: p; z9 ?2 z9 d
/ s' V- {: _; M X
PK / FK6 Q7 n& s0 r. p$ z3 z
NOT NULL / UNIQUE
: G9 V i U3 \. K: pCHECK
; y' i- `& y3 k6 H4 _其中:CHECK和NOT NULL可以在程序级别控制& a8 A2 l6 p6 d1 }6 J: F
" }9 ^) I' ?) z' `; N3 ~
二、数据库的其他对象5 @. G0 j0 t8 J- j# b
表 Table: p: L0 v! L$ h
视图 View
1 Y* ?2 I; A# ?" m8 u1 S$ ? H4 F索引 Index
5 a9 @1 P3 `. z ~# L序列 Sequence
/ r) G6 t! e) \& \* x+ ~4 E过程 Procedure
" R+ }7 a* O7 D* E函数 Function/ m; E/ I* }8 x
包 Package" D% x: H/ X' _% p
触发器 Trigger
0 U" x% l4 ~2 S7 a. H! J" f同义词 Synonym7 a% F1 X- i' d9 w B
.... _ W2 V; r3 ?! d; L- u$ U
. Y- s+ }/ z9 \( I
1.视图View
6 Z! k! V/ @2 X5 f, lcreate view v_emp_ning
( \. p; g' K: oas: Z9 x2 |3 e# L/ j. t/ Y/ M9 {- ^, _1 a
select empno, ename, job from emp_ning
/ M8 h8 A! l! B% X: Iwhere deptno = 20;
6 w! ^5 t8 @* @--使用和表相同) P3 f: r2 i+ d! z
desc v_emp_ning
/ C0 M* M. R; \2 a9 Vselect * from v_emp_ning;
5 C# z; i5 O% E% }7 l! ] S& I--视图的好处:简化查询;隐藏数据表的列/ J* @1 k9 U+ |0 q& L1 w
4 f6 p1 m+ _. k4 a1 X- `. r, icreate view v_emp_count
& [) w3 P' d6 z! u) K$ Y; e1 xas0 U) `2 g1 @9 G+ U1 S; L
select deptno, count(*) emp_num4 l3 @: i" a( k/ K2 _
from emp_ning
# C" G5 ]' L" Ggroup by deptno; J6 _: B% M4 G
--修改基表数据; E2 M, o4 q0 k' X% T1 |
update emp_ning set deptno = 10. M% t# H' r- E
where deptno is null;; `; Y4 e) h$ |* |5 r3 p" W: F! T! [
--视图查询到的是修改后的数据。
' ], w, N \, S--视图不包含任何数据。是基表数据的投影。- y8 n% g4 Q6 @: \+ `$ C
select * from v_emp_count;2 E/ V% {8 \ D4 Y7 y5 z
3 {' @8 ?, ~4 M1 r--创建或修改视图# A: T8 l9 y* o& i$ K& I; X
create or replace view v_emp_count |: \, F- o2 w$ i0 f7 u
as
/ ^+ X% u! }; v" Y3 p6 xselect deptno, count(*) emp_num,& q( U1 X) N4 q' I8 [; m' l+ j
sum(salary) sum_s,: g6 V! c/ Q" ?# {
avg(nvl(salary,0)) avg_s,2 \. H8 }/ A# c! K; e
max(salary) max_s,
# ?4 r T- F N( Emin(salary) min_s
) R# V& ?( z, O% |' `5 bfrom emp_ning1 a ]& y+ z0 Q: f
group by deptno;5 n$ G# c" J3 n2 Q
4 Z; I8 y, Q D% s--查询视图的定义
+ s- M3 ?* K$ q: p! ?- Z+ uselect text from user_views F4 x! g3 G( t! d H8 l, w$ e# }7 [
where view_name = 'V_EMP_COUNT';7 u- C3 S6 M" K+ i7 o
--如果视图对应的sql语句显示不全% o/ S% H- D1 {- L
set long 10008 ?: h. ^: Y) |. c# x0 r6 K9 B/ \# B: q
0 e! j% g, J$ v$ |# r. `6 T* U4 s2.索引 Index :用来提高查询效率的机制。3 ]# E* B9 g; S3 G
全表扫描: Full Table Scan: 查询效率极低
6 S9 ~1 f: F# t/ m2 I索引查询:比全表扫描快。
: L0 k9 b7 U$ ~
m) n; X8 W+ k& d, j索引的结构:数据 + 地址9 w1 ]9 r! y# X! ?0 y1 U
张三 + Room203+ O6 @5 O: u2 z$ N
j( n# m0 g/ `8 _' T2 k7 O对于数据变更频繁(DML操作频繁)的表,/ C2 I* n( |7 G7 |1 w1 a7 r* M
索引会影响性能。
- W7 P5 G1 g( s( e( _9 Q# l: m
, z8 @* t. ?* ^3 V1 b9 P如果数据表有PK/Unique两种约束,索引自动创建+ n# v4 P4 s A8 n% R0 A1 z6 C
除此以外,索引必须手动创建。" |/ w+ @/ n* S7 ~" I/ R) O
create table student_ning7(1 V1 X i" g I, e: O
id number(4),
1 H" N* U8 W# F8 x. O) bname char(20),
! B6 [. y- v3 z6 x; m/ {+ Vemail char(40),
9 ^3 z5 g! [9 v) u( econstraint stu_n7_id_pk primary key(id),. j% e% Q( \) P# ?! j+ y0 C \
constraint stu_n7_email_uk unique(email)
0 Q) B: E r3 C+ c }- w);- I9 l* D7 m# c- Z6 v% T
select constraint_name
3 O$ r V: }% f/ wfrom user_constraints4 ]( F- I7 H, V1 t1 w: P
where table_name = 'STUDENT_NING7';
9 R8 x+ {# O4 U; z4 Y: r6 {4 x- W9 k8 [! \, P( f, c' [* _
--查询student_ning7表上的索引,+ p8 ]) O: c" K3 f3 o* u1 E. I' r1 `
和主键/唯一约束条件同名,数据库自动创建的索引。
) d) d0 m* y, z" K2 zselect index_name from user_indexes
" }! q! }3 g: Q6 t; X7 }$ s2 \where table_name = 'STUDENT_NING7';
0 R( o! t# |9 H! c9 N6 F% h0 _ z( z6 z# c p% U
--凡是id或email上的查询,会使用索引2 D* x+ [/ ^( H# ~' H
select * from student_ning7
! n7 C' w( i& H" d: Awhere id = 1001;8 P) u. s5 W& @& N; C9 @
4 h0 j! |) h/ a5 V# O4 R
--这种查询用不到索引:全表扫描
, ~0 s5 b: ]8 u# I5 ?select * from student_ning7: l0 ~3 p' ]5 l/ n, h4 j2 f; Q
where name = 'zhangsan';
# k8 c6 K( N" e1 _; V! U1 h9 q7 p0 _: e9 l. Q! j7 W7 ?
--创建基于名字字段的索引,索引名自定义
7 `+ S6 m1 u: u5 t$ }% i' g: y$ jcreate index 索引名 on 表名(列名);8 d, N V& [+ b1 B& }
create index idx_stu7_name * a: l( P& I# g& a5 `, p
on student_ning7(name);( [4 v% p ~& N6 p# V5 t# P# G
$ _: f# W, b0 p" S+ q( x9 Y索引:, t/ w. g3 x% I% I( `4 d
1)了解索引的工作原理
! ^' i! p) ]8 ]2 a# M' h9 u! Q2)pk/uk自动创建索引
/ m: [ I, l3 x3 ~7 `# r3)根据查询情况决定手动创建哪些索引。
+ w2 ~) Q" i4 h4 ]8 J
* b* b/ }. ~8 s( D9 f
g% a- h, {% v( e3 ^/ q0 R3、序列 Sequence --Oracle独有的. a, N% c* H) b0 l
--产生从1开始的数字值,步进是1! F6 d' l2 f' F/ t- ~% O
create sequence myseq_ning;$ ~" u7 j! H( }4 c ~' {
select myseq_ning.nextval from dual;
( U1 P: l. d* C2 H/ ~5 s, L9 O8 k! e1 N0 `
序列的特性:产生连续的不同的数字值- |( M+ D: ^( E" S7 G
用来作为数据表的主键。
+ @% e8 G. G# N, k; C9 u5 }; ]* T% m( H; R* a
--使用序列产生的值作为表的主键值8 l- Q: r9 }$ ~' P9 |
insert into student_ning7(id,name)5 I6 @8 o h7 w" I2 L/ [" \6 e
values(myseq_ning.nextval, 'amy');' H4 O* G( G6 ~* _3 r% C
: j2 X/ `, D9 {" vstudent_ning7和序列myseq_ning的关系: F6 X3 q5 q6 r+ V' J6 q
是数据库中的独立对象- A1 [4 J6 Z' i6 W8 r: p2 ^
--表可以用序列产生的值作为主键,也可以不用
/ Y9 F; @. B, o& Z0 D--序列可以为一个或多个表产生主键,也可以不用! D8 v7 a; Z( j& D
insert into student_ning7(id,name)
. p; q/ L+ N. @0 @6 l: ivalues(100,'river');
! Q( ]% ? `" }. E& ? Ginsert into dept_ning7 u; d! h# t+ Z! s& j4 C: q) P
values(myseq_ning.nextval,'market','bj');: `" v9 e3 h4 t
( j9 P/ r5 W, l$ q
--建议:一个序列为一个表产生主键% s/ k) K/ R, g1 Q! e$ `0 W
7 M. _3 s& N7 Q0 j# ~/ |% D( F希望主键值从1000开始,步进是2?
2 j( E4 h" _0 l- s9 Z! ccreate sequence myseq_ning1
) Q |. {/ ` P7 y4 Cstart with 1000
2 x% x/ y! f3 I" u1 C" n8 f& qincrement by 2;
2 M/ P: g, L; C$ t
x. W& R0 d$ b# m# _& ?insert into student_ning76 a5 O% H) K: s# x0 n& p9 P
values(myseq_ning1.nextval, 'song', null);
. O8 \/ I9 V7 M
# y/ k- ?/ W! { C5 b1 ^--删除序列,对曾经产生过的数据没有任何影响。
3 _ [" o# r9 p4 ]- D: P! xdrop sequence myseq_ning1;
% D2 B5 j1 S4 X/ @$ N1 U1 Q
3 l7 O' z8 ^7 u8 l- PSQL> edit
5 A ~8 W2 j* Y7 B+ B( P) d/ G4 q% g, H( Y& c
|
|