一、表的概念
表是數據庫最基本的邏輯結構,一切數據都存放在表中,其它數據庫對象(索引、視圖、同義詞等)都是爲了更方便的操作表中的數據。Oracle數據庫是由若干個表組成,每個表由列和行組成,如下表所示。
編號 | 姓名 | 顏值 | 身材 | 體重 | 身高 | 出生時間 | 備註 |
---|---|---|---|---|---|---|---|
0101 | 西施 | 漂亮 | 火辣 | 48.5 | 170 | 2000-01-01 01:12:35 | 這是一個非常漂亮姑娘,老公是夫差,男朋友是范蠡。 |
0102 | 貂禪 | 漂亮 | 火辣 | 45.2 | 168 | 1997-08-02 12:20:38 | 王允真不是男人,幹不過董卓就把美人往火坑裏推,千古罪人啊。 |
0103 | 妲已 | 漂亮 | 豐滿 | 53.6 | 172 | 1998-03-03 10:50:33 | 如果商真的因我而亡,您們男人做什麼去了? |
0104 | 芙蓉 姐姐 | 豬扒 | 膘肥 體壯 | 85.8 | 171 | 1980-05-05 10:11:55 | 如果不努力學習技術,將來就會娶個芙蓉姐姐,哼哼。 |
0105 | 神密 貓女 | 48.5 | 171 | 1989-12-08 12:10:35 | 不知道是什麼人,她臉上有一個%符號,很神密。 |
1、表的列
表的結構是由列組成,習慣上把列也稱之爲字段,字段的基本屬性如下:
1)字段名:字段的名稱。
2)數據類型:該字段存放數據的類型和長度。
3)是否允許空值:該字段是否爲必填,如果不是必填,表示可以爲空。
2、列的數據類型
表的每個列一定會有它的數據類型,表示該列存放的是什麼數據,常用的數據類型如下:
1)字符串類型:char和varchar2,可表達任何字符串。
2)數字類型:number(m,n),可表達任何數字,m是數字的總長度,n是小數點後的位數,如果n爲0則表示是存放整數。
3)日期類型:date,存放日期和時間,包括年(yyyy)、月(mm)、日(dd)、小時(hh24)、分(mi)、秒(ss)。
4)clob類型,存放單字節字符串或多字節字符數據,如文本文件、xml文件。
5)blob類型,存放非結構化的二進制數據,如圖片、音頻、視頻、office文檔等。
6)rowid類型,存放表中記錄在數據庫中的物理地址。
更詳細的介紹請閱讀《Oracle數據類型》文章。
3、表的行
表中的數據是由行組成的,每一行就是一條數據,也稱之爲記錄,數據越多,記錄就越多。
二、創建表
1、創建表
Oracle數據庫創建表是用create table命令來完成的,我們通過創建T_GIRL表(超女基本信息表)來講解create table 命令的使用。
建表命令如下:
create table 表名
(
字段名1 數據類型 null,
字段名2 數據類型 not null,
......,
字段名n 數據類型 null
);
表名是標識符,從語法上來說,表名只要符合Oracle的規定就行了,但是,在實際開發中,我會遵守兩個原則:1)表名以T_打頭,可讀性比較好;2)表名儘可能有意義,用完整的英文單詞或簡寫、或中文拼音都可以,方便理解和記憶就好。
創建超女基本信息表:
create table T_GIRL
(
id char(4) not null, -- 編號
name varchar2(30) not null, -- 姓名
yz varchar2(20) null, -- 顏值
sc varchar2(20) null, -- 身材
weight number(4,1) not null, -- 體重
height number(3) not null, -- 身高
birthday date not null, -- 出生時間
memo varchar2(1000) null -- 備註
);
注意:1)在Oracle數據庫的SQL命令中,關鍵字、表名和字段名都不區分大小寫,CREATE和create沒有區別,表名T_GIRL和t_girl也沒有區別,字段名ID和id也沒有區別;2)兩根短線“--”是說明文字,就像C/C++語言中的“//”。
2、創建表的主鍵
在現實世界中,很多數據具有唯一的特性,例如身份證號碼,在國家人口基本信息表中,一定不會存在多個人用同一個身份證號碼的情況,再例如手機號碼、QQ號碼、銀行帳號等等,還有學生管理系統,學生的年級、班級和學號三個字段組合起來是唯一的標識。
如果表中一個字段或多個字段組合起來的值是唯一的,就可以作爲表的主鍵,在創建或修改表時用primay key關鍵字來指定主鍵。一個表只能有一個主鍵,而且組成主鍵的每個字段值都不能爲空。
主鍵的作用:
1)體現數據結構設計的合理性。
2)提升數據操作的速度。
3)保證數據的完整性,在表中添加或修改記錄時,數據庫會檢查該記錄主鍵的值,不允許與其它記錄主鍵的值重複,這種做法有個專業的名詞:主鍵約束。
例如超女基本信息表,編號的字段名是id,在超女選秀活動中,每個超女的編號肯定是唯一的,不可能存在兩個編號相同的超女,否則會引起混亂,我們可以把id字段設置爲T_GIRL表的主鍵,後面的工作交給數據庫,如果試圖往表中插入多條id相同的記錄,數據庫將拒絕。
指定表的主建有兩種方法。
1)在create table時指定。
create table T_GIRL
(
id char(4) not null, -- 編號
name varchar2(30) not null, -- 姓名
yz varchar2(20) null, -- 顏值
sc varchar2(20) null, -- 身材
weight number(4,1) not null, -- 體重
height number(3) not null, -- 身高
birthday date not null, -- 出生時間
memo varchar2(1000) null, -- 備註
primary key(id) -- 指定id爲表的主鍵
);
2)修改已經建好的表,增加主鍵約束。
alter table 表名 add constraint 主鍵名 primary key(字段名1,字段名2,......字段名n);
例如:
alter table T_GIRL add constraint PK_GIRL primary key(id);
在Oracle數據庫中,雖然主鍵不是必需的,但是最好爲每個表都設置一個主鍵,不管是單字段主鍵還是多字段主鍵(複合主鍵),它的存在代表了表結構的完整性,主鍵還可以用於其他表的外鍵關聯,外鍵的知識以後再介紹。
三、表記錄的插入、修改和刪除
1、向表中插入記錄
insert into命令用於向表中插入記錄,語法如下:
insert into 表名 (字段名1, 字段名2,...... 字段名n) values (字段1的值, 字段2的值,..... 字段n的值);
注意,表名後的字段名列表與values後面字段值列表必須一一對應。
例如:
insert into T_GIRL(id,name,yz,birthday,sc,weight,height,memo)
values('0101','西施','漂亮',to_date('2000-01-01 01:12:35','yyyy-mm-dd hh24:mi:ss'),
'火辣',48.5,170,'這是一個非常漂亮姑娘,老公是夫差,男朋友是范蠡。');
insert into T_GIRL(id,name,yz,birthday,sc,weight,height,memo)
values('0102','貂禪','漂亮',to_date('1997-08-02 12:20:38','yyyy-mm-dd hh24:mi:ss'),
'苗條',45.2,168,'王允真不是男人,幹不過董卓就把美人往火坑裏推,千古罪人啊。');
insert into T_GIRL(id,name,yz,birthday,sc,weight,height,memo)
values('0103','妲已','漂亮',to_date('1998-03-03 10:50:33','yyyy-mm-dd hh24:mi:ss'),
'火辣',53.6,172,'如果商真的因我而亡,您們男人做什麼去了?');
insert into T_GIRL(id,name,yz,birthday,sc,weight,height,memo)
values('0104','芙蓉姐姐','豬扒',to_date('1980-05-05 10:11:55','yyyy-mm-dd hh24:mi:ss'),
'膘肥體壯',85.8,166,'如果不努力學習技術,將來就會娶個芙蓉姐姐,哼哼。');
insert into T_GIRL(id,name,yz,birthday,sc,weight,height,memo)
values('0105','神密貓女',null,to_date('1989-12-08 12:10:35','yyyy-mm-dd hh24:mi:ss'),
null,48.5,171,'不知道是什麼人,她臉上有一個%符號,很神密。');
在上面的insert語句中,字段的值如果是字符串,要用單引號包含起來,日期字段要用to_date函數轉換,數字直接書寫。
插入數據的SQL語句還有一種寫法,如下:
insert into 表名 values (字段1的值, 字段2的值,..... 字段n的值);
這種寫法省略了字段名列表,但是,這種寫法一定不能出現在程序中,因爲只要表結構發生改變,或字段的位置改變,SQL語句就會出錯。
2、查詢表中的記錄
insert into命令用於從表中查詢記錄,語法如下:
select 字段名1,字段名2,......字段名n from 表名 where 條件1 and 條件2 ...... 條件n;
select * from 表名 where 條件1 and 條件2 ...... 條件n;
例如:
select name,to_char(birthday,'yyyy-mm-dd hh24:mi:ss') from T_GIRL where yz='漂亮' and sc='火辣';
在select關鍵字之後,可以用星號表示全部的字段。
select * from T_GIRL where yz='漂亮' and sc='火辣';
在上面的SQL語句中,用星號*表示列出全部的字段,這種寫法一定不能出現在程序中,因爲只要表結構發生改變,或字段的位置改變,程序就會出現混亂。
where關鍵字後面的條件表達式涉及的知識非常多,以後再詳細介紹。
3、修改表中的記錄
update命令用於修改表中的記錄,語法如下:
update 表名 set 字段名1=值1,字段名2=值2,......字段名n=值n where 條件1 and 條件2 ...... 條件n;
在set關鍵字之後把需要修改的字段名和新的值一一列出來。
where關鍵字後面是條件表達式,如果沒有條件表達式,就會更新表中全部的記錄。
超女選秀活動開始後,芙蓉姐姐體重反彈了3公斤,像個大恐龍,出生日期也有隱瞞,組委會修改了她的基本資料,如下:
update T_GIRL set weight=89.5,yz='恐龍',birthday=to_date('1978-01-01 01:12:35','yyyy-mm-dd hh24:mi:ss') where name='芙蓉姐姐';
4、刪除表中的記錄
delete命令用於刪除表中的記錄,語法如下:
delete from 表名 where 條件1 and 條件2 ...... 條件n;
where關鍵字後面是條件表達式,如果沒有條件表達式,就刪除表中全部的記錄。
隨着超女選秀活動的繼續,芙蓉姐姐的體重在持續反彈中,組委會實在受不了了,決定把芙蓉姐姐除名。
delete from T_GIRL where name='芙蓉姐姐';
四、表的約束
表的約束有非空約束、唯一性約束、檢查約束、主建約束和外鍵約束四種,主鍵約束和外鍵約束涉及到數據結構方面的知識,以後再介紹。
1、非空約束
創建表的時候,可以指定字段的值是否允許爲空,缺省是null允許爲空(表示是可選字段),not null不允許爲空(表示是必填字段)。
例示:
create table tt (c1 varchar2(10),c2 varchar2(10) not null);
創建表tt,c1字段允許爲空,c2字段不允許爲空。
2、唯一性約束
唯一性約束有兩種,一種是表的主鍵,另一種是表的唯一索引,唯一索引以後再介紹。
表的主鍵字段不允許存在值相同的記錄。
create table tt (id varchar2(10),name varchar2(10),primary key(id));
創建表tt,id字段是主鍵。
3、檢查約束
檢查約束是指檢查字段的值是否合法。
示例:
create table TT
(
c1 number(6) constraint CKC_C1_TT check (c1 >= 10),
c2 number(6) constraint CKC_C2_TT check (c2 <= 20),
c3 number(6) constraint CKC_C3_TT check (c3 in (1,2,3))
);
創建表TT,c1字段的最小值是10,c2字段的最大值是20,C3字段的取值必須在(1,2,3)中取其一。
五、字段的缺省值
在創建表的時候,可以爲字段指定缺省值。
示例:
create table TT
(
name varchar2(10) not null,
crttime date default sysdate not null,
rsts number(1) default 1 not null constraint CKC_RSTS_TT check (rsts in (1,2))
);
創建表,字段crttime的缺省值是sysdate(當前時間),rsts的缺省值是1。
六、表的存儲空間
每個數據庫用戶有一個缺省表空間,創建的表、主鍵和索引存放在缺省表空間中,也可以指定其它的表空間。
1、查看當前用戶的缺省表空間
從數據字典USER_USERS中可以查看當前用戶的缺省表空間。
2、指定表的表空間
指定表空間的語法如下:
create table 表名
(
...... -- 字段列表
) tablespace 表空間名;
例如創建T_GIRL表,指定使用USERS表空間。
create table T_GIRL
(
id char(4) not null, -- 編號
name varchar2(30) not null, -- 姓名
yz varchar2(20) null, -- 顏值
sc varchar2(20) null, -- 身材
weight number(4,1) not null, -- 體重
height number(3) not null, -- 身高
birthday date not null, -- 出生時間
memo varchar2(1000) null -- 備註
) tablespace USERS;
表還有其它與存儲相關的選項,但應用場景比較少,本文就不介紹了。
七、修改表結構
Oracle修改表的命令是alter table,它的選項非常多,本文只介紹修改表結構的相關知識。
1、增加字段
語法:
alter table 表名 add 字段名 數據類型 其它選項;
例如:
alter table T_GIRL add address varchar2(50) null;
alter table T_GIRL add rsts number(1) constraint CKC_RSTS_GIRL check (rsts in (1,2));
2、修改字段的屬性
語法:
alter table 表名 modify 字段名 數據類型 其它選項;
例如:
alter table T_GIRL modify address varchar2(100);
alter table T_GIRL modify address varchar2(100) not null;
alter table T_GIRL drop constraint CKC_RSTS_GIRL;
alter table T_GIRL modify rsts constraint CKC_RSTS_GIRL check (rsts in (1,2,3));
修改字段屬性的時候要注意一個問題,如果表中已存在數據,修改可能會失敗,包括但不限於以下的情況:
1)把字段由null改爲not null時,表中記錄存在null的情況。
2)把字段的取值範圍由較大(例如number(10))改較小(例如number(5)),表中記錄存在大於較小取值範圍的情況,例如已經存在123456的值,如果把數據類型改爲number(5),無法存放123456。
3)把字段的數據類型時,表中存在記錄並且新舊數據類型不兼容的情況。例如原來的數據類型是varchar2(10),表中存在記錄的值是'freecplus',如果要修改爲number(10),Oracle無法把'freecplus'轉換爲number(10)。
3、修改字段名
語法:
alter table 表名 rename column 列名 to 新列名;
例如:
alter table T_GIRL rename column memo to remark;
4、刪除字段
語法:
alter table 表名 dorp column 字段名;
例如:
alter table T_GIRL drop column rsts;
alter table T_GIRL drop column address;
八、修改表名
語法:
alter table 表名 rename to 新表名;
例如:
alter table T_GIRL rename to T_BEAUTY;
注意,如果修改了表名,表的約束、索引、主鍵的名稱不會改變。
九、刪除表
語法:
drop table 表名;
示例:
drop table T_GIRL;
十、版權聲明
C語言技術網原創文章,轉載請說明文章的來源、作者和原文的鏈接。
來源:C語言技術網(www.freecplus.net)
作者:碼農有道
如果這篇文章對您有幫助,請點贊支持,或在您的博客中轉發我的文章,謝謝!!!
如果文章有錯別字,或者內容有錯誤,或其他的建議和意見,請您留言指正,非常感謝!!!