本文檔初步介紹了,建表、修改表、向表中插入數據、更新數據、檢索數據、刪除數據、序列以及索引,適合初學數據庫的人員。
本資料主要正對Oracle數據庫的SQL,其他數據庫可以參考,但在細節上存在差異。
一、創建表
1. 建表的簡化語法說明:
在數據庫中,可以使用createtable 語句創建表。create table 語句的簡化語法如下:
CREATE [GLOBALTEMPORARY] TABLE table_name
(
Column_name type [CONSTRAINT constraint_def DEFAULT default_exp]
[,column_name type [CONSTRAINT constraint_def DEFAULT default_exp]…]
) [ON COMMIT {DELETE | PRESERVE} ROWS] TABLESPACE tab_space;
2. 語法中關鍵字說明如下:
1) GLOBAL TEMPORARY說明該表的行都是臨時的,這種表就稱爲臨時表。臨時表中的行是特定於某個用戶會話的,行的有效期由ONCOMMIT子句指定。
2) table_name指定要分配給該表的名稱。
3) column_name 指定要分配給某個列的名稱。
4) type 指定某個列的類型。
5) constraint_def 指定對某個列的約束。
6) default_exp 指定一個表達式,用來爲某個列賦予默認值。
7) ON COMMIT 控制臨時表中行的有效期。 DELETE說明這些行在事務的末尾要被刪除。
8) PRESERVE 說明這些行在用戶會話的末尾要被刪除。如果對臨時表沒有指定ON COMMIT選項,那麼默認值是DELETE。
9) tab_space 爲該表指定表空間。如果沒有指定表空間,該表就被存儲在該用戶的默認表空間中。
3. 建立普通表舉例
如: create tablebasetab
(
msisdn varchar2(21) not null primary key,
imsi varchar2(16) null,
paytype number null default 0
)
4. 建立臨時表
所謂臨時表就是在一個事務中,要來保存數據的,退出事務,數據將被清空。
如: create globaltemporary table basetab_temp
(
msisdnvarchar2(14)
) on commit preserve rows;
如果向表basetab_temp中插入一條數據,然後斷開連接,再連接後,查詢該表會發現該表爲空。
二、修改表
在我們將表建好後,發現表結構需要修改、後來需要增加新列或需要加約束等,這時我們可以使用ALTERTABLE語句對錶進行修改。ALTER TABLE語句可以執行以下任務:
添加、修改或刪除列。
添加或刪除約束。
啓動或禁用約束。
1. 添加列
如:
1) 向basetab中增加一個20個變長字符列name
alter table basetab add name varchar2(20);
2) 向basetab增加number型的low_num和high_num列默認值都爲0
alter tablebasetab add low_num number(3) default 0;
alter tablebasetab add high_num number(3) default 0;
2. 虛擬列
虛擬列在定義好後,不需要對該列插入數據,通過現有的列計算後的值填進去。
如:
在basetab中增加一列mid_num,該列是通過low_num和high_num的平均值得到。
alter table basetab add(mid_num as ((low_num + high_num)/2));
3. 修改列
1) 修改basetab中msisdn的長度爲15
alter table basetab modify msisdn varchar2(15);
說明:只有在表中沒有任何行或所有列都爲空值時纔可以減小列的長度。
2) 修改basetab中的數字列low_num的精度爲5
alter table basetab modify low_num number(5);
3) 修改basetab中msisdn列的數據類型爲字符型定長14
alter table basetab modify msisdn char(14);
4) 修改basetab中high_num列的默認值爲100
alter table basetab modify high_num default 100;
5) 刪除basetab中high_num列
alter table basetab drop column high_num;
6) 限制basetab中high_num列值必須大於等於0
alter table basetab add constraint basetab_hig_num_ck check(high_num>=0);
7) 限制basetab中msisdn列不爲空
alter table basetab modify msisdn constraint basetab_msisdn_nn notnull;
8) 添加foreign key約束
foreign key是約束兩張表,如果在subscribeinfo建立msisdn關聯basetab的外鍵,則subscribeinfo中msisdn必須在basetab中存在。
在subscribeinfo建立msisdn關聯basetab的外鍵語句如下:
alter table subscribeinfo add constraint sub_fk msisdn referencesbasetab(msisdn);
帶foreign key 約束的 on delete cascade 意思就是當刪除主表中的數據是,關聯表中的數據一起被刪除。如:
alter table subscribeinfo add constraint sub_fk msisdn referencesbasetab(msisdn) on delete cascade;
帶foreign key 約束的 on delete null意思是刪除主表中的數據時,關聯表的外鍵列將爲空,如:
alter table subscribeinfo add constraint sub_fk msisdn referencesbasetab(msisdn) on delete null;
9) 將basetab中msisdn設置爲唯一值
alter table basetab add constraint base_uq unique(msisdn);
10) 刪除basetab中的唯一約束
alter table basetab drop constraint base_uq;
11) 禁用basetab中對hig_num大於等於0的約束
alter table basetab disable constraint basetab_hig_num_ck;
12) 啓用basetab中對hig_num大於等於0的約束
alter table basetab enable constraint basetab_hig_num_ck;
1, 將表basetab_exp重命名爲basetab_nn表
rename basetab_exp to basetab_nn;
2, 截斷表
截斷表即將表中數據清空,在截斷過程中不會undo日誌,所有截斷不會被會滾。如:
truncate table basetab;
3, 刪除basetab_nn表
drop table basetab_nn;
三、插入數據
我們在將表建立好後,需要將我們的數據插入到表中,可以使用insert語句。Insert可以往表中插入單行數據,也可以通過子查詢將一張表的多行數據插入到另一張表中,還可以進行多表插入。下面就對單行插入、多行插入和多表插入進行說明。
1. 單行插入數據
1) 具體語法:
INSERT INTO TABLE [(column[,column,…])] VALUES(value[,value,…]);
TABLE用於指定表名;column用於指定列名,如果要指定多個列,那麼列之間要用逗號分開;value用於提供列數據。
說明:如果不提供列,則每個列都要有數據。
2) 向basetab中中插入一條數據
insert into basetab(msisdn,paytype) values(‘8613815427202’,0);
2. 多行插入數據
當我們想一次插入多行數據時可以使用子查詢插入數據。當使用子查詢插入數據時,可以將一張表的數據複製到另外一張表中。當處理行遷移、複製表數據或者裝載外部表數據到數據時,可以使用子查詢插入數據。
1) 具體語法:
INSERT INTO TABLE[(column[,column,…])] subQuery
TABLE用於指定表名;column用於指定列名,如果要指定多個列,那麼列之間要用逗號分開;subQuery用於指定爲目標表提供數據的子查詢。需要插入的列和子查詢的列的數據類型和個數要完全匹配。
2) 使用子查詢插入數據
insert into subscribeinfo(msisdn,serviceid) select msisdn,serviceidfrom subscribeinfo;
3) 使用子查詢執行直接裝載
insert /*+APPEND*/ intosubscribeinfo(msisdn,serviceid) select msisdn,serviceid from subscribeinfo;
注意,儘管以上兩條語句的執行結果一樣,但第二條語句使用/*+APPEND*/來表示直接裝載方式。當要裝載大批量數據時,採用第二種方法裝載數據的速度要遠遠優於第一種方法。Append在數據庫oracle常用操作培訓.ppt中有說明。
3. 多表插入數據
所謂多表插入即在通過一些限制條件,將子查詢中的數據分別插入到不同的表中。其中通過兩個操作符ALL和FIRST來實現的。
1) ALL操作符
如:insert all when type=0 then into waptab
when type=1 then into javatab
when type=2 then into smstab
when orderflag =8 then into ordertab
else into othertab
select * from serviceinfo;
2) FIRST操作符
當使用FIRST操作符執行多表插入時,如果數據已經滿足了先前條件,並且已經被插入到某表中,那麼該行數據在後續插入中不會再次使用
如:insert first when type=0 then into waptab
when type=1then into javatab
when type=2then into smstab
when orderflag=8 then into ordertab
else intoothertab
select * fromserviceinfo;