|
该用户从未签到
|
复习:SQL语句
% _, P# o9 D! I. b! Gselect( q" w0 c/ \+ g3 m' c) M
DML: insert / update / delete- C# O2 a' S& X1 o: B: e, d
5 e- j& _6 m, b! p6 Y3 uCRUD4 r: R5 w! B1 o0 p
C:Create! N& o! Y9 N: a& ?$ r2 M' K
R: Retrive- }, U/ I. o: ]) m4 a; r t& x
U: Update
/ F! u! \# V5 dD: Delete
/ a. D& O- G6 g4 V: r6 j' y1 M6 n& Y( M0 H- {6 G
DDL: create / drop / truncate / alter
, j+ {8 E! V/ B9 g7 A( f/ [* Q1 \( r+ `6 R/ t
TCL: commit / rollback / savepoint0 N' n& c+ D. ?2 q! a' [- U
8 s* g p- I4 g- ?4 G* U: b$ tDCL: grant / revoke
' M; j" W$ L' I K( b+ K" w6 y* e7 t) f) l) J
grant: 赋予权限. y3 W" L' w# @8 `5 o. M7 I) g
revoke: 剥夺权限% f( `% j9 L6 f6 G4 z: M+ W' M, t
数据库中的用户: openlab hr scott
$ i. w" ^# P! w- R4 { emp
# H+ n5 a5 m) N+ v, f* |
k3 C, `; a- W# b; c. w9 N( N+ D) S. g假设现在的用户是openlab1 N- B! T# n) X8 I9 L8 |9 \' f' d
SQL>grant select on emp to scott;& I4 b5 J8 y0 {. \
SQL>revoke select on emp from scott;
0 y, P& G8 h: r' z; K: u& N0 b/ M) u% g1 j' C! ~# ? L
scott的会话:
) c1 W9 d$ M1 @6 A' \- O! J* Q0 p& jSQL>select * from openlab.emp;
( B) V, B7 u; \: ^5 b6 i; E; DSQL>select * from emp;" z3 o5 n7 V# D( J5 h! n
* i: O! m4 h; o
; A0 r. i% r/ u% X) j
Oracle数据库的用户:
5 ~1 r' i5 c3 x) Ysys+ g2 ~$ h5 Y5 ~- f8 {
system
* k& Q* h: g2 J! G C% L
B# ~" u4 M# m5 r- Uscott/tiger0 N, t9 k& i1 {) W
openlab/open123
7 i9 Z t7 x5 x. x8 a5 ~ninglj/******
2 ~! T3 u+ F5 H3 X- H) X2 Iexam/exam123. X4 l6 [2 I p; k- d# @$ Q$ p, W
; Q6 `% _4 [6 G( M
C:>sqlplus scott/tiger@192.168.0.26:1521/tarena& w, N9 X( i3 n8 E6 _: t
SQL>
6 w0 T( S0 E% ^ f! l% X: \! v2 p- H8 M ~
- j% G" q; a; C3 t! v4 [' E4 Y今天的内容:2 {3 m1 I/ E) G) U* W* `- i
1、约束条件
2 E! y) f6 u8 W- F- f' C2、数据库的其他对象
& X8 c: Q3 b3 X+ i! s7 `. K1 m/ o( |7 K& B. ?
一、约束条件 Constraint/ L: `) W1 W# n& ^6 |, P) s, O
1。主键约束:Primary key, 简称PK- @% a, h6 E) V3 S) i
--建表时增加主键约束条件
8 M- V$ T- g4 Lcreate table dept_ning1(
, K. n/ L' X* K) zdeptno number(2) primary key, --列级约束条件, ?1 h$ ?, l/ w0 T/ U* u4 k0 t
dname varchar2(20),; Q0 w- N; W/ \
location varchar2(40)
' U" ^( t. p7 j! @5 q$ G);- j* p5 ?2 ^. S- h. W3 L Y
insert into dept_ning1
' S4 B, ^) ?4 l: J8 ^2 X6 zvalues(10,'developer','beijing');: F- ]% X/ R& K* m
insert into dept_ning1 e( V: @+ ?7 o7 L' E S
values(10,'market','shenzhen');( j- a- k8 Q8 W$ F r3 Y
--如果插入重复编码,会提示:0 f) R9 `* @" C
ORA-00001: unique constraint (NINGLJ.SYS_C00634053) violated6 P9 l9 Q, \( r$ h- s
其中,SYS_C00634053是数据库自定义的主键名7 D. \$ k4 j4 m0 g# ]
--约束条件如果没有显式命名,
) ~" E& b% k; z1 D; _2 {数据库给约束条件命名:SYS_C*****
$ ] Q3 ?1 f- b; G( x
6 i# E; e6 w' U--在建表时自定义约束条件名
. N% `7 F" S! K8 n# P) V8 ?6 \--建议命名规则:表名_列名_约束条件的类型
i8 B, l3 p; u; e8 T8 f- Ecreate table dept_ning2(
- B5 C0 H/ c D' ^; xdeptno number(2),& @ ^ F- H" [
dname varchar2(20),4 H$ Z7 V- g4 k) d, S! g
location varchar2(40),
& ?# v! I$ C ^& B+ cconstraint dept_ning2_deptno_pk
. S# ~# f5 d) I5 Z o+ Dprimary key (deptno) --表级约束条件) E% l/ y% W! O0 s' o
);
1 T( V; I, @/ e# H9 ^/ t3 L--当插入重复编码时,会提示具体的约束条件名字错误。2 c# |' L6 J& ~! @
--方便定位出错的原因$ |3 f8 r$ o. L+ t8 w
) [- @$ L" o& S; N
主键约束:primary key = 不能重复 + 不能为空
! U; }, w: b4 X7 e2 \( g7 |8 c8 ?) S: {
2、非空约束: not null,简称NN! |3 I0 \ Q7 C- t: `
学生姓名必须提供,但是可以重复4 U" K; I3 {+ k
--只能定义在列级! d- _5 n$ |, P6 y( h; u7 [% j
create table student_ning(* @3 v7 T. v- X
id number(4) primary key,
& O( ]6 Q. F1 j9 D+ Mname varchar2(10) not null,' i; A, V9 K7 h: H/ s4 d/ A$ b
age number(2)
( p1 W! ~8 z; k9 k8 w);
7 f5 {& x$ C, \. ~. ?4 X+ Oinsert into student_ning
2 G0 j" Q2 Z) O- Q4 n1 S6 Pvalues(1, 'zhangwei', 20);" f5 \ E) e) W7 @0 z9 @
--名字可以重复2 U+ D" W/ z8 ?6 y3 R
insert into student_ning 4 i/ O" H0 M! n+ g
values(2, 'zhangwei', 19);
( }! u. H. V4 T% H--提示name列不能为NULL
# u$ i8 P- I& X8 a8 Hinsert into student_ning 8 R4 d' ]/ z. o. |" V
values(3, null, 18);" B2 t) _& j: t( z
* e, R& u' Q. c3 }3、唯一约束:Unique,简称UK j+ \. S4 X0 d7 t" @9 {
create table student_ning1(2 R) n: c# g, I3 p. [$ c# Q
id number(4) primary key,0 @; r& s% C- Z$ Z9 E" J
name varchar2(10) not null,
0 g2 W" ~8 W& O' F; b5 Aemail varchar2(30) unique,( M. ?4 Z$ s W. L
age number(2)
9 J6 O. `! I6 g4 }$ f4 F2 X6 [: n);0 e+ M% ]8 J' E3 n7 I& I' s* q# U- o) I7 y
insert into student_ning1 ! [3 F3 K2 P) M
values(1,'amy','amy@doctor.com', 19);: b' s8 `# K0 {+ p6 F2 g2 d- F
--ORA-00001: 唯一约束条件被违反
! n1 a& m# l6 h8 X4 r! pinsert into student_ning1
) g1 o2 Q5 G5 e) H- Ovalues(2,'rory','amy@doctor.com', 19);
: B/ O0 k4 M( W6 H5 m$ L, x7 v* S/ G; V/ }* `: ?8 F4 b
--唯一约束建立在表级
& T- k) N) ], e' ~# u; k6 z--主键约束建立在表级0 g5 C, D2 n0 u7 C5 u" ^
create table student_ning2(
) T* @; i- |* \5 S( C* H, Q( x4 d0 @id number(4),/ ]) Z0 \3 ]8 c6 ]/ Z) f
name varchar2(10) not null," G9 b( X+ B$ `6 ^
email varchar2(30),
/ u" C) i/ | y6 \/ @6 e. ^age number(2),$ a% v1 H8 a6 x" u8 f( c
constraint student_ning2_id_pk
- [& m, T2 J/ N* J$ j+ l. `primary key (id),* J4 r8 p' Y4 v$ ]: ]3 v& G
constraint student_ning2_email_uk% A- \( |) [ x! Y! u# C
unique (email)1 Z" m$ {( l3 }* O4 T2 f
);8 M7 X+ Y1 Y' H3 @6 R7 Z% r) [: I2 t) g
0 U" h5 w) Q' F# `: M! j
insert into student_ning2' ^. h6 \/ Q+ y3 |# }
values(1,'amy','amy@doctor.com',19);2 h4 ^% N! m; E1 e2 h: |+ U
' `* O5 }: R4 g% X4 V O
--unique约束只要求不能重复,可以为NULL! {. ^2 z/ i; F& N
insert into student_ning2
2 g$ s# u& E& y# H0 P0 P# @values(2, 'rory', null, 20);
3 H& e7 `/ f% x6 K% T" m% v. T/ F3 x, W
--不管是insert还是update,email都不能重复。
; F/ w$ N# X2 P+ T, C2 D$ E Vupdate student_ning2 set email = 'amy@doctor.com'
9 q. w8 D! I1 x4 d& m1 {where id = 2;
; U$ d% [, p; W
8 U, r' ]8 W% t! R. }. w/ W6 h1 M4、检查约束 check 简称 CK2 i ~1 m- a+ ~" v6 p/ S& c# t5 d2 t
create table student_ning3(. ?5 S3 U/ C1 S) Z* G! z5 H" j0 G
id number(4),# A+ c o' R7 i P! a3 T7 @
name varchar2(10) not null,) ]: Z7 C( l4 ~) N0 b
email varchar2(30),
- y7 H9 I! b1 G/ J' p$ |age number(2),
$ q+ B& S* S% G$ cgender char(1), --'F':女生; 'M':男生
; y! x6 e6 S$ g* I* s) k! fconstraint student_ning3_id_pk
- D) O/ ~4 W& y) aprimary key (id),) C7 B! J; ]' R. p+ f- d: n7 G8 }
constraint student_ning3_email_uk
9 V! v: F! R% t9 Q) J9 y0 Junique (email),
6 F$ t8 N7 N" \. N' Econstraint student_ning3_age_ck
" u2 O' o& H/ R& Ycheck (age > 10),( s$ w5 N3 K& S) R! f q
constraint student_ning3_gender_ck, @ q. ^) {, E$ B M7 C! L
check (gender in ('F', 'M', 'f', 'm'))2 t3 u, O8 g9 f/ |0 e6 V' W
);
+ V N4 c5 J) x6 v& J$ tinsert into student_ning3
" e8 m& ] @' I! e% t# f$ w9 Mvalues(1,'amy',null,19,'F');5 O s) d7 \1 k* T7 d$ e2 C# `7 Q! P
insert into student_ning31 }$ Q G" b5 X8 X' t4 | P
values(2,'rory',null,8,'M'); --违反check约束 age > 106 K0 `. u' d& f3 x3 R% b% x6 S
insert into student_ning3 % f. V+ e- i! E& |- U+ S p
values(3,'doctor',null,50,'A'); --违反check约束 gender in ('F','M')" |) f3 Q# L# f( C' J. A
/ K+ y* _+ P" m( X
PK / NN / UK / CK / FK
" M0 k3 G( x% t5 q0 t# ~2 s, {9 s3 A$ G% g
5.外键. Foreign key, 简称FK
% F( H$ C* Q/ U0 N8 E! q8 T& {# b0 ccreate table major_ning (
! W4 P j1 F6 r9 b6 gid number(2) primary key, ( \2 ^2 ]) P9 c e
name char(20)
& j Y$ W1 L8 d' ?6 s: M5 q);
% [1 C1 P( e/ f; T0 {; Sinsert into major_ning values(1, 'computer');3 U: J0 Z% S% z/ W8 l, h
insert into major_ning values(2, 'history');# w, ]. v' i/ p* p
insert into major_ning values(3, 'music');% R. ^# x6 q% u( U) l# A' n( G) o
insert into major_ning values(4, 'sing');, B; Q: ~8 E# I# f6 B* G
commit;
0 X# w! p: a, M7 D0 I. `- Bcreate table student_ning4(' r6 q+ F1 e* R7 S( `4 Y1 W1 d, U: k
sid number(3),
" T+ F8 I# p, w- e- {0 mname varchar2(20) not null,
5 E# ~/ j% t9 ~- T- ^/ Qemail varchar2(30),
- A$ [: J% q% m% \gender char(1),0 l% I! S6 X& r" [: _/ C& o
majorid number(2),% R1 b! s4 o% c, w/ w
constraint stu_n4_sid_pk primary key(sid),$ d9 M9 ~- h3 F( q1 b
constraint stu_n4_email_uk unique (email),
( Y) l/ a4 O9 D& m y2 h) Uconstraint stu_n4_g_ck check (gender in ('F','M')),
; e6 U+ r- {. r. O/ }. u" mconstraint stu_n4_mid_fk foreign key : p. X1 f$ a0 s9 l
(majorid) references major_ning(id)# ]) _7 I L) S# x8 |* ?* J
);
$ L6 J5 A+ c+ ]" y% d$ C6 Y/ o( ` {: ~; g
insert into student_ning46 N, F6 M7 J5 _. K' e9 B' J$ N
values(101,'amy',null,'F',1);
' M) B5 Y7 a1 I4 f--新增数据,不存在9这个专业
1 v5 m7 V4 s: c/ n# f4 _insert into student_ning4# n6 W4 s$ N1 o
values(102,'river',
5 W) B2 t* [: ?4 L+ y& r; |'river@sina.com','F', 9);- j1 V% Y( C1 s! w" o J
--提示错误:
8 g3 {. D8 P GORA-02291: integrity constraint (NINGLJ.STU_N4_MID_FK)
3 O+ b: }1 n8 S1 t0 I$ x violated - parent key not found
0 m0 K& V, h% W3 T) I2 F/ Cinsert into student_ning46 [5 O0 B# }+ Z9 ?; c2 Z
values(102,'river',
( _- I/ ]1 @2 E& E0 t+ V' n9 C'river@sina.com','F', null);
0 z9 R6 x7 G% S2 D! p8 G' A
2 q+ \6 c" e2 _8 _6 S9 F5 {--有学生属于专业1(computer)
& U0 ]. {0 k; a a/ R2 J7 W Ldelete from major_ning where id = 1;
, T' m, s( C9 b8 E/ E--ORA-02292: child record found- n) P8 @' y8 c, y" t- U# p3 ^' H
4 |- h* }7 n, h) @6 L; }create table student_ning5(3 N4 F8 T$ p, Y. P5 ~. w+ B
sid number(3),0 m$ I& u+ | S
name varchar2(20) not null,% i9 V1 j" Z1 s1 \
email varchar2(30),
/ |3 L' i/ F7 K+ lgender char(1),
; M7 P; D& j1 w) J5 amajorid number(2),
! f" x9 U" S" t% X5 G$ P* Sconstraint stu_n5_sid_pk primary key(sid),
% [$ Z: \1 X3 Econstraint stu_n5_email_uk unique (email),
* C( Y5 _! W6 B: c3 B- V/ Rconstraint stu_n5_g_ck check (gender in ('F','M')),
# P1 w5 x0 O: Lconstraint stu_n5_mid_fk foreign key 1 l# U" p( r& s2 N c4 h" Z7 o: I% E
(majorid) references major_ning(id)
: |/ q* w4 i7 a. n6 {0 \2 l7 D on delete set null);
$ N+ g* @( _* E$ q1 ~6 k6 s
1 D: I |+ ` N7 G& binsert into student_ning5( _& a& R$ ?/ a6 T
values(101,'amy',null,'F',4); --amy是4专业的学生
# w. v& _2 k$ x3 s--删除编码为4的专业
2 M$ ]8 ^0 h3 t$ [, c" O+ N/ Z$ }delete from major_ning where id = 4;
( ]5 [- ]/ s8 y/ ]5 ?# g2 g--amy的专业被设置为NULL5 _; o+ J; |8 x4 l% O1 [" k
select * from student_ning5; 0 R; y: l: `! R+ Y! s7 @
; T; N4 R0 C" t6 |" screate table student_ning6(1 r/ }- g8 g/ l2 H; h5 v2 V
sid number(3),! v, u& g$ H! r+ X
name varchar2(20) not null,
& ^) K2 J: j# v% {$ r: [email varchar2(30),
5 }- ~) C$ }5 Z) ]5 t( t' jgender char(1),
5 a, l' d7 w8 A- D, X% ]majorid number(2),
, F- x+ s5 ^" D8 Y& Y) hconstraint stu_n6_sid_pk primary key(sid),
' Y8 v+ e8 H6 econstraint stu_n6_email_uk unique (email),
8 ]8 [/ c2 q4 U2 Vconstraint stu_n6_g_ck check (gender in ('F','M')),
5 P% m O8 G5 l9 hconstraint stu_n6_mid_fk foreign key 7 @3 H) m0 O6 k; k
(majorid) references major_ning(id)) m" u- ], J2 q. ^3 Z G: Y6 _9 n, q
on delete cascade);
! h; D W U/ }
6 B+ \! m$ B6 r+ q( v--复制表,不复制约束条件。
/ k. X2 W/ A# ^$ x& Q. Vcreate table 表名 as 查询语句
* ` e7 \- R. B& k4 J! _) T# Q
, g# Q+ l& P& a$ H2 I--建立约束条件的时机
% ~( L. E* B0 D8 W--建表同时建立约束条件:
* h) V* i8 n8 ~! ^0 acreate table student(
) a M0 X/ P+ t" _9 Yid number(3),
: p0 i6 l* ]4 j% }8 `name char(20) not null,
* _3 O4 c E" l4 D* Lmajorid number(2),
. B- t4 {# q7 T+ l+ R3 q. y1 kconstraint stu_id_pk primary key(id),
: d1 U! f; l, N* w a4 [9 Aconstraint stu_mid_fk foreign key(majorid)2 r1 _& e, x# |- N
references major(id)$ o# D% r! F6 B' T" S4 Q
);
6 ~! F# J1 _: Y' E* ]$ ?: I' c--在创建完表以后创建约束. s1 m- ^9 l' R2 J1 J$ y: f1 h
create table student(
5 D9 B, Q% ^5 _id number(3),
+ z) A, c4 V. ~% c; Pname char(20) not null,
0 l' Q( \2 y+ ?. G5 [ Vmajorid number(2));
% J9 \6 D6 _: i E: \alter table student8 ~" A6 G# V! t4 o' u
add constraint stu_id_pk primary key(id);
* Q" \$ A5 P4 o0 oalter table student
% d ^7 |7 ]' M/ |: x add constraint stu_mid_fk foreign key(majorid)0 k! P, j( N! w; N' p5 A. ^
references major(id);
0 \& l0 `3 {) Y# Y6 `3 ?! [/ Y- H
3 \' H4 W: j2 u/ u' t" W-----------脚本文件begin---------
8 o3 N" C+ q* h8 A$ z2 Falter table student drop constraint stu_mid_fk;2 c! b( ~- d [7 Y! o3 [9 J' h
drop table student;
1 |) n' t9 _+ I4 q7 E9 zdrop table major;, Z: A* w1 \" x* }$ j
create table major(....);
/ H- [$ W: u, m4 K7 N. Hcreate table student(....);
k; [& N5 a$ A' xalter table student add constraint ....: F8 `. l& T9 r/ n+ C4 ~! C
-----------脚本文件end------------
4 Z, K( r9 Z! ^& T7 f( Y9 e# n' x# W( f/ {' t
user_tables :用户所有的数据表$ U n. M7 s4 L! y! L _# I7 N
user_constraints:用户所有的约束条件2 \! S. T: e, t. S
user_objects :用户所有的对象(表、视图、索引...)
( E( f: u) V/ `' Y
( G X6 {6 {+ p7 ball_tables :用户能访问的数据表,
) `! x6 D9 _! F+ C; _* v- c0 q0 k 包括自己的和别的用户允许自己访问的
5 O0 Y) c/ u: g k: W# B. aall_constraints:用户能访问的约束条件 r3 m9 j/ x, \0 s
all_objects :用户能访问的对象(表、视图、索引...). w$ g# O8 v% @
) J; p; ~+ M* I9 a0 Y9 ]PK / FK
$ Q$ l5 i% y8 ]+ u' o' ^7 XNOT NULL / UNIQUE
4 E$ J6 c r3 X/ m3 T9 B( mCHECK; W! K. T" [1 p, d
其中:CHECK和NOT NULL可以在程序级别控制
$ D1 e6 ~1 A" y# G0 L) R9 F
0 Y5 C4 j/ C% b/ ]$ U$ _+ n二、数据库的其他对象. M p, p! m5 i. [ n( Q l% l) T8 L
表 Table: T) p5 B! w) P1 p& a( e7 R
视图 View4 J9 e% `7 z+ F6 f' ]7 V
索引 Index
# P+ q! g* J3 n( z序列 Sequence
* Q p" W2 i" X' c' P3 x过程 Procedure
7 l8 P; ]4 ?- i8 P! s8 `函数 Function
. n. @3 y$ L1 \4 s; i& l% k! r包 Package \8 }/ L+ ~ n( [
触发器 Trigger' {* U; h+ G! V9 J$ ]7 T3 z; C: `6 o& P
同义词 Synonym& d/ {' x r) w6 m/ p9 C
.... |* A& V- i0 P7 J
+ Y. Y! F& n, o6 ?& G: {' e% M5 Y E1.视图View
' s8 l% [( q' B- R% Jcreate view v_emp_ning
. h3 T) y2 f5 z) U8 G8 Nas! t8 y2 \) B& A! q# B7 G' p
select empno, ename, job from emp_ning
$ }: F1 a; r# M! S) [- Xwhere deptno = 20;4 w n: t! S& S8 F }5 i
--使用和表相同) R# S) ?6 V% m
desc v_emp_ning
; h& R! s6 e) u @6 [select * from v_emp_ning;. `" X1 I* \3 o6 n
--视图的好处:简化查询;隐藏数据表的列
5 `. e$ }6 ]3 W/ O4 |% Z a& m; S
7 F7 H: ]1 g b: l: N, I5 Ccreate view v_emp_count7 p' u8 I: {: G
as
: M- Y: Y$ m% O! p0 oselect deptno, count(*) emp_num1 N0 ?2 w8 i9 v$ \
from emp_ning
$ R8 }$ B5 S' egroup by deptno;; }' n* L7 X4 T2 R; |4 i
--修改基表数据7 P& W) X" l- m9 H
update emp_ning set deptno = 10% G7 [2 Q1 [* z. A; @2 L, H
where deptno is null;
5 \( y1 h3 ]1 [" p" Z4 f) f7 W$ Q3 H--视图查询到的是修改后的数据。6 q1 k2 C+ `3 z) l0 k6 Y" {
--视图不包含任何数据。是基表数据的投影。
' R) G$ t% v; d; {- Y3 P% Lselect * from v_emp_count;! H% f4 p8 H y% M! E. w) a5 v; b
6 t7 |4 t' e1 x--创建或修改视图; C; m) I3 d+ a3 c
create or replace view v_emp_count* _1 R1 G$ @' b5 _( P
as1 x2 p, I" y; Y6 J( L/ t# h
select deptno, count(*) emp_num, z% T+ w8 t; Z; V1 c0 M0 ~
sum(salary) sum_s,
0 i' p- e$ K) j9 R V5 Ravg(nvl(salary,0)) avg_s,. ]' F; ?5 U0 @$ g
max(salary) max_s,
- d9 z' Z m( A8 c5 E7 Smin(salary) min_s; c6 l7 _6 F0 \% e
from emp_ning
2 z7 V; F& s5 i) Y; tgroup by deptno;0 i8 q0 k' o: A" p; q- l; w/ M. g. Y
* l7 v+ N0 m4 G7 B- S3 t
--查询视图的定义4 a5 x) z: X: W0 D( z
select text from user_views6 Q# d1 C8 {( ^2 A4 A
where view_name = 'V_EMP_COUNT';$ d: d/ h a l
--如果视图对应的sql语句显示不全- }6 B" O s- y
set long 1000
1 g- u( q5 r7 G& E- c* f) g1 A
7 F( D" | T w* F" s2.索引 Index :用来提高查询效率的机制。
9 {/ t& u: A1 b9 a全表扫描: Full Table Scan: 查询效率极低
0 [3 B5 I3 j" ^; c# ^5 X9 v+ t/ E索引查询:比全表扫描快。6 A: {0 n$ C* s" S% r
. @0 X4 |9 U& d索引的结构:数据 + 地址
& y3 n1 ^/ X3 g$ E9 A* p, A9 ~ 张三 + Room203
) n6 x' l$ ~% e" C2 T3 a/ z- _7 Y1 y+ ^
对于数据变更频繁(DML操作频繁)的表,+ @2 O. Z) [1 [+ K
索引会影响性能。
- B' l4 h6 n J7 c! M" v$ @
7 J. C# {, } K' S如果数据表有PK/Unique两种约束,索引自动创建
+ C; s0 e8 B0 G8 @9 P4 I9 P除此以外,索引必须手动创建。
4 W k9 [) @% [create table student_ning7(7 [, L& f. g$ G7 c" a. f* P: V7 |
id number(4),2 a8 q; K2 s: O( K
name char(20),
7 W2 x: P* _' U. Q% c! g4 nemail char(40),
8 R0 |6 I' m; h, W8 N' \$ r7 Mconstraint stu_n7_id_pk primary key(id),
# i% t" l9 |3 G* s( D! F0 a1 Gconstraint stu_n7_email_uk unique(email)9 u! F) F. T& Y- W
);
Q( Z7 V$ o* V3 ]+ }select constraint_name " z- l$ x0 C/ v2 p0 L/ z' ^% I
from user_constraints( D, X2 {' A0 t, w/ y
where table_name = 'STUDENT_NING7';0 Y! O# y, H) O/ V" s
, G7 I$ a+ r$ j--查询student_ning7表上的索引,
; @) C1 k! h( ]" {" d, F& J和主键/唯一约束条件同名,数据库自动创建的索引。$ Y' R: ]' x ]# w2 T
select index_name from user_indexes
! t1 d, [# i* ~& E+ o' Y: Zwhere table_name = 'STUDENT_NING7';
6 }8 a" F2 a0 L- X$ j
$ J8 X0 _. ]0 r* r+ I--凡是id或email上的查询,会使用索引
4 Z- l# j0 A+ s, J7 kselect * from student_ning7
* i9 z2 m" O" F4 R4 b- xwhere id = 1001;+ x1 j4 L0 T& Z! _: L
5 {0 p" ]2 P; I# C# V--这种查询用不到索引:全表扫描
# V! |2 J# V8 mselect * from student_ning76 D5 X0 _# \/ R7 D; O
where name = 'zhangsan';5 o4 i$ I9 N" l8 X3 `
: j. ]- K( Q p! z* U4 Z2 } t, X- b- F
--创建基于名字字段的索引,索引名自定义/ N6 z0 m. _/ D( q/ M2 n+ p
create index 索引名 on 表名(列名);
" l" r* |) L7 g% r5 g: n( Screate index idx_stu7_name
5 t) D1 d3 t% |5 z: qon student_ning7(name);7 H( N1 g# [6 v+ ^% ]
8 j, }: ?% W" y6 c" M. {
索引:3 V( M1 A* y; P0 t6 Q `
1)了解索引的工作原理/ X! Z# l. K! O y
2)pk/uk自动创建索引* f; B2 I' @' N4 D9 b; q
3)根据查询情况决定手动创建哪些索引。
. n& d* A8 J& G+ H7 Q) K. s$ W0 j
$ D K9 W5 H" ~' k- m: O$ W
" \/ y4 ^ D' U8 ^7 j( w3、序列 Sequence --Oracle独有的+ I8 Q% Z! |8 B3 U7 y! v8 n! \
--产生从1开始的数字值,步进是19 P. K& y) E$ F: j; n9 D
create sequence myseq_ning;- O: s6 e; ~: E/ J/ w
select myseq_ning.nextval from dual;# D, p7 t. s$ z. ?
0 m8 N- h1 O% e. e& k9 j8 q& h) l
序列的特性:产生连续的不同的数字值
/ R# E) _* Y- h0 J2 z$ Y5 i用来作为数据表的主键。" V8 E/ y: q* r. T! Q
/ R1 S* R" w& @9 q6 N3 w
--使用序列产生的值作为表的主键值% P! v9 w8 b8 z( R' v: F4 o/ f
insert into student_ning7(id,name)9 q+ d7 i A5 m" e2 y( _
values(myseq_ning.nextval, 'amy');
* y4 }; Y; A% ^6 c8 X4 |/ T ]5 W3 u- X, h) i$ g
student_ning7和序列myseq_ning的关系:
% z: U9 z! Y# t! \3 G( R a是数据库中的独立对象
7 K3 H G) x: ~* k, ?" b1 l$ g% f--表可以用序列产生的值作为主键,也可以不用
! a% C; h8 a+ e; K0 [--序列可以为一个或多个表产生主键,也可以不用, E0 [5 o! E& H9 y% ~/ K5 X
insert into student_ning7(id,name)
2 M* M: r5 s8 W% G2 Dvalues(100,'river');
0 g a" K7 l! Y" L/ f& }0 Xinsert into dept_ning
: L/ L* O7 z% [) u) fvalues(myseq_ning.nextval,'market','bj');
1 H T# O/ |( g2 |+ z6 N6 q1 B7 P) u" ? J" i
--建议:一个序列为一个表产生主键
, Z& p* R" L& l/ O; {# k9 @, m" _
9 ~4 _7 z* V9 @( f. l希望主键值从1000开始,步进是2?) U' ?: S5 W. d8 s- {
create sequence myseq_ning1
& R! v8 j# r1 Z. p) p* gstart with 10007 c( O7 @$ k, R: C9 q+ g
increment by 2;
' N- H/ p; z w+ i# U; ]) ]0 j8 G8 W z) V% {2 N
insert into student_ning7
3 r1 v8 t* _( e( H) z9 Hvalues(myseq_ning1.nextval, 'song', null);
( `* ~* }& {. w0 Y. B- q& S3 r3 B2 A y
--删除序列,对曾经产生过的数据没有任何影响。
5 ]! f% A E2 N5 Udrop sequence myseq_ning1;
9 u- @) \6 j1 A% Q, g0 |9 Y
8 d& ~) s4 n% H1 WSQL> edit
" v. V3 E3 u/ ?& E v: f' i$ X2 Z# |" C- i
|
|