對於數據庫而言實際上每一張表都表示的是一個數據庫的對象,而數據庫對象指的就是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;
而且以後如果面試之中,出現了一些複雜的查詢,建議把腳本寫全了。