Oracle筆記(九) 表的創建及管理

對於數據庫而言實際上每一張表都表示的是一個數據庫的對象,而數據庫對象指的就是DDL定義的所有操作,例如:表、視圖、索引、序列、約束等等,都屬於對象的操作,所以表的建立就是對象的建立,而對象的操作主要分爲以下三類語法:

  • 創建對象:CREATE 對象名稱 …;
  • 刪除對象:DROP 對象名稱 …;
  • 修改對象:ALTER 對象名稱 …;

一、常用的數據字段

每一張數據表實際上都是由若干個字段所組成,而每一個字段都會有其對應的數據類型,而在Oracle之中,常用的數據類型有如下幾種:

數據類型

關鍵字

描述

1

字符串

VARCHAR2(n)

其中n表示的是字符串所能保存的最大長度,基本上保存200個左右的內容

2

整數

NUMBER(n)

表示最多爲n位的整數,有時候也可以使用INT代替

3

小數

NUMBER(n,m)

其中m爲小數位,n-m爲整數位,有時候也可以使用FLOAT代替

4

日期

DATE

存放日期-時間

5

大文本

CLOB

可以存儲海量文字(4G),例如存儲《三國演藝》、《紅樓夢》

6

大對象

BLOB

存放二進制數據,例如:電影、MP3、圖片、文字

一般在開發之中使用最多的:VARCHAR2()、NUMBER、DATE、CLOB,而對於BLOB字段一般使用較少,首先BLOB可以存放4G的二進制數據,但是存放進去之後,一是數據庫過於龐大,二是讀取不方便;

二、表的創建

如果現在要想進行表的創建,可以使用如下的操作語法:

CREATE TABLE 表名稱 (
    字段1 數據類型 [DEFAULT默認值],
    字段2 數據類型 [DEFAULT默認值],
    … …,
    字段n 數據類型 [DEFAULT默認值]
);

下面創建一張成員表(member),有如下保存的信息:姓名、年齡、生日、個人簡介。

CREATE TABLE member (
     name VARCHAR2(50) DEFAULT '無名氏',
     age NUMBER(3),
     birthday DATE DEFAULT SYSDATE,
     content CLOB
);

表創建成功之後,下面開始向表中增加數據:

INSERT INTO member(name,age,birthday,content) VALUES('張三',20,TO_DATE('1990-08-12','yyyy-mm-dd'),'一個好人');
INSERT INTO member(age,content) VALUES(20,'一個好人');

一定要再次記住,表的創建是屬於數據庫對象的創建,所以使用的是CREATE語法。

三、表的複製

在之前學習過表的複製操作,下面給出其完整的操作語法:

CREATE TABLE 複製表名稱 AS 子查詢;

範例:複製一張只包含20部門僱員信息的表

CREATE TABLE emp20 AS SELECT * FROM emp WHERE deptno=20;

範例:現在要求將emp表的表結構複製出來,不要數據 —— 寫一個永遠滿足不了的條件即可。

CREATE TABLE empnull AS SELECT * FROM emp WHERE 1=2;

但是以上的語法只是Oracle數據庫所支持的操作,其他的數據庫語法上會有一些區別。

四、爲表重命名

在Oracle數據庫之中,所有的數據實際上都是通過數據字典保存的,例如,在之前曾經使用過如下的一種查詢:

SELECT * FROM tab;

以上就是一個數據字典,而在Oracle之中,提供了三種類型的數據字典,最常用的是:dba_、user_,所以下面查詢一個user_tables數據字典:

SELECT * FROM user_tables;

也就是說Oracle中的所有數據都是按照文件保存的,那麼所有的內容都會在數據字典中註冊,既然這樣,所謂的修改表名稱實際上對於Oracle而言就相當於修改一條數據而已,而修改表名稱的方法如下:

RENAME 舊的表名稱 TO 新的表名稱;

範例:將member表更名爲person表

RENAME member TO person;

但是這種操作由於是Oracle數據庫所獨有的一種特性,所以瞭解即可,不用做深入的掌握。

五、截斷表

在之前曾經講解過一個刪除表數據的操作,使用的是DELETE操作,但是這種刪除操作本身有一個特點,即:可以進行事務的回滾,也就是說刪除之後並不會立刻釋放數據的資源,如果現在希望徹底釋放掉一張表所佔用的全部資源(表空間、索引等等)就可以使用截斷表的語法,此語法如下:

TRUNCATE TABLE 表名稱;

範例:截斷person表

TRUNCATE TABLE person;

但是這種語法本身只是Oracle所有的,所以只做瞭解即可。

六、表的刪除

表的刪除操作指的是數據庫對象的刪除,既然是刪除則使用DROP語句,刪除表的語法如下:

