Oracle數據庫數據對象中最基本的是表和視圖其他還有約束序列函數存儲過程包觸發器等對數據庫的操作可以基本歸結為對數據對象的操作理解和掌握Oracle數據庫對象是學習Oracle的捷徑
表和視圖
Oracle中表是數據存儲的基本結構ORACLE引入了分區表和對象表ORACLEi引入了臨時表使表的功能更強大視圖是一個或多個表中數據的邏輯表達式本文我們將討論怎樣創建和管理簡單的表和視圖
管理表
表可以看作有行和列的電子數據表表是關系數據庫中一種擁有數據的結構用CREATE TABLE語句建立表在建立表的同時必須定義表名列以及列的數據類型和大小例如
CREATE TABLE products
( PROD_ID NUMBER(
)
PROD_NAME VAECHAR
(
)
STOCK_QTY NUMBER(
)
);
這樣我們就建立了一個名為products的表
關鍵詞CREATE TABLE後緊跟的表名
然後定義了三列
同時規定了列的數據類型和大小
在創建表的同時你可以規定表的完整性約束
也可以規定列的完整性約束
在列上普通的約束是NOT NULL
關於約束的討論我們在以後進行
在建立或更改表時
可以給表一個缺省值
缺省值是在增加行時
增加的數據行中某一項值為null時
oracle即認為該值為缺省值
下列數據字典視圖提供表和表的列的信息
DBA_TABLES
DBA_ALL_TABLES
USER_TABLES
USER_ALL_TABLES
ALL_TABLES
ALL_ALL_TABLES
DBA_TAB_COLUMNS
USER_TAB_COLUMNS
ALL_TAB_COLUMNS
表的命名規則 表名標識一個表
所以應盡可能在表名中描述表
oracle中表名或列名最長可以達
個字符串
表名應該以字母開始
可以在表名中包含數字
下劃線
#
$等
從其它表中建立表 可以使用查詢從基於一個或多個表中建立表
表的列的數據類型和大小有查詢結果決定
建立這種形式的表的查詢可以選擇其他表中所有的列或者只選擇部分列
在CREATE TABLE語句中使用關鍵字AS
例如:
SQL>CREATE TABLE emp AS SELECT * FROM employee
TABLE CREATED
SQL> CREATE TABLE Y AS SELECT * FROM X WHERE no=
需要注意的是如果查詢涉及LONG數據類型
那麼CREATE TABLE
AS SELECT
將不會工作
更改表定義 在建立表後
有時候我們可能需要修改表
比如更改列的定義
更改缺省值
增加新列
刪除列等等
ORACLE使用ALTER TABLE語句來更改表的定義
增加列 語法
ALTER TABLE [schema
] table_name ADD column_definition
例
ALTER TABLE orders ADD order_date DATE;
TABLE ALTER
對於已經存在的數據行
新列的值將是NULL
更改列 語法
ALTER TABLE [schema
] table_name MODIFY column_name new_attributes;
例
ALTER TABLE orders MODITY (quantity number(
)
status varchar
(
));
這個例子中我們修改了表orders
將STATUS列的長度增加到
將QUANTITY列減小到
;
修改列的規則如下
可以增加字符串數據類型的列的長度
數字數據類型列的精度
減少列的長度時
該列應該不包含任何值
所有數據行都為NULL
改變數據類型時
該列的值必須是NULL
對於十進制數字
可以增加或減少但不能降低他的精度
刪除數據列 優化ORACLE數據庫
唯一的方法是刪除列
重新建立數據庫
在ORACLE
i中有很多方法刪除列
你可以刪除未用數據列或者可以標示該列為未用數據列然後刪除
刪除數據列的語法是
ALTER TABLE [schema
] table_name DROP {COLUM column_names | (column_names)}[CASCADE CONSTRAINS]
要注意的是在刪除列時關於該列的索引和完整性約束也同時刪除
注意關鍵字CASCADE CONSTRAINS
如果刪除的列是多列約束的一部分
那麼這個約束條件相對於其他列也同時刪除
如果用戶擔心在大型數據庫中刪除列要花太多時間
可以先將他們標記為未用數據列
標記未用數據列的語法如下
ALTER TABLE [schema
] table_name SET UNUSED {COLUM column_names | (column_names)}[CASCADE CONSTRAINS]
這個語句將一個或多個數據列標記為未用數據列
但並不刪除數據列中的數據
也不釋放占用的磁盤空間
但是
未用數據列在視圖和數據字典中並不顯示
並且該數據列的名稱將被刪除
新的數據列可以使用這個名稱
基於該數據列的索引
約束
統計等都將被刪除
刪除未用數據列的語句是
ALTER TABLE [schema
] table_name DROP {UNUSED COLUM | COLUMN CONTINUE}
刪除表和更改表名
刪除表非常簡單但它是一個不可逆轉的行為
語法
DROP TABLE [schema] table_name [CASCADE CONSTRAINTS]
刪除表後表上的索引觸發器權限完整性約束也同時刪除ORACLE不能刪除視圖或其他程序單元但oracle將標示他們無效如果刪除的表涉及引用主鍵或唯一關鍵字的完整性約束時那麼DROP TABLE語句就必須包含CASCADE CONSTRAINTS子串
更改表名
RENAME命令用於給表和其他數據庫對象改名ORACLE系統自動將基於舊表的完整性約束索引權限轉移到新表中ORACLE同時使所有基於舊表的數據庫對象比如視圖程序函數等為不合法
語法
RENAME old_name TO new_name;
例
SQL> RENAME orders TO purchase_orders;
TABLE RENAMED
截短表
TRUNCATE命令與DROP命令相似 但他不是刪除整個數據表所以索引完整性約束觸發器權限等都不會被刪除缺省情況下將釋放部分表和視圖空間如果用戶不希望釋放表空間TRUNCATE語句中要包含REUSE STORAGE子串TRUNCATE命令語法如下
TRUNCATE {TABLE|CLUSTER} [schema] name {DROP|REUSE STORAGE}
例
SQL> TRUNCATE TABLE t;
TABLE truncate
管理視圖
視圖是一個或多個表中的數據的簡化描述用戶可以將視圖看成一個存儲查詢(stored query)或一個虛擬表(virtual table)查詢僅僅存儲在oracle數據字典中實際的數據沒有存放在任何其它地方所以建立視圖不用消耗其他的空間視圖也可以隱藏復雜查詢比如多表查詢但用戶只能看見視圖視圖可以有與他所基於表的列名不同的列名用戶可以建立限制其他用戶訪問的視圖
建立視圖
CREATE VIEW命令創建視圖定義視圖的查詢可以建立在一個或多個表或其他視圖上查詢不能有FOR UPDATE子串在早期的ORACLEi版本中不支持ORDER BY子串現在的版本中CREATE VIEW可以擁有ORDER BY子串
例
SQL> CREATE VIEW TOP_EMP AS
SELECT empno EMPLOYEE_IDename EMPLOYEE_NAMEsalary
FROM emp
WHERE salary >
用戶可以在創建視圖的同時更改列名方法是在視圖名後立即加上要命名的列名重新定義視圖需要包含OR REPLACE子串
SQL> CREATE VIEW TOP_EMP
(EMPLOYEE_IDEMPLOYEE_NAMESALARY) AS
SELECT empno ename salary
FROM emp
WHERE salary >
如果在創建的視圖包含錯誤在正常情況下視圖將不會被創建但如果你需要創建一個帶錯誤的視圖必須在CREATE VIEW語句中帶上FORCE選項如
CREATE FORCE VIEW ORDER_STATUS AS
SELECT * FROM PURCHASE_ORDERS
WHERE STATUS=APPPOVE;
SQL>/
warning :View create with compilation errors
這樣將創建了一個名為ORDER_STATUS的視圖但這樣的視圖的狀態是不合法的如果以後狀態發生變化則可以重新編譯其狀態也變成合法的
從視圖中獲得數據
從視圖中獲得數據與從表中獲得數據基本一樣用戶可以在連接和子查詢中使用視圖也可以使用SQL函數以及所有SELECT語句的字串
插入更新刪除數據
用戶在一定的限制條件下可以通過視圖更新插入刪除數據如果視圖連接多個表那麼在一個時間裡只能更新一個表所有的能被更新的列可以在數據字典USER_UPDATETABLE_COLUMNS中查到
用戶在CREATE VIEW中可以使用了WITH子串WITH READ ONLY子串表示創建的視圖是一個只讀視圖不能進行更新插入刪除操作WITH CHECK OPTION表示可以進行插入和更新操作但應該滿足WHERE子串的條件這個條件就是創建視圖WHERE子句的條件比如在上面的例子中用戶創建了一個視圖TOP_EMP在這個視圖中用戶不能插入salary小於的數據行
刪除視圖
刪除視圖使用DROP VIEW命令同時將視圖定義從數據字典中刪除基於視圖的權限也同時被刪除其他涉及到該視圖的函數視圖程序等都將被視為非法
例
DROP VIEW TOP_EMP;
From:http://tw.wingwit.com/Article/program/Oracle/201311/17225.html