a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 144|回复: 1

[考试辅导] 应用技术:关于Oracle数据库表与视图

[复制链接]
发表于 2012-8-4 14:06:19 | 显示全部楼层 |阅读模式
表和视图
- [; p# v: c# u9 J! d4 i+ C
- e% p# B0 m; ]3 o  Oracle中表是数据存储的基本结构。ORACLE8引入了分区表和对象表,ORACLE8i引入了临时表,使表的功能更强大。视图是一个或多个表中数据的逻辑表达式。本文我们将讨论怎样创建和管理简单的表和视图。 5 Z9 e; A0 x' [. {  ^$ T6 c

' O- z5 c- R5 s5 P; \  管理表 4 b1 [5 g* m, l, Q. s$ Y3 _5 @5 d

) u2 Y$ b, `2 j) g$ d  表可以看作有行和列的电子数据表,表是关系数据库中一种拥有数据的结构。用CREATE TABLE语句建立表,在建立表的同时,必须定义表名,列,以及列的数据类型和大小。例如: 2 T0 U# h, _6 B' [6 ]' N

9 h& y1 K: y3 ^. ?1 [. Z$ ^CREATE TABLE products ' _. g8 }+ h6 U9 V* ?
  ( PROD_ID NUMBER(4), $ T1 v: a: l! \2 r. x0 x) l3 Q
   PROD_NAME VAECHAR2(20), " i( e, i5 Z/ T) ?2 x/ L, r" J
   STOCK_QTY NUMBER(5,3)
% F- h" }9 J  a7 E5 j  );
2 u9 e9 ~. G- Z( J/ z0 H5 Q
0 B# Y4 w! O9 t! B5 P  这样我们就建立了一个名为products的表, 关键词CREATE TABLE后紧跟的表名,然后定义了三列,同时规定了列的数据类型和大小。
" }( Q5 |7 [/ e) H: t! w8 U& ?! u6 {$ o4 H
  在创建表的同时你可以规定表的完整性约束,也可以规定列的完整性约束,在列上普通的约束是NOT NULL,关于约束的讨论我们在以后进行。 # ?3 |1 k* M. h3 V" P/ R

5 _' ~7 g( M( q" E1 I  在建立或更改表时,可以给表一个缺省值。缺省值是在增加行时,增加的数据行中某一项值为null时,oracle即认为该值为缺省值。
* S/ _; u, H7 z  m- W* n  ^6 C
0 ^* R/ F  x* I4 ~, Z6 t+ |  下列数据字典视图提供表和表的列的信息: / G$ ~. O0 D. _6 B
/ x! v9 j$ C; o* j, d
   . DBA_TABLES ! J0 M& U) C+ h/ y  z& N* s
   . DBA_ALL_TABLES ) r$ t% T- O, Q- @+ i- X7 L
   . USER_TABLES
1 ?" P/ Q2 O  y  j6 H% r' ]   . USER_ALL_TABLES # E6 J3 ]3 u, b6 I8 F0 A1 x7 w
   . ALL_TABLES
  u+ `  w1 S  w5 r$ ~   . ALL_ALL_TABLES 9 l  }' J, B$ f# o$ x6 r/ c7 M
   . DBA_TAB_COLUMNS