DROP TABLE 表名稱;

範例:刪除person表

DROP TABLE person;

七、Oracle 10g的新特性:閃回技術

在Oracle 10g之後,爲了預防用戶的誤刪除表操作,專門提供了回收站的功能,用戶所刪除的表默認情況下會在一個回收站之中保存,而用戶也可以通過回收站,進行表的恢復,所以此技術稱爲閃回(FLASHBACK);

範例:查看回收站

SHOW RECYCLEBIN;

這個時候可以發現所有已經刪除的表都在回收站之中保存,那麼下面就可以使用如下的語法恢復表:

FLASHBACK TABLE 表名稱 TO BEFORE DROP;

範例:恢復myemp表

FLASHBACK TABLE myemp TO BEFORE DROP;

當然,現在也可以直接刪除掉回收站中的一些數據表,語法如下:

PURGE TABLE 表名稱;

範例:刪除回收站中的person表

PURGE TABLE person;

範例:清空回收站

PURGE RECYCLEBIN;

如果現在希望刪除一張表,而又不希望其進入到回收站之中,則可以在刪除的時候增加PURGE。

DROP TABLE myemp PURGE;

這種技術是在Oracle 10g之後纔有的,而Oracle 11g也是存在的。

問題:現在在回收站之中存在了一張tab表,而後又建立了一張tab表,那麼如果從回收站中恢復的話,可以嗎?

答:無法恢復。

八、修改表結構

如果一張建立好的數據表,發現其初期的結構已經不滿足於後期的使用要求,則可以進行表的修改操作,而表的修改操作實際上就是數據庫對象的修改操作,使用ALTER指令完成,例如,現在有如下一張表:

CREATE TABLE member (
     mid NUMBER,
     name VARCHAR2(50)
);

現在希望可以向表中增加字段,所以此時可以採用如下的語法完成:

ALTER TABLE 表名稱 ADD(列名稱 數據類型 [DEFAULT 默認值],
  列名稱 數據類型 [DEFAULT 默認值],…);

範例:爲member表增加字段

ALTER TABLE member ADD(age NUMBER(3), birthday DATE DEFAULT SYSDATE);

如果增加的數據列沒有默認值,則所有已有的數據的列的內容都是null,而如果增加的列指定了DEFAULT默認值的話,則所有已有的數據列都是設置的默認值。

現在也可以修改已有的表結構,此時的語法如下:

ALTER TABLE 表名稱 MODIFY(列名稱 數據類型 [DEFAULT 默認值],
  列名稱 數據類型 [DEFAULT 默認值],…);

範例:將name字段的默認值定義爲無名氏

ALTER TABLE member MODIFY(name VARCHAR2(100) DEFAULT '無名氏');

雖然在SQL語法之中以及Oracle數據庫之中,都給出了修改表結構的操作,但是這種操作能不使用就不使用,從大型數據庫來講,世界上性能最高的數據庫是IBM DB2,但是IBM DB2本身有一個平臺的限制問題,所以如果說是跨平臺的數據庫則是Oracle數據庫的性能最高。

在IBM DB2數據庫之中是不允許修改表結構的,即:表建立完成之後就不能修改了,所以以後在開發之中也儘可能的不要去修改表結構。

九、思考題

現在要求建立一張nation表,表中有一個name字段,裏面保存四條記錄:中國、美國、巴西、荷蘭,要求通過查詢實現如下的操作效果:

中國         美國

中國         巴西

中國         荷蘭

美國         巴西

美國         中國

美國         荷蘭

剩下的依次類推,現在要求建立新的表並完成此查詢的操作。

本題目的主要目的並不是在於查詢的編寫上,而是在於規範化數據庫創建腳本的格式,以後只要是碰到了類似的要求,首先必須編寫一個數據庫創建腳本,這個腳本的要求如下:

1、  本文件的文件名稱後綴必須是“*.sql”;

2、  先刪除相應的數據表;

3、  編寫創建表的語句;

4、  增加測試數據;

5、  提交事務;

--1、刪除表
DROP TABLE nation PURGE;
--2、創建表
CREATE TABLE nation(
    name VARCHAR2(50)
);
--3、測試數據
INSERT INTO nation(name) VALUES('中國');
INSERT INTO nation(name) VALUES('美國');
INSERT INTO nation(name) VALUES('巴西');
INSERT INTO nation(name) VALUES('荷蘭');
--4、事務提交
COMMIT;

本程序如果要想完成依靠笛卡爾積完成,屬於表的自身關聯。

SELECT n1.name,n2.name
FROM nation n1,nation n2
WHERE n1.name<>n2.name;

而且以後如果面試之中,出現了一些複雜的查詢,建議把腳本寫全了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章