该用户从未签到
|
复习:SQL语句
$ K' E" @3 V" I* m, G& |select( ~; M9 s7 x2 T; g( Y/ X
DML: insert / update / delete% ` W0 P) o9 `& ?
& {+ a/ V; A' N4 H& d( \2 U* J
CRUD
5 Y4 N# G! _& Q; k0 DC:Create6 d& l) j% P' `% X* i
R: Retrive7 _8 Q! k6 Z2 p1 H
U: Update( A5 r# w- F# f8 a& K3 |$ x$ }
D: Delete6 c1 {9 P. N2 f# v$ n3 z6 }! l% A8 m
! C8 S ^/ q+ J% MDDL: create / drop / truncate / alter
6 }$ u x( O" Z" Q$ `- L
6 p: M0 @5 p- e1 LTCL: commit / rollback / savepoint: a+ |, D# h" U, L4 }& C
0 p0 R" {$ Z6 F: ^; l; ^DCL: grant / revoke0 @, y4 ]' r& |" n/ C
8 g5 K0 e0 T4 I) ~grant: 赋予权限
. h* {8 m6 Q9 T$ h9 Z/ k2 [) Erevoke: 剥夺权限
8 G( m0 L/ s% l: Z数据库中的用户: openlab hr scott* ?' a" l/ E- O8 e3 m0 t
emp' d8 W/ z2 r% ~ B( z! q& i
6 B& f( L5 h& h- }4 c5 G
假设现在的用户是openlab1 M2 x/ ~! C. l2 b1 K2 C: S
SQL>grant select on emp to scott;
+ P4 Y, l8 U8 ^7 r vSQL>revoke select on emp from scott;5 J0 V3 l x, A* p) A; P: r2 J
n9 T+ y0 g: V% @scott的会话:
2 U; H: p3 n5 H, FSQL>select * from openlab.emp;" w, r. I! Y5 [0 G
SQL>select * from emp;
1 d8 L( o O( H2 `: R9 D! C- D: D! G3 C/ [6 w
! b4 v% Y! y, F2 z6 E( H3 C# T ^Oracle数据库的用户:
) T3 P: C7 w: v$ Y5 [6 Msys9 X8 g" Q# {# n- x/ t" _$ k8 c( V
system
+ c) e) u' {8 Q1 [7 M7 d+ p$ ]& M2 ^
scott/tiger
8 H! m8 f q; @ }: K/ C+ wopenlab/open1231 d: w' r! x6 g1 X+ [' b$ t- v5 t: O
ninglj/******) f$ P" Q5 @/ }$ u+ V! }% R
exam/exam123
' n1 ~4 j) _( J& O
2 Q8 V! N0 Z+ @* J# U8 h; uC:>sqlplus scott/tiger@192.168.0.26:1521/tarena
' C% k# j6 F! \SQL>
* B( m" M+ \, l$ V3 Y. J3 s; C x1 i
: B0 f+ w* k, n- _) S; r
今天的内容:
; b; v* j; }. t+ H, t- I3 H1、约束条件 ]6 g4 U1 e9 T8 \5 _
2、数据库的其他对象
) W( y. S' ~* C! q6 f4 L4 Q8 x
: K7 P4 m0 ~" P5 P一、约束条件 Constraint$ z9 Z" O7 D1 P) T$ T% Q
1。主键约束:Primary key, 简称PK
( m, M; J# G$ D4 D) Q3 f! t--建表时增加主键约束条件
5 l: j1 _! }2 }# a' |: r. p2 Kcreate table dept_ning1(
3 ?! A2 l' R6 q3 t. W* Q& J, Ddeptno number(2) primary key, --列级约束条件2 I8 G: p, H( I" v
dname varchar2(20),
9 D. X/ \ {$ v9 A- N wlocation varchar2(40)2 `+ F/ m7 o. V# V9 x* T0 c
);7 q" d9 {/ X3 ?! D' }
insert into dept_ning1 c. l2 c% N& I3 r1 Y- l6 [) V
values(10,'developer','beijing');
I2 V$ S$ ]+ R) oinsert into dept_ning1
% U1 K9 G$ f z. g- n! K2 Ivalues(10,'market','shenzhen');/ y8 `! N4 Q3 p- S; `9 C0 d( {
--如果插入重复编码,会提示:
+ p" ]! ^) G* S+ h# j1 | S) GORA-00001: unique constraint (NINGLJ.SYS_C00634053) violated, _4 `6 u/ N) N
其中,SYS_C00634053是数据库自定义的主键名9 E0 O! z$ V8 i; f0 @: }1 ^* q0 W) D
--约束条件如果没有显式命名,
* @) [ c9 x) M1 V' y数据库给约束条件命名:SYS_C*****
) ]$ w0 P% S/ K8 x$ w' w4 D
t9 R% u) [: @+ C; Z) b--在建表时自定义约束条件名( G1 [+ d8 q) ^! D* T6 J
--建议命名规则:表名_列名_约束条件的类型
$ K% o2 H1 o8 T3 b2 U& C( d, pcreate table dept_ning2(% I+ O+ V: g( x' b' R
deptno number(2),2 E- ]6 G9 ^0 C0 ] x& a
dname varchar2(20),/ J, `6 f- M( x# h N- [
location varchar2(40),5 j( K! t" w& n" d2 ^+ n% }, w& Y
constraint dept_ning2_deptno_pk
7 J1 d: Q3 M! S" u; X' c; z7 Kprimary key (deptno) --表级约束条件. n5 u( m0 b2 v! ^! X) R
);9 k9 w2 [0 }+ T6 z- l0 s w4 B
--当插入重复编码时,会提示具体的约束条件名字错误。7 U8 P- g$ {# n
--方便定位出错的原因) ~& h$ g' i, n$ u8 \% Y: X, X
- E8 V6 P% {' q7 |1 L主键约束:primary key = 不能重复 + 不能为空
0 v8 L' j* ]1 V+ ]' w; W1 n) x$ Q7 o5 ]- i Z- z1 K
2、非空约束: not null,简称NN
) @" l& W. J/ l: \5 s9 N5 b4 [4 P学生姓名必须提供,但是可以重复+ y) h. l' a/ ? @1 u
--只能定义在列级8 V9 J; H7 d; o( r
create table student_ning(
1 p% S& s, D# f. R: a; Vid number(4) primary key,5 T; i% l" w$ x+ R( Q
name varchar2(10) not null,+ Q7 _3 f( g/ L+ {' k* Y" o/ I% v
age number(2)
1 v5 Y8 R0 c1 B* K);9 t+ L1 L4 `2 s6 M! g- O' N9 h) [8 G+ J
insert into student_ning 8 H! _: b( n- P: n* }; Z& [, Y# ]
values(1, 'zhangwei', 20);/ u* r5 B, ?: v
--名字可以重复
: u* m& M- w$ S' G$ a6 Hinsert into student_ning ) u1 A9 I1 G* u
values(2, 'zhangwei', 19);5 g) w/ P N0 H0 `( q
--提示name列不能为NULL- L L$ D- S! Q' S w0 R
insert into student_ning * x% W+ y1 l: C8 I$ g3 J) n* O
values(3, null, 18);
1 v) X) d0 k- {- `! j
$ R1 G, H3 v6 j9 t3、唯一约束:Unique,简称UK/ c0 w; M9 D% Z+ ?, T
create table student_ning1(" ^; A" x" ?8 |: {
id number(4) primary key,4 G+ q- j1 ]& ^, c' X! L( s- \
name varchar2(10) not null,
. W6 u' f7 F# x$ _# G8 Demail varchar2(30) unique,- E# R8 U0 _. o3 c9 |
age number(2)
" l, N* u; w% h9 { [. }; g);
/ Z; ]: t; A: H" e' A! Finsert into student_ning1 B- A9 N5 v$ T% g; t: D. T
values(1,'amy','amy@doctor.com', 19);$ [4 v+ ~2 U/ B3 _# B$ @
--ORA-00001: 唯一约束条件被违反! I6 J3 H0 D8 S& e1 w* i
insert into student_ning1
8 p7 w. [: j* s/ yvalues(2,'rory','amy@doctor.com', 19);
0 q6 @$ T! I' P$ v8 Q* Y. W5 f8 {9 r5 a4 W
--唯一约束建立在表级
' M# [& k2 P0 r2 M) m$ H2 }$ D# r--主键约束建立在表级7 B* }# Q6 Y$ ?! {5 G
create table student_ning2(1 s; }" R1 G! |$ w" c Y
id number(4),
! N7 U/ u6 ?: b( B" o, G4 j# iname varchar2(10) not null,( {! i, h- Q6 p: `
email varchar2(30),6 \- d( v4 O% j$ Z6 W: O3 j. {
age number(2),
( X4 d4 [- q; T* F/ h+ X7 y7 w7 \constraint student_ning2_id_pk
6 _3 w0 A7 y8 _6 ` W$ qprimary key (id),! G8 ]' Y" o' a k7 i# |
constraint student_ning2_email_uk! f0 Z: }4 a" p2 |9 `) r/ s
unique (email)' }$ J& u& e7 Y9 u6 E: a+ W
);* I2 i9 h5 n) c5 f( q1 ]. h
' g7 v% m4 H& s/ A u
insert into student_ning21 J7 T# j) f/ M9 h8 q& ]
values(1,'amy','amy@doctor.com',19);6 O' Q4 W- I& a0 s9 H1 Y
+ ]1 a( V0 L* S5 B4 x--unique约束只要求不能重复,可以为NULL
8 `) z# `1 Y9 @; Ainsert into student_ning2
0 v9 D- h5 j& p! ?, m9 ?values(2, 'rory', null, 20);
; G8 }8 w' C6 t# z7 M9 |# z, C/ W/ N6 E2 _' B$ P
--不管是insert还是update,email都不能重复。/ ]: x1 u$ w/ b3 q, U
update student_ning2 set email = 'amy@doctor.com'
( q) E2 n2 N7 U: y8 e) nwhere id = 2;
1 C A f7 Z }, k
- J1 G( B- ~. R# X: ~4、检查约束 check 简称 CK
8 O; W" y( `% }2 V3 \ m1 icreate table student_ning3(1 c$ P. k" \4 e
id number(4),& I) v, v/ X# H1 w
name varchar2(10) not null,7 e# f5 L* X6 j' X
email varchar2(30),$ ^5 \ R$ ]9 [1 f. ?. s0 ]5 S7 A- ~
age number(2),
& ~2 s6 \ k" Qgender char(1), --'F':女生; 'M':男生# f6 l0 i+ |9 D, |9 X
constraint student_ning3_id_pk4 {# L- e$ A) Q( T
primary key (id),
- @. ]% J7 d8 d y2 a" P7 z* w9 Xconstraint student_ning3_email_uk
1 b: X; T: w+ u: h3 C0 y6 Qunique (email),& p" ~2 B" _. t7 b
constraint student_ning3_age_ck
5 }; j8 C+ ^9 b) e9 q7 B! Pcheck (age > 10),
7 e' N( }. K: x: u* W+ yconstraint student_ning3_gender_ck
# A: l" D5 E" ?+ `$ F2 Kcheck (gender in ('F', 'M', 'f', 'm'))2 }4 X8 D3 e' z
);
P9 J6 P* V6 B9 B. oinsert into student_ning3
% K4 C3 p7 _8 j2 t: @1 Nvalues(1,'amy',null,19,'F');
) _8 @2 A9 ]0 |% H7 Z5 R1 s/ E$ Yinsert into student_ning3
+ f/ ~4 t! W+ T6 G e9 l( w( bvalues(2,'rory',null,8,'M'); --违反check约束 age > 103 V a+ k5 Z4 P- L) [5 Q
insert into student_ning3 + W7 _+ P$ K2 `1 `. m$ x
values(3,'doctor',null,50,'A'); --违反check约束 gender in ('F','M')
2 f# J9 u. ~! Q: l
6 u. d7 Q1 O: H5 O' g8 m1 T0 ~1 ]PK / NN / UK / CK / FK# Z* ~" [/ C5 ^- ~5 ^ _
/ O" o/ l9 `+ u# K* W M; o5.外键. Foreign key, 简称FK
5 Z( F V1 {6 i. x# m6 ocreate table major_ning (
. x" A I# n+ g! Z% Y" uid number(2) primary key, ( j: M* ~$ k6 N! h# x, d2 F& Z
name char(20)
3 |% A4 [8 X4 N+ E& B Y# R; M$ J);( g: O* ~$ p) o0 P- i6 y+ e* V
insert into major_ning values(1, 'computer');4 F" [1 k3 `' |3 z. }
insert into major_ning values(2, 'history');
! w; d1 g: B' U' g& A5 Uinsert into major_ning values(3, 'music');
) _4 p' h8 u5 c& T/ D8 Ainsert into major_ning values(4, 'sing');+ C: B7 T) O, n6 O% ~% B9 A Z# W
commit;
- n, |% A: E: _0 C. Z/ I1 Ccreate table student_ning4(
3 f* n/ R9 D0 Q/ Fsid number(3),/ k( H5 M3 S9 W; U+ y
name varchar2(20) not null,( `7 B6 f7 W5 \0 l* p
email varchar2(30),' `+ ^" A- R, @' Z
gender char(1),# E' U, ]' I3 A
majorid number(2),& k) j @8 i6 l. s
constraint stu_n4_sid_pk primary key(sid),8 b# f% `$ I$ n& ^, s' ?
constraint stu_n4_email_uk unique (email),
+ t0 g! F- Q2 z' O/ B7 a5 Qconstraint stu_n4_g_ck check (gender in ('F','M')),
. {5 c* @* @1 i' ~& zconstraint stu_n4_mid_fk foreign key
# C, z! @8 P* |* ]+ }1 p (majorid) references major_ning(id)
7 n* E* J* t& l6 C) }: s4 d);
5 |" e* C) @/ T; I
4 w. H, a" H, L# ?# q8 \insert into student_ning4
( h7 D7 P% ^( Z3 F7 \values(101,'amy',null,'F',1);
) F/ j" @1 v7 h( p$ c. H5 { K6 F3 Z--新增数据,不存在9这个专业
! t5 ~; U7 Z- |8 U$ r( winsert into student_ning44 H- M, k9 G. j3 M# b
values(102,'river',
: D" V* |6 P& a G7 P'river@sina.com','F', 9);
9 {) ^6 O8 ^4 ^8 z+ J! Z( @) v--提示错误:
6 I8 H9 B4 M& y" h% r: u3 mORA-02291: integrity constraint (NINGLJ.STU_N4_MID_FK)7 p) d, ?0 G1 D& [ b5 l0 j% Q, D
violated - parent key not found! k( b, p" z/ x" u
insert into student_ning4
; a$ L) ?1 E n$ U7 q& P$ Bvalues(102,'river',
0 D+ N$ X$ J2 s1 p'river@sina.com','F', null);: i' V0 L) S) o$ p' O
. z7 G' B" ~2 N4 w( ^--有学生属于专业1(computer)
0 m) B0 ~; `. hdelete from major_ning where id = 1;
. y& v& e& N* w9 P--ORA-02292: child record found* t7 i! ?; i8 J2 [* E7 Z' x
2 @' a: {( V r1 q2 v( E. m
create table student_ning5(1 u+ P. y( Q5 B7 ]) b+ n" O5 U
sid number(3),! {3 @8 {% D( i7 U% H2 q$ D/ S
name varchar2(20) not null,% i% S$ b" B* i4 m8 w
email varchar2(30),8 U7 M7 m9 u- i; @, m3 y8 x
gender char(1),
" }7 v1 R u$ n" f& `9 ~; nmajorid number(2),
5 N3 N7 D6 E+ c2 h: l7 oconstraint stu_n5_sid_pk primary key(sid),* d9 `) F" h+ n
constraint stu_n5_email_uk unique (email),
8 T- O# d0 h- D2 Z. lconstraint stu_n5_g_ck check (gender in ('F','M')),2 }6 @. X- b+ u/ r! a5 t
constraint stu_n5_mid_fk foreign key 7 q% J0 i. p! G7 u
(majorid) references major_ning(id)2 @# _, r# w; v) N% s: a
on delete set null); y) W; G7 o# S! c% H
/ b9 ]1 L% \1 g" g2 \( S, q5 R8 hinsert into student_ning5
U7 R3 N' E/ U2 v5 R0 Avalues(101,'amy',null,'F',4); --amy是4专业的学生+ t1 s) C$ S- g3 W5 B7 p9 E9 \
--删除编码为4的专业3 k8 X6 R6 @7 w
delete from major_ning where id = 4;
" z& w1 L& D2 R' i--amy的专业被设置为NULL
% e; j0 W: Q/ E3 o- Sselect * from student_ning5; " S) P8 ~4 c/ {& N, ~+ F) r
+ P1 u# R2 L& @& O: g0 H
create table student_ning6(: n6 ^, d1 f. ?: J! s
sid number(3),
3 X' S4 z, X, {name varchar2(20) not null,' Q" ?: }4 }; \9 T$ T$ z0 f4 v
email varchar2(30),
. d; R# S5 Q0 m/ Ogender char(1),
7 T) [$ V8 U" r, hmajorid number(2),4 Q$ e: K! N# w
constraint stu_n6_sid_pk primary key(sid),3 D8 U/ |3 I+ }$ j; m% `
constraint stu_n6_email_uk unique (email),
4 l3 o- c# T. ]! m& \2 ?" gconstraint stu_n6_g_ck check (gender in ('F','M'))," V! J' @+ E" V0 w6 N* g" O
constraint stu_n6_mid_fk foreign key w2 f1 z& R4 j6 P6 w" g
(majorid) references major_ning(id)1 Z7 W( \9 `8 Y
on delete cascade);$ u; [) [6 j5 j4 G1 `$ t
& U# B4 y& N: x u5 e2 h" F
--复制表,不复制约束条件。
@+ s0 s5 @8 F4 @$ s5 f) }1 s- Pcreate table 表名 as 查询语句6 ?; R+ |" ^3 q1 l5 d
0 C+ q. {/ M2 Q* z* V' m5 z4 n
--建立约束条件的时机
- Z! ~. [8 o9 V$ Z: f0 z--建表同时建立约束条件:
0 @ _3 e5 ]& }% L" C2 ^% pcreate table student(% A# z% c5 V9 i/ e
id number(3),/ R! O+ t( ^* |, o. }. H
name char(20) not null,
! T5 O7 z9 P3 Z7 `2 B3 w& \+ Vmajorid number(2),+ A4 J$ G2 T& c% p
constraint stu_id_pk primary key(id),6 d) G# E4 i5 {/ V3 Q+ e& \
constraint stu_mid_fk foreign key(majorid)
J8 G) y4 y; O0 D( M+ U references major(id)
. V+ l( g6 l- Q* {);
4 k+ A3 w$ |( T' e" j--在创建完表以后创建约束
0 c, _5 M+ ? a9 H5 A. m kcreate table student(4 d, [$ u5 I1 V. n# @
id number(3),( o8 \0 w* M; M v8 T
name char(20) not null,
3 k/ A6 ^$ u2 s5 Y+ e! k% mmajorid number(2));5 [ Y* B/ o; Q z3 w5 w
alter table student% U) A/ q5 v* d# U0 W% x
add constraint stu_id_pk primary key(id);
d ~& C: V# ^! U7 l: F# Q+ d' malter table student
! ?1 D4 ^' n4 l8 [/ W add constraint stu_mid_fk foreign key(majorid)
) x& o# I/ b9 o' p4 O references major(id);+ T" r" [. H6 I1 P; W' }3 T C
U6 E' n, [+ {0 I* s; o/ F+ }-----------脚本文件begin---------- M1 Q, E. J: ~+ ^+ G* A
alter table student drop constraint stu_mid_fk;
. S4 Q+ V# l% p' }5 Idrop table student;* V; w6 r% p! p. p' C" Z
drop table major;
) E, f; p- U; O3 G; [+ G" ocreate table major(....);" z& m4 [! o$ B6 m2 K) F% O( B
create table student(....);
/ e5 N; ~# B1 }alter table student add constraint ....
( `& F; }+ e' q' B; }+ e-----------脚本文件end------------" y: r; S# T6 t9 i
+ t9 ^5 }& e7 M" r& D( P4 O; P
user_tables :用户所有的数据表
' ?* y. V% D: P5 F4 K( _% y) ^( D( W' auser_constraints:用户所有的约束条件
+ d9 h/ \5 S1 L) Nuser_objects :用户所有的对象(表、视图、索引...)
( @ m: I9 a. ~
+ N- ~( j' c& u3 e2 u) eall_tables :用户能访问的数据表,
: b0 [# w4 J1 f6 y) g1 L% d7 i; c 包括自己的和别的用户允许自己访问的
' S% C1 Y1 \: oall_constraints:用户能访问的约束条件7 b: j# e7 b3 }" Q
all_objects :用户能访问的对象(表、视图、索引...)
. `1 V0 k0 w7 T+ j# L2 J5 ?! U, h& h g I% x- C& J* a2 P/ d! Y% p
PK / FK0 `" w j d \( u4 q2 p( a
NOT NULL / UNIQUE
/ p4 H2 R& F* k2 s @CHECK5 C- F0 j3 }# ?9 x
其中:CHECK和NOT NULL可以在程序级别控制
& u7 y" Y) e# `7 P3 H$ k" z
% Q) |3 a% H$ {# R/ F9 D( |; L二、数据库的其他对象8 ]% M+ Q+ {5 h
表 Table
. I1 \# X; }# u- \# v. c0 g" W) F视图 View
' J( \# J3 B9 L7 V: Y9 I. U索引 Index1 T& ^' s6 \( j" Y' o
序列 Sequence
4 D9 X6 j7 E9 h4 w过程 Procedure5 v- }8 [* m% Q9 ^& i7 U [
函数 Function
0 w, G @/ i1 m4 \6 W+ N包 Package
4 V q7 }, y3 R$ l7 H- J触发器 Trigger+ f/ B" Q- O- B: D0 ]& g6 h$ u/ P
同义词 Synonym& s& o2 _( S) e
....0 C1 G9 I1 Y7 {- q9 q
8 M. P A7 P3 ?: s, E1.视图View5 @+ c" S) J: r I# ~, C$ f6 q5 Q
create view v_emp_ning
/ X; b5 L2 {2 j+ ^" pas
. c8 U6 G8 _( b1 ^select empno, ename, job from emp_ning+ E7 n( y) d* F; j+ t& L
where deptno = 20;& z5 ?! Z1 i5 }1 G' }3 b
--使用和表相同
: F0 z! G) f8 `% _/ {3 |0 |/ gdesc v_emp_ning
3 A- s& I8 y9 H- w4 c8 k+ Jselect * from v_emp_ning;* b& [4 h* z g+ o; _ @
--视图的好处:简化查询;隐藏数据表的列
$ g4 h( G& Z6 F9 ]6 F) x# o" w3 O& S) q$ t' t3 V3 i5 t
create view v_emp_count6 l" }# \$ F- c8 o' N+ K
as, x$ y6 r1 M% I' Y# S% r
select deptno, count(*) emp_num
% v- n+ j# ~' ^9 @+ o. M: ^8 rfrom emp_ning, [; R( [- r/ e% J( v/ k1 @$ r
group by deptno;
7 x# k- I0 i9 S% Q3 x0 O- ^--修改基表数据4 Q& C. x. S1 X$ L3 S2 {
update emp_ning set deptno = 10
$ [+ [; L0 g) r u where deptno is null;
9 V9 v2 }% |: k5 @--视图查询到的是修改后的数据。
7 |5 ^- k) u+ R: ^% C6 ^0 r2 ]--视图不包含任何数据。是基表数据的投影。7 V! w+ f5 n4 u6 f% {# z+ |- K. {
select * from v_emp_count;
5 U6 b' p' @& i3 W
2 K7 R; r. t" m) Q% R6 o--创建或修改视图
+ |8 m- R$ U: H9 D/ z" t9 L ^- screate or replace view v_emp_count h N9 M/ ?% a5 D, v$ m, @
as. P$ j" I* P; z/ S3 v4 \: P9 X
select deptno, count(*) emp_num,
8 J4 i1 R% w4 F+ r2 Rsum(salary) sum_s,; l1 ?4 G# I/ P- D+ }' p. f; z8 I" B
avg(nvl(salary,0)) avg_s,
& A8 {8 w9 F" O+ t6 t- Tmax(salary) max_s,
/ ~$ ^& l4 Q) Y/ u9 P$ O4 xmin(salary) min_s1 {1 |+ K4 m. z0 v
from emp_ning0 I8 R" ]$ W) i* ~
group by deptno;
* H4 O+ b# b9 U$ j8 x' c! W5 c
# i2 z5 P7 m$ v! R$ [# n: K8 A u--查询视图的定义9 `( V8 c0 q2 s9 n% U- ^% m+ ]
select text from user_views
2 |" K, I* L1 t8 d; ?- twhere view_name = 'V_EMP_COUNT';
5 J7 \& i; m$ z* A, D--如果视图对应的sql语句显示不全
+ j& T, Y9 C* d# S: x" yset long 10002 {. t- h! d1 q' Q( o: S' J
, Q) H3 W: ?* f* }$ Z2.索引 Index :用来提高查询效率的机制。' l; A% F' Y# p& I( j) K9 Z$ O
全表扫描: Full Table Scan: 查询效率极低
. m; u8 L' s$ v9 k索引查询:比全表扫描快。
) P- Z s2 E3 D6 M% E/ t7 q8 Q# ]7 J
& N7 x5 w" Z/ j1 j; U索引的结构:数据 + 地址 I1 B" t- U6 W, D, |: u8 l- i
张三 + Room203+ | ^$ F; i9 Y: h( f' ]# @
! E! S$ A0 x0 _ r8 B' `* _- h% n对于数据变更频繁(DML操作频繁)的表,, D1 k$ `; e n3 _
索引会影响性能。
5 X0 }0 m1 v5 ~5 B [5 N& Z3 _2 i2 y+ g$ z
如果数据表有PK/Unique两种约束,索引自动创建
: I" v A% ]4 V/ O( D; {除此以外,索引必须手动创建。3 D7 G/ D7 }$ w: _1 f" P; x
create table student_ning7(8 l- q0 X. _ J
id number(4),# {* M% D: ^- j/ U/ k; w
name char(20),& g( g1 p0 F0 u1 b8 G- E
email char(40),
( M6 T$ G; z+ F- {8 t$ Oconstraint stu_n7_id_pk primary key(id),
7 B2 }& x( L" q( w6 J' mconstraint stu_n7_email_uk unique(email)
. V! h' F6 Y; S9 Q0 p+ Q0 s);
, n7 \* l# U5 D Dselect constraint_name
6 s6 v. y u, L, mfrom user_constraints; G$ \( J; f8 v6 g! C
where table_name = 'STUDENT_NING7';8 Z* ~4 b$ R( q, L/ M5 ^
# }) _. n/ l, Y5 T: y! c& k( y L
--查询student_ning7表上的索引,
, o' I; f" J* k2 k( l& w: q和主键/唯一约束条件同名,数据库自动创建的索引。
2 r- F* g3 V1 R" _4 U8 ]select index_name from user_indexes- z3 C9 q9 C; [/ [9 X! p z$ t0 \3 c
where table_name = 'STUDENT_NING7';
/ i( H' M6 |7 R) _+ E& h
$ K1 G3 u$ p$ o# s% A1 b) D--凡是id或email上的查询,会使用索引- x! R" {) M5 w/ l; `" B3 D
select * from student_ning71 i7 {7 z$ N* Z; O; S/ w3 k) ]
where id = 1001;
0 _& ]0 i- r- H J, U' P% m% H" f8 f! H$ c& ?
--这种查询用不到索引:全表扫描( D! i2 ]. S9 o5 S* |8 N# q1 S1 L
select * from student_ning7
2 G& o X. X% k: D/ {1 H( h/ Ewhere name = 'zhangsan';* u: V+ |1 q! J' B/ f1 y& K
, L' [6 s3 t8 B0 }8 K2 y& @2 C--创建基于名字字段的索引,索引名自定义7 r' g) h- s( W+ k# S
create index 索引名 on 表名(列名);
: G- k2 }$ a" I- \create index idx_stu7_name 8 r: o: C3 V# \) q! F5 h6 N
on student_ning7(name);
1 R6 h- S' x3 d: ~5 w# y6 p! ^$ U
8 p1 j& k" ^" q# ^2 \$ y- S9 W7 h索引:( U- a. r3 }! n% P. ~' J
1)了解索引的工作原理
a) e! ~, u& G2)pk/uk自动创建索引
5 W; R2 n3 U* K: P" k3)根据查询情况决定手动创建哪些索引。
& F7 K3 A8 A7 B+ _' l) ?! X( U2 S1 \2 _
[* [2 `. ^- _/ \7 \6 U7 c- O& S5 G
3、序列 Sequence --Oracle独有的/ [" \1 U! F6 ?) F6 w+ z
--产生从1开始的数字值,步进是1
0 C9 G" x) Y& a4 f# q6 Jcreate sequence myseq_ning;4 a: {# M" j4 @) Y2 s$ Q8 |( m
select myseq_ning.nextval from dual;
: X, `8 x1 z+ E" {3 @" ^' o# `: G. S
序列的特性:产生连续的不同的数字值
& P4 r( o3 p3 a; J% P1 o0 e$ E- u- C用来作为数据表的主键。* b7 R1 O( d f/ q+ |# e+ p7 }" j( D
* _4 s/ c( v9 f$ H
--使用序列产生的值作为表的主键值5 ~/ `, _' D4 s1 @' P4 d, \
insert into student_ning7(id,name)( T: o' j" O& d7 L# ]& `
values(myseq_ning.nextval, 'amy');# C# B2 N) M, J& O
) \& K( |% M; E+ c# f( R" p
student_ning7和序列myseq_ning的关系:
1 }+ g6 H5 u7 K W% `: c是数据库中的独立对象7 w+ [8 k/ y$ t6 K0 q. a, n
--表可以用序列产生的值作为主键,也可以不用
( S; h2 Z/ l2 X4 ^9 ~3 R--序列可以为一个或多个表产生主键,也可以不用
- y) n1 R" G) T/ s+ w9 rinsert into student_ning7(id,name)% C4 l) |3 F" w4 C# U9 l4 W( u
values(100,'river');
% c) R: b4 X; j# F. E7 V" v: @! ]7 ?insert into dept_ning$ s; `. @ y+ H- d1 U, H8 r. ~
values(myseq_ning.nextval,'market','bj');
F& _( }9 D8 I* A, Z, r
- B+ N! e5 F1 T/ o/ v2 A# G L/ T--建议:一个序列为一个表产生主键- I: u$ X6 }* T
3 p2 @+ Q, T) B0 z# ^# J希望主键值从1000开始,步进是2?
) t0 T$ F1 p# Gcreate sequence myseq_ning1
; B* q$ d/ Q, X6 c0 _& Sstart with 10002 S3 N4 m1 l% |9 W% C q
increment by 2;( n- h( P: j- N t
+ s. S2 h c+ n* dinsert into student_ning76 _! d" J5 h6 J$ ?+ E
values(myseq_ning1.nextval, 'song', null);
% Q: W# h* I: C% ^5 I/ R+ W
8 t2 p. S9 B# O- t--删除序列,对曾经产生过的数据没有任何影响。, H+ V2 I' b7 m1 m7 d% `
drop sequence myseq_ning1;
1 G: p6 h5 w7 i- S$ ]6 [- g2 s1 z# y% V
SQL> edit
) z# A6 ^) O: z+ z( e8 X
0 ~2 }: _3 f# S4 x% I/ |( r5 P ? |
|