2 F# ]3 |! y3 n4 E2 N   . USER_TAB_COLUMNS ' `* E  y$ p" f6 B! V
   . ALL_TAB_COLUMNS 3 b6 k  U4 Z% [3 y6 H: \

* f: g3 v$ B  G, L* L& o6 Q+ S3 t  表的命名规则 , V# s; O: n( K0 _$ o

5 J! T- P" m* q* N  表名标识一个表,所以应尽可能在表名中描述表,oracle中表名或列名最长可以达30个字符串。表名应该以字母开始,可以在表名中包含数字、下划线、#、$等。 " @& {1 G% b* F0 R5 q, Y% p

! ?. m8 O6 \  J% d/ U4 C  从其它表中建立表
, R1 d% T% |1 P0 N$ J$ S- z; Z* i0 C4 r2 l4 f6 V; y. d- G9 q
  可以使用查询从基于一个或多个表中建立表,表的列的数据类型和大小有查询结果决定。建立这种形式的表的查询可以选择其他表中所有的列或者只选择部分列。在CREATE TABLE语句中使用关键字AS,例如: # ^& t: k7 @  K0 g+ F

5 v9 C, n! K* z$ K- t- c1 X4 |( V; RSQL>CREATE TABLE emp AS SELECT * FROM employee
! g- S- R7 I% i+ t, L* s9 z! \8 ^. |. s, M
TABLE CREATED
2 R# p% J7 o+ r/ o" P$ M  i& Z$ e" b
" N; q+ W1 s# t2 ], MSQL> CREATE TABLE Y AS SELECT * FROM X WHERE no=2
: d9 d! G# X9 q9 M' v  f* j, L9 T9 B, e% t$ m* f
  需要注意的是如果查询涉及LONG数据类型,那么CREATE TABLE....AS SELECT....将不会工作。
! U/ n6 z( j# K/ \( ]0 \8 b$ g  R8 q
  更改表定义 0 F$ R* @. g+ L  c) Q2 Z

1 w; j- Y1 }3 P  在建立表后,有时候我们可能需要修改表,比如更改列的定义,更改缺省值,增加新列,删除列等等。ORACLE使用ALTER TABLE语句来更改表的定义
  u: i, n7 K. A
  I, s, F6 \8 }0 d  1、增加列
# J, T* X$ [4 L7 {/ X3 M" b, O' p  x! g. L
  语法: $ p7 D6 ?/ m, U9 ]# v
/ U' ?& G( m5 D5 @
ALTER TABLE [schema.] table_name ADD column_definition
( E/ e5 I7 J# R3 ~2 Y3 C- m+ T4 J3 u1 g+ i# t% m; ^; m
  例:
7 c( z. m: F' I$ g/ e$ T; ~5 Y3 t" W  ?4 ?
ALTER TABLE orders ADD order_date DATE; 1 @; x+ `0 n/ I; d

1 @# k! `( q# ]) _% {  x  P  \4 T; aTABLE ALTER " U! a( s1 p* D2 j

& `0 ^* a8 O- R* X- x  对于已经存在的数据行,新列的值将是NULL.
* \2 v2 b" A6 y  2、更改列
3 r# `0 J$ ]$ I; d( ?) N8 b! V/ L7 v+ e+ F+ L0 s" P, O
  语法: 5 @, u3 u2 Q+ k) X1 f

3 k7 `! I7 i+ S4 e5 MALTER TABLE [schema.] table_name MODIFY column_name new_attributes; 2 y4 F/ \2 |% J- {* z: F3 z
2 ^" p$ A* c9 y9 Q8 _- U1 t* A& o
  例: / d' B9 |- A4 v8 E3 O

0 Y% c: p9 d& o* N" ?3 z. d: X/ aALTER TABLE orders MODITY (quantity number(10,3),status varchar2(15));
% C" e: S/ o. @2 ?( x( O: r" G0 V, ^, |0 |! k4 ]
  这个例子中我们修改了表orders,将STATUS列的长度增加到15,将QUANTITY列减小到10,3;
% M7 c: L! I9 G. L; d3 E
# B( J# o4 s# s6 R% n0 F% t  修改列的规则如下:
& S1 O& X0 t: ^' u1 N! _) H- \9 C0 i  r: g! B8 t6 f
   . 可以增加字符串数据类型的列的长度,数字数据类型列的精度。 / u) B3 E! t/ d3 M: I1 y
2 `' F; r" k* N0 E, K2 @8 P9 }
   . 减少列的长度时,该列应该不包含任何值,所有数据行都为NULL.   Z2 O# b7 b4 X$ e

3 O" l$ |& V8 |: J  a* g' a   . 改变数据类型时,该列的值必须是NULL.
5 B7 b5 d) Z# Y* M; S! c) U0 S
3 i2 Y, w' |. H! U( c% Q0 d   . 对于十进制数字,可以增加或减少但不能降低他的精度。
$ r4 Y3 v. \9 ]1 g) L7 v3 a% W6 x0 j7 \4 u1 a1 L
  3、删除数据列
