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

來源:互聯網
上載者:User

對於資料庫而言實際上每一張表都表示的是一個資料庫的對象,而資料庫物件指的就是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.nameFROM nation n1,nation n2WHERE n1.name<>n2.name;

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.