8 ]9 s* t& o1 d, \# N) O
' T9 O" {. ~# Z- i  优化ORACLE数据库,唯一的方法是删除列,重新建立数据库。在ORACLE8i中有很多方法删除列,你可以删除未用数据列或者可以标示该列为未用数据列然后删除。 8 c) g! v  K) r6 h9 l/ }2 X# Y

3 ~$ U4 w5 u; T& A& V2 J  删除数据列的语法是: % b# X6 v8 w) I
; v+ I9 M0 k1 ?# z; U  E, m
ALTER TABLE [schema.] table_name DROP {COLUM column_names | (column_names)}[CASCADE CONSTRAINS] * u8 Z9 o1 r- t7 i* F: q; O9 g0 r% q4 O
; y- `: b2 Y5 e) M
  要注意的是在删除列时关于该列的索引和完整性约束也同时删除。注意关键字CASCADE CONSTRAINS,如果删除的列是多列约束的一部分,那么这个约束条件相对于其他列也同时删除。
& s' w  g1 E) T* L& u+ K1 \: a( G2 p- ]6 o$ u0 V7 }, {
  如果用户担心在大型数据库中删除列要花太多时间,可以先将他们标记为未用数据列,标记未用数据列的语法如下:   w5 @8 H. n  u2 A8 s

0 R0 @: ?# }' \1 r) w* }$ Q1 RALTER TABLE [schema.] table_name SET UNUSED {COLUM column_names | (column_names)}[CASCADE CONSTRAINS]
) R; F2 Z2 N, g% E5 @% Z- U# D4 t! @& k
  这个语句将一个或多个数据列标记为未用数据列,但并不删除数据列中的数据,也不释放占用的磁盘空间。但是,未用数据列在视图和数据字典中并不显示,并且该数据列的名称将被删除,新的数据列可以使用这个名称。基于该数据列的索引、约束,统计等都将被删除。
回复

使用道具 举报

 楼主| 发表于 2012-8-4 14:06:20 | 显示全部楼层

应用技术:关于Oracle数据库表与视图

  删除未用数据列的语句是: ; v6 d7 ^1 F8 j2 d8 b1 [  b
; U6 ^' n; {+ \! a) e$ n7 m9 W: O
ALTER TABLE [schema.] table_name DROP {UNUSED COLUM | COLUMN CONTINUE}
2 Y6 T5 e4 Y: A1 D% E+ B1 R* n
5 J6 C. o9 ]+ p! v" ]& L# L  k: [$ F删除表和更改表名 ( c* z& u& K% D# u4 R; `
! l/ V- p& E! F% U0 |4 D& u
  删除表非常简单,但它是一个不可逆转的行为。 " I2 ?- X4 D6 N9 t% V4 _$ V; w1 E

# X2 n5 Y1 c4 z8 D6 y, U: ?/ X+ |' G  语法:
3 W' `4 [+ T) l" A
# J; N/ F% M1 T8 DDROP TABLE [schema.] table_name [CASCADE CONSTRAINTS]
% t- ]# x: p, P5 R8 s   0 h. t- n3 L) q5 \8 B) `0 R/ X
  删除表后,表上的索引、触发器、权限、完整性约束也同时删除。ORACLE不能删除视图,或其他程序单元,但oracle将标示他们无效。如果删除的表涉及引用主键或唯一关键字的完整性约束时,那么DROP TABLE语句就必须包含CASCADE CONSTRAINTS子串。
5 q* y5 U, s! y3 g
! [) H  G! f% c+ k! L  更改表名 4 ^6 {$ H; |9 Z7 j5 S

% \; G: f8 S( n* q1 {  RENAME命令用于给表和其他数据库对象改名。ORACLE系统自动将基于旧表的完整性约束、索引、权限转移到新表中。ORACLE同时使所有基于旧表的数据库对象,比如视图、程序、函数等,为不合法。
$ o" e8 L& z- M7 E6 J& |3 q8 q: U8 Q, Q7 A* l
  语法:
5 w& S  R9 ?7 O
/ l2 j' y6 ^  \+ V0 J+ {RENAME old_name TO new_name;
/ l! U& Q  C5 v4 D. g0 J1 q( @; [9 R
  例: ( w( I% E+ ]7 h3 F( {/ r

0 y2 K, D2 p8 B* A8 J: R. YSQL> RENAME orders TO purchase_orders; : j& P& n; [- ]5 A/ X
  ?4 W+ k" J" B% k5 I1 G
TABLE RENAMED 7 e9 R$ F% c# {  C$ L

0 v6 S) i6 c+ p% e
7 C6 P* w5 r3 x  截短表
6 N' }1 q) B9 [! \/ u8 m% S
- N3 b" ]' W* m- o- f6 e  TRUNCATE命令与DROP命令相似, 但他不是删除整个数据表,所以索引、完整性约束、触发器、权限等都不会被删除。缺省情况下将释放部分表和视图空间,如果用户不希望释放表空间,TRUNCATE语句中要包含REUSE STORAGE子串。TRUNCATE命令语法如下:
, `1 t, d( o6 O' z, ], A- m0 ^- b- N) d  v
TRUNCATE {TABLE|CLUSTER} [schema.] name {DROP|REUSE STORAGE} # T2 T1 |7 p7 s/ e! H0 [6 t# u

: b8 O3 L, Q& E, ~" I. j  g  例:
5 q; O* |% W, }* L4 \( ~
2 J5 e$ l% v/ J0 c) u( eSQL> TRUNCATE TABLE t1; / o- D& t8 y5 W+ t4 b0 f

3 X: o3 X2 d7 I: OTABLE truncate.
2 Y2 @/ M% u% L
! `7 l- y; s2 L4 p% h2 {  管理视图 ) ?: `5 c1 T0 j: C- _3 O2 ?
$ ]; F8 ]" x4 l) B# K! f
  视图是一个或多个表中的数据的简化描述,用户可以将视图看成一个存储查询(stored query)或一个虚拟表(virtual table).查询仅仅存储在oracle数据字典中,实际的数据没有存放在任何其它地方,所以建立视图不用消耗其他的空间。视图也可以隐藏复杂查询,比如多表查询,但用户只能看见视图。视图可以有与他所基于表的列名不同的列名。用户可以建立限制其他用户访问的视图。</p>  建立视图
# M) E9 v6 e. F0 g
/ {' M+ o+ Q0 |  CREATE VIEW命令创建视图,定义视图的查询可以建立在一个或多个表,或其他视图上。查询不能有FOR UPDATE子串,在早期的ORACLE8i版本中不支持ORDER BY子串,现在的版本中CREATE VIEW可以拥有ORDER BY子串。
. H/ y8 {$ P& G/ y5 s, W- V' f% q$ v! t
  例:
8 z% U% o/ q. i7 e+ C; O+ `
+ ?2 G) ^) U9 M0 P7 G8 kSQL> CREATE VIEW TOP_EMP AS  
1 z4 B7 S  D5 M' Z. J  _) g% NSELECT empno EMPLOYEE_ID,ename EMPLOYEE_NAME,salary  
' v" [" i% D+ I4 l) Y% s+ lFROM emp
7 d9 `8 K/ c6 W1 P& p; xWHERE salary >2000
9 D5 E( I4 f) H6 R  e' l5 a1 N3 |# V" d3 T  Y& _
  用户可以在创建视图的同时更改列名,方法是在视图名后立即加上要命名的列名。重新定义视图需要包含OR REPLACE子串。
7 H# U$ ?* t0 ~0 f6 V! b! C/ [' L5 z& @$ v
SQL> CREATE VIEW TOP_EMP 1 n! k& v; A5 w+ k  e
(EMPLOYEE_ID,EMPLOYEE_NAME,SALARY) AS  ! G9 k& m' y/ b  ?+ T6 B8 f3 e$ T8 x# c9 I. b
SELECT empno ,ename ,salary  6 O! @5 ?" s$ E' b
FROM emp
2 @: G' U" c& W: @WHERE salary >2000
& g/ M4 d. W: n3 w1 G: v& x8 R) x7 X$ T- C/ I
  如果在创建的视图包含错误在正常情况下,视图将不会被创建。但如果你需要创建一个带错误的视图必须在CREATE VIEW语句中带上FORCE选项。如:
! \+ S/ x7 u5 B& d7 w% H  z5 B+ V. b; e
CREATE FORCE VIEW ORDER_STATUS AS  4 I5 A- {6 _+ j* H$ D9 w
SELECT * FROM PURCHASE_ORDERS 6 Z. N, n' _% e( |3 u$ a
WHERE STATUS=’APPPOVE’; 6 t6 I6 I- ]3 \( {7 _, L
& W: v) i6 b! M8 I" p
SQL>/ & a6 ^+ \# N# c$ q7 N
( N4 r  C6 |& G( z2 S2 W/ P* L
warning :View create with compilation errors
# z* S, e) z: `" F6 U0 K  V0 \$ `! H( W" @
  这样将创建了一个名为ORDER_STATUS的视图,但这样的视图的状态是不合法的,如果以后状态发生变化则可以重新编译,其状态也变成合法的。 3 `6 y, c, d4 A) |
8 W* D7 e0 c3 Y% b# l( Q
  从视图中获得数据
. `8 C5 `$ N& Y& P6 D% X7 P' m1 s2 U  `! G' V
  从视图中获得数据与从表中获得数据基本一样,用户可以在连接和子查询中使用视图,也可以使用SQL函数,以及所有SELECT语句的字串。 # k/ L& X/ @% V* ^; @

- G* I- x) T- v' z, y+ J+ w, [  插入、更新、删除数据 ; i, q# ~0 [  b, o8 [4 u

, l0 f1 ^, y9 a" X  用户在一定的限制条件下可以通过视图更新、插入、删除数据。如果视图连接多个表,那么在一个时间里只能更新一个表。所有的能被更新的列可以在数据字典USER_UPDATETABLE_COLUMNS中查到。
0 I- a0 F5 c/ p8 ^: z4 e8 g+ B2 C3 M. G" ^5 A' _
  用户在CREATE VIEW中可以使用了WITH子串。WITH READ ONLY子串表示创建的视图是一个只读视图,不能进行更新、插入、删除操作。WITH CHECK OPTION表示可以进行插入和更新操作,但应该满足WHERE子串的条件。这个条件就是创建视图WHERE子句的条件,比如在上面的例子中用户创建了一个视图TOP_EMP,在这个视图中用户不能插入salary小于2000的数据行。 . j* l/ P- A8 L$ z2 `5 _

9 e; p( q& U; m. l& w) ~/ c3 i  删除视图
" h) U2 M8 m6 G: ?0 P& [8 A* H4 o% M- |+ ?4 I
  删除视图使用DROP VIEW命令。同时将视图定义从数据字典中删除,基于视图的权限也同时被删除,其他涉及到该视图的函数、视图、程序等都将被视为非法。 ; N" G$ w8 V7 Z' V- `: ]0 W, V

( K: d/ p, L3 G7 Z4 A) }# Y. H" ]  例:
' A7 i' F$ F7 _3 D9 e, H5 c
# ~6 }& |' \3 X( o* uDROP VIEW TOP_EMP
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-7 13:30 , Processed in 0.233844 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表