Oracle--02對錶的基本操作
Oracle對錶的基本操作
1、建立表
在Oracle資料庫中,使用者可以根據使用者不同的需求建立不同型別的表,常用的表型別有如下:
型別 說明
堆表 資料按照堆組織,一無系方式存放在單獨的表欄位中,也是標準表,我們平常用的都是堆表。
索引表 資料以B樹結構,存放在主鍵約束所對應的索引段中
簇表 簇有共享相同資料庫的一組表組成。在某些情況下,使用簇表可以節省儲存空間。
分割槽表 資料被劃分為更小的部分,並且儲存到相應的分割槽段中,每個分割槽可以獨立管理和操作。
1.1 資料型別
資料型別
引數
描述
char(n)
n=1 to 2000位元組
定長字串,n位元組長,如果不指定長度,預設為1個位元組長(一個漢字為2位元組)
varchar2(n)
n=1 to 4000位元組
可變長的字串,具體定義時指明最大長度n,這種資料型別可以放數字、字母以及ASCII碼字符集(或者EBCDIC等資料庫系統接受的字符集標準)中的所有符號。如果資料長度沒有達到最大值n,Oracle 8i會根據資料大小自動調節欄位長度,如果你的資料前後有空格,Oracle 8i會自動將其刪去。VARCHAR2是最常用的資料型別。
可做索引的最大長度3209。
number(m,n)
m=1 to 38
n=-84 to 127
可變長的數值列,允許0、正值及負值,m是所有有效數字的位數,n是小數點以後的位數。
如:number(5,2),則這個欄位的最大值是99,999,如果數值超出了位數限制就會被擷取多餘的位數。
如:number(5,2),但在一行資料中的這個欄位輸入575.316,則真正儲存到欄位中的數值是575.32。
如:number(3,0),輸入575.316,真正儲存的資料是575。
date
無
從公元前4712年1月1日到公元4712年12月31日的所有合法日期,
long
無
可變長字元列,最大長度限制是2GB,用於不需要作字串搜尋的長串資料,如果要進行字元搜尋就要用varchar2型別。
raw(n)
n=1 to 2000
可變長二進位制資料,在具體定義欄位的時候必須指明最大長度n,Oracle 8i用這種格式來儲存較小的圖形檔案或帶格式的文字檔案,如Miceosoft Word文件。
raw是一種較老的資料型別,將來會逐漸被BLOB、CLOB、NCLOB等大的物件資料型別所取代。
long raw
無
可變長二進位制資料,最大長度是2GB。Oracle 8i用這種格式來儲存較大的圖形檔案或帶格式的文字檔案,如Miceosoft Word文件,以及音訊、視訊等非文字檔案。
在同一張表中不能同時有long型別和long raw型別,long raw也是一種較老的資料型別,將來會逐漸被BLOB、CLOB、NCLOB等大的物件資料型別所取代。
blob
clob
nclob
無
三種大型物件(LOB),用來儲存較大的圖形檔案或帶格式的文字檔案,如Miceosoft Word文件,以及音訊、視訊等非文字檔案,最大長度是4GB。
LOB有幾種型別,取決於你使用的位元組的型別,Oracle 8i實實在在地將這些資料儲存在資料庫內部儲存。
可以執行讀取、儲存、寫入等特殊操作。
bfile
無
在資料庫外部儲存的大型二進位制物件檔案,最大長度是4GB。
這種外部的LOB型別,通過資料庫記錄變化情況,但是資料的具體儲存是在資料庫外部進行的。
Oracle 8i可以讀取、查詢BFILE,但是不能寫入。
大小由作業系統決定。
1.2建立表的語法
Create table [schema,] table_name(
column_name data_type [default express] [constraint][,column_name data_type [default express] [constraint]][,column_name data_type [default express] [constraint]]
);
上面的一些解釋,需要明白下,[]表示這在建立表的時候是可選的。而沒有[]這個東西表明在建立的時候 是必須要寫的!~~~比方說[constraint] 這個給當前列加約束,那麼約束是可以加或者不加的!
Scheme:指定表所屬的使用者名稱或者所屬的使用者模式名稱。
table_name:顧名思義,就是表名。
column_name:列名
data_type:資料型別,就像在1.1中的寫的。
default express:預設值。
constraint:新增列的約束,表示該列必須要滿足的規則。
比如:
not null表示非空,就是這個欄位不能為空。
1.3檢視錶資訊
當我們建立了表之後,可以通過describe(簡寫desc)進行檢視錶的結構。如下:
這個命令很有用,特別是在我們運用資料字典的時候,因為你剛開始不知道這個資料字典裡的欄位。
當然,我們還可以通過查詢資料字典試圖user_tables 來查詢表的有關資訊!
這個只是表明有這個表,那如果要檢視錶的結構呢,就像和desc一樣呢?那麼你可以用到user_tab_columns資料字典,如下:
1.4指定表的模式
在上面建立表的語法中,有一個是scheme的欄位!~,它就是指定表的模式。用來表示所屬的使用者名稱或者所屬的使用者模式名稱。如下圖:
1.4指定重做日誌
在建立表的時候,如果使用Logging字句,則表示對錶的所有操作都將記錄到重做日誌中。
接著,我們在資料字典裡user_tables進行檢視 是否果真如此,如下:
當然你也可以使用nologging這個,表示不需要日誌!~
1.5指定快取
如果一個使用者請求的資料是最近才開始使用的,那麼這個資料最有可能存放在緩衝中。那麼有人可能會問,在緩衝有什麼好處呢?其實,好處是大大滴好。因為在緩衝的話,下次要在次讀取資料的話,就不需要從磁碟中讀了,直接從緩衝力拿 不是很方便嗎?
建立表的時候,可以用cache關鍵改變這種結果。 哦 對了,Oracle 是使用LRU(least Recently Userd)來管理緩衝的。如果在表的後面加上cache的話,那麼Oracle在執行LRU的時候,就不會把這個表相關的資料給換出去。如圖:
二。修改表
建立了表之後,那當然就需要對錶進行維護咯!
新增欄位的語法:alter table tablename add (column datatype [default value][null/not null],….);
修改欄位的語法:alter table tablename modify (column datatype [default value][null/not null],….);
刪除欄位的語法:alter table tablename drop (column);
新增、修改、刪除多列的話,用逗號隔開。
2.1增加和刪除列
①增加列
語法是:
alter table 表名 add 列名 資料型別
②刪除列
語法如下:
alter table 表名 drop column 列名
你也可以同時刪除幾個,那麼列名需要用()起來~~
alter table 表名 drop column (列名1,列名2.。。)
比如:alter table mybook3 drop column publicdata; 就把剛的那列刪除了。
2.2使用unused
如果對一個表刪除大量的資料,由於需要對每個列的記錄進行處理,所以刪除的速度可能會很慢。這個時候,我們可以使用關鍵字unused來代替這個操作!~啥意思呢?其實這在使用者的角度來說,這個和刪除是沒有分別的,只是被標記為unused的欄位依然留在資料庫中,可以想象為被註釋了,實質上空間並沒有釋放。
語法:
alter table 表名 set unused(列名);
通過資料字典user_unused_col_tabs可以檢視資料中的有哪些欄位被標記為unused。
當然 也可以刪除這個標記,語法如下:
alter table 表名 drop unused 列名
2.2更新列
有時候,我們建立了表之後,發現需要對一些欄位進行修改,比如更新列名、列的資料型別、數字列的精度以及列的預設值等等。
①修改列名
更新列的語法:
alter table 表名 rename column 老的列名 to 新的列名
②修改列的資料型別
在我們修改資料型別的時候,我想要注意2點:
☆在表裡有資料的情況下,一般情況下我們無需把資料的長度由短向長的改變,為什麼呢?很簡單啊,會精度丟失呀!~但是你可以這麼做,只是你要知道後果。
☆當表裡沒資料時,那就可以逆向進行改變了。
語法如下:
alter table 表名 modify 列名 新的資料型別
修改列的精度 也是一樣道理!
③修改列的預設值
語法如下:
alter table 表名 modify(列名 default 預設值)
2.3重新命名錶
語法:
alter table 表名 rename to 新
NOTE;對錶進行重新命名很簡單呢,但是不建議這樣用。因為這樣做的影響非常的大。雖然Oracle可以自動更新資料字典中表的外來鍵、約束和表關係等,但是還不能更新資料庫中的儲存程式碼等等。所以,需要謹慎使用。
注意:重點有一個表名為tb,欄位段名為name,資料型別nchar(20)。
1、假設欄位資料為空,則不管改為什麼欄位型別,可以直接執行:
alter table tb modify (name nvarchar2(20));
2、假設欄位有資料,則改為nvarchar2(20)可以直接執行:
alter table tb modify (name nvarchar2(20));
3、假設欄位有資料,則改為varchar2(40)執行時會彈出:“ORA-01439:要更改資料型別,則要修改的列必須為空”,這時要用下面方法來解決這個問題:
/*修改原欄位名name為name_tmp*/
alter table tb rename column name to name_tmp;
/*增加一個和原欄位名同名的欄位name*/
alter table tb add name varchar2(40);
/*將原欄位name_tmp資料更新到增加的欄位name*/
update tb set name=trim(name_tmp);
/*更新完,刪除原欄位name_tmp*/
alter table tb drop column name_tmp;
總結:
1、當欄位沒有資料或者要修改的新型別和原型別相容時,可以直接modify修改。
2、當欄位有資料並用要修改的新型別和原型別不相容時,要間接新建欄位來轉移。
2.4刪除表定義
如果使用者需要刪除所建立的表的定義,可以使用如下語法:
drop table 表名 [cascade constraints | purge]
我們需要知道的是刪除表定義和刪除表資料的區別,
刪除表定義,刪除表的結構和資料都不存在。
刪除表資料,只是刪除資料但是結構還在。
在使用drop table語句的時候 ,可以使用如下2個引數:
★cascade constraints
表示在刪除表,不僅刪除本表,而且刪除所有應用這個表的試圖、約束等等。因為有些表因為關係(比如外來鍵,這個下個章節會說),所以刪除不了,會提示有錯,那這個時候你需要使用這個。
我新建2個表:
班級表:myclass
學生表ok,我們有了上面的環境之後,我們往2個表中隨便插入一些資料。然後,我現在刪除myclass表,結果如下:
現在,我們把cascade constraints 這個加上,結果如下:
purge
表示在刪除表定義之後,立即釋放該表所佔的資源空間。
語法
drop table 表名 purge;
表名應該以字母開頭,可以在表名中包含數字,下劃線,#和$等。
一、建立表:
第一種:直接建立
create table 表名
(
field1 type[(size)] [index1],
field2 type[(size)] [index2],
......,
[[multifieldindex],...]
)
第二種:從其他表中建立表
create table 表名 as select語句.但是這個select語句如果涉及到long資料型別,就不行了。
建立表時,把較小的不為空的欄位放在前面。可以給欄位加上約束條件。
新增列 alter table 表名 add 列定義
更改列 alter table 表名 modify (列名 新屬性, ......);
刪除列 alter table 表名 drop column 列名s [cascade constraint]
alter table 表名 drop unused colunm
未用列 alter table 表名 set unused column 列名 [cascade constraint]
更改表名 rename 原來表名 to 新表名
create table TestA
(
NID NUMBER not null,
FNAME VARCHAR2(40),
PLACE VARCHAR2(40),
PRICE NUMBER,
a VARCHAR2(10)
)
insert into TestA values (1,'李達','北京',123,'你好');
insert into TestA values (2,'浩達','上海',1234,'好');
insert into TestA values (3,'熊愛華','南京',153,'到好');
insert into TestA values (4,'離線','吉林',183,'你');
commit;
select * from TestA
增加一列:
alter table TestA add b varchar2(10);
alter table TestA add d varchar2(10);
alter table TestA add e varchar2(10);
刪除一列:
alter table TestA drop column b;
更改欄位名:
1.把TestA 中的列 a 改為 c
alter table TestA rename column a to c;
2.把 TestA 表重新命名為 TestB 表
alter table TestA rename to TestB;
select * from TestB for update
將一列的資料更新到另一列,可以用CAST函式進行資料型別轉換
UPDATE 表名 SET 欄位名 = CAST(欄位名1 AS VARCHAR2(30));
update TestB set d = cast(price as int);整數
update TestB set e = price;
-----Oracle修改欄位型別和長度語句:
1、假設欄位資料為空時,則不管改為什麼欄位型別,都可以直接執行:
ALTER TABLE tableName modify(columnName 型別);
例如:
alter table TestB modify(f varchar(255));
2、假設欄位裡有資料,則改為nvarchar2(30)可以直接執行:
alter table TestB modify (e nvarchar2(30));
3、假設欄位有資料,則改為varchar2(30)執行時會彈出:"ORA-01439:要更改資料型別,則要修改的列必須為空",
這時要用上面的方法來解決這個問題:
--------修改原欄位名 price 為 price_tmp
alter table TestB rename column price to price_tmp;
----------增加一個和原欄位名同名的欄位name
alter table TestB add price varchar2(40);
--------將原欄位 price_tmp 資料更新到增加的欄位 price
update TestB set price=trim(price_tmp);
主要講述Alter table語句的用法,對錶進行修改,alter table 語句可以執行以下任務:
1、新增、修改或刪除列
2、新增或刪除約束
3、啟用或禁用約束
一、新增列(alter table table_name add 列名 型別)
⑴、向表order_status2新增一個名為modified_by的列,型別為integer
SQL>alter table order_status2 add modified_by integer;
向表order_status2新增一個名為initially_created的列,型別為date,預設為sysdate
⑵、SQL>alter table order_status2 add initially_created date default sysdate not null;
二、修改列(alter table table_name modify 列名 ….)
1、修改列的長度,條件是該列的型別的長度可以修改,如:char或varchar2
2、修改數字列的精度
3、修改列的資料型別
4、修改列的預設值
以下將一一舉例說明:
⑴修改列的長度
將表order_status2中status列的長度從10增加到20(型別為varchar2)
SQL>alter table order_status2 modify status varchar2(20);
注:只有在表中還沒有任何行或所有列都為空值時才可以減小列的長度
⑵修改數字列的精度
將order_status2中id列的精度從40修改為20(型別為number)
SQL>alter table order_status2 modify id number(20);
注:只有在表中還沒有任何行或所有列都為空值時才可以減小數字列的精度
⑶修改列的資料型別
將order_status2表中status列的資料型別從varchar2修改為char
SQL>alter table order_status2 modify status char(20);
⑷修改列的預設值
將order_status2表中last_modified列的預設值修改為sysdate-1
SQL>alter table order_status2 modify last_modified default sysdate-1;
⑸刪除列
將order_status2表中的initially_creaded列刪除
SQL>alter table order_status2 drop column initially_created;
三、新增約束(CHECK、NOT NULL、PRIMARY KEY、FOREIGN KEY、UNIQUE、CHECK OPTION、READ ONLY等)
⑴新增CHECK約束
向表order_status2中status列新增一個check約束
SQL>alter table order_status2 add constraint order_status2_status_chk check (status in (‘PLACED’,’PENDING’,’SHIPPED’));
新增一個ID約束,限制ID的值大於0;
SQL>alter table order_status2 add constraint order_status2_id_chk check (id>0);
⑵新增NOT NULL約束
向order_status2表中status列新增一個NOT NULL約束
SQL>alter table order_status2 modify status constraint order_status2_status_nn not null;
對modified_by 列新增一個NOT NULL約束
SQL>alter table order_status2 modify modified_by constraint order_status2_modified_by_nn not null;
SQL>alter table order_status2 modify last_modified not null;
⑶新增FOREIGN KEY約束
使用alter table首先從order_status2中刪除modified_by列,然後新增一個引用employees.employee_id列的FOREIGN KEY約束;
SQL>alter table order_status2 drop column modified_by;
SQL>alter table order_status2 add constraint order_status2_modified_by_fk modified_by references employees(employee_id);
使用一個帶有FOREIGN KEY 約束的ON DELETE CASCADE子句,可以指定在父表中刪除一行記錄時,子表中匹配的所有行也都將被刪除
SQL>alter table order_status2 drop column modified_by;
SQL>alter table order_status2 add constraint order_status2_modified_by_fk modified_by references employee(employee_id) on delete cascade;
即當employee表中刪除一行記錄時,在order_status2表所有匹配的行也都將被刪除
SQL>alter table order_status2 add constraint order_status2_modified_by_fk modified_by references employee(employee_id) on delete set null;
即當employee表中刪除一行記錄時,在order_status2表所有匹配的行也都將被設定為空值
⑷新增UNIQUE約束
向order_status2表的status列新增一個UNIQUE約束
SQL>alter table order_status2 add constraint order_status2_status_uq unique(status);
⑸刪除約束
使用alter table的drop constraint子句可以刪除約束
SQL>alter table order_status2 drop constraint order_status2_status_uq;
⑹禁用約束
以下是新增一個UNIQUE約束並禁用
SQL>alter table order_status2 add constraint order_status2_status_uq unique(status) disable;
禁用一個現有的約束
SQL>alter table order_status2 disable constraint order_status2_status_nn;
⑺啟用約束
以下是啟用order_status2_status_uq約束
SQL>alter table order_status2 enble constraint order_status2_status_uq;
通過指定ENABLE NOVALIDATE,可以選擇只對新資料應用某個約束
SQL>alter table order_status2 enable novalidate constraint order_status2_status_uq;
⑻延遲約束
延遲約束(deferred constraint)是在事務被提交時強制執行的約束
INITIALLY IMMEDIATE:是每次向表中新增資料、修改表的資料或刪除資料時都要檢查這個約束(這與約束的預設行為相同)
INITIALLY DEFERRED:在事務提交(即執行commit命令)時才會檢查約束
SQL>alter table order_status2
add constraint order_status2_status_uq unique(status)
deferrable initially deferred|immediate;
獲得相關約束資訊
通過查詢user_constraints可以獲得有關約束的資訊
使用all_constraints可以獲得所有可以訪問的約束的資訊
SQL>select constraint_name,constraint_type,status,deferrable,deferred
From user_constraints
Where table_name=upper(‘order_status2’);
獲得有關列的約束資訊
通過查詢user_cons_columns可以獲得有關列的約束資訊
使用all_con_columns可以獲得所有可以訪問的列的約束資訊
SQL>column column_name format a15
SQL>select constraint_name,column_name
From user_cons_columns
Where table_name=upper(‘order_status2’);
下面是對user_constraints和user_cons_columns進行的聯合查詢
SQL>select ucc.column_name,ucc.constraint_name,uc.constraint_type,uc.status
From user_constraints uc,user_cons_columns ucc
Where uc.table_name=ucc.table_name
And uc.constraint_name=ucc.constraint_name
And ucc.table_name=upper(‘order_status2’);
⑼重新命名錶
SQL>rename order_status2 to order_state;
⑽向表新增註釋
以下是向表order_status2新增註釋
SQL>comment on table order_status2 is ‘order_status2 stores the of an order’;
以下是向列order_status2.last_modified新增註釋
SQL>comment on column order_status2.last_modified is ‘last_modified stores the date and time the order was modified last’;
使用user_tab_comments檢視獲取表的註釋
SQL>select * from user_tab_comments where table_name=’ORDER_STATUS2’;
使用user_col_comments檢視獲取有關列的註釋
SQL>select * from user_col_comments where table_name=’ORDER_STATUS2’;
⑾截斷表
SQL>truncate table order_status2; (能降低高水位,回收空間,只刪除表的資料,不刪除此表)
SQL>drop table order_status2;
---更新完,刪除原欄位 price_tmp
alter table TestB drop column price_tmp;
注意:欄位沒有資料或修改的新型別和原型別相容時,可以直接modify修改,否則要新建間接欄位來轉移
刪除表 drop table 表名 [cascade constraints] 刪除表後,表上的索引,觸發器,許可權,完整性約束等都會被刪除。
二、表的約束條件
1. check:
確保指定列中的值符合一定條件。check約束可以涉及該行的同屬於check約束的其他資料列,但是不能涉及其他行或者其他表。單一的資料列可以有多個check保護,一個check約束可以保護多個資料列。可以在create table時建立check約束,也可以在alter table時修改表的約束。
其語句格式為 constraint [約束名] check(codition). 約束名不是必須的,但是最好有一個名字。下面是一個check約束的例子:
create table 表名
(
a1 int constraint chka1 check (a1 in (1,0)),
a2 int
)
或者
alter table 表名 add constraint(s) chka1 check(a1 in (1,0));
alter table 表名 disable/enable/drop constraint(s) chka1;
2. not null:
它作用在單一資料列上,保證資料列必須要有資料值。當not null是在alter table時才新增上時,寫法有所不同:
create table 表名
(
a1 int not null,
a2 int
)
alter table 表名 modify a2 not null
3. unique:
保證那些具有惟一性但又不是主鍵的一部分列的唯一性。可以保護多個列,唯一性約束與表一起建立,可以用alter table語句修改它:
create table 表名
( a1 int unique,
a2 int)
alter table 表名 add constraints 約束名 unique(列名s)
alter table 表名 disable /enable/ drop constraint(s) 約束名
不能刪除帶有外來鍵指向的表的唯一性約束,除非先禁用或者刪除了外來鍵。刪除或者禁用唯一性約束通常會同時刪除相關聯的唯一索引,降低效能,要避免這種情況,可以在唯一性約束保護的資料列上先建立非唯一性索引,再新增唯一性約束。
4. primary key:
是表中的一列或者多列,決定表中每個行的唯一性,主鍵列必須是not null。如果是複合主鍵,要放入括號中。比如:
create table 表名
(
stuid int,
courseid int,
primary key(列名1, 列名2, ......),
score float
)
alter table 表名 add constraints 主鍵名 primary key (列名s)
alter table 表名 drop/disable/enable primary key(或者用名字);
5. foreign key:
下面是一個例子:
create table a create table b
( (
a1 int primary key, b1 int primary key,
a2 int not null, b2 int not null,
a3 int unique )
)
create table c
(
ca int,
cb int,
primary key(ca, cb),
constraint 外來鍵名1 foreignkey(本表列1) references 其他表(其他表中對應列),
constraint 外來鍵名2 foreignkey(本表列2) references 其他表(其他表中對應列)
)
alter table 表名 add constraints 外來鍵名 foreign key(本表列名) references 其他表(其他表中對應列);
alter table 表名 disable/enable/drop constraints 外來鍵名
1、複製表結構(不復制資料):
create table 臨時表名稱 as select * from 源表名稱 where 1=2;
例如:
create table TEMP_SYS_USER as select * from SYS_USER where 1=2;
commit;
2、複製表結構(同時複製資料):
create table 臨時表名稱 as select * from 源表名稱;
例如:
create table TEMP_SYS_USER as select * from SYS_USER;
commit;
3、設定某列值(所有記錄該列值都相同):
update 表名 set 表名.列名=要設定的值(若是字串,格式為:'具體值');
例如:
update TEMP_SYS_USER set TEMP_SYS_USER.USR_FLAG=1;
commit;
4、設定某列值(按條件設定):
update 表名 set 表名.列名=要設定的值(若是字串,格式為:'具體值')where 條件;
例如:
update TEMP_SYS_USER set TEMP_SYS_USER.USR_FLAG=1 where TEMP_SYS_USER.USR_ID>187;
commit;
5、以插入的方式將table2中的資料插入到table1中(相當於兩表合併)
insert into table1 select * from table2 ;
commit;
6、刪除零時表:
drop table TEMP_SYS_USER;
commit;
7、設定時間型別資料:
update table1 set table1.djrq=to_date('1977-01-01','yyyy-mm-dd')
where table1.shiyongbumen='一隊' and table1.djrq is null;
8、查詢有重複欄位的記錄:
Select * From 表 Where 重複欄位 In (Select 重複欄位 From 表 Group By 重複欄位 Having Count(*)>1);
9、查詢表中主鍵欄位的最大值:
SELECT MAX(主鍵欄位) FROM 表;
(1)建立表的基本語法如下:
Sql程式碼
create table tableName(columnName dataType [default expression][column columnStraint],...n) [tablespace tableSpaceName]
(2)修改表的基本語法如下:
Java程式碼
alter table tableName
[add(columnName dataType [default expression][column columnStraint],...n)] --新增列
[modify(columnName [dataType][default expression][columnStraint],...n)] --修改列
[drop drop_clause] --刪除列或約束條件 drop column columnName
(3)刪除表的語法:drop table tableName.
(4)在往表中插入記錄時,如果需要插入某列的值為空,則值必須置為null,如果列值指定為該列的預設值,則用default。
(5)merge語句,使用該語句可以實現對錶的更新或插入。語法格式如下:
Sql程式碼
merge into tableName using tableName on(join_condition) when matched then update set...
when not matched then insert(...) values(...)
這個語句的意思是把using表合併到into表,合併條件是on(condition),當條件滿足時只能是更新into表中的對應的記錄,當條件不滿足時,則也只能是往into表裡面新增對應的資料,而該資料中也只能使用using表中當前記錄對應的資料。
示例如下:
假設有一個student表,那麼以下語句就可以實現當a的id大於b的id的時候把所有student的年齡加2,否則就新增一條記錄。
Sql程式碼
merge into student a using student b on(a.id>b.id) when matched then update set age=age+2 when not matched then insert(id,name,age,sex,no)
values(b.id+100,b.name,b.age,b.sex,b.no);
(6)刪除表記錄之delete和truncate。
delete的語法格式如下:
delete from tableName [where condition]
該語句的意思是刪除tableName表中滿足condition條件的記錄,當condition省略時則刪除表中所有記錄。
truncate的語法格式如下:
truncate table tableName
該語句的意思是刪除tableName表中的所有記錄,使用truncate可以釋放佔用的資料塊表空間。truncate刪除是不能回滾的,而delete刪除是可以回滾的。正因為如此使用truncate刪除所有記錄的速度比用delete刪除所有記錄的速度快。
臨時表的特點:
1. 多使用者操作的獨立性:對於使用同一張臨時表的不同使用者,ORACLE都會分配一個獨立的臨時表,這樣就避免了多個使用者在對同一張臨時表操作時發生交叉,從而保證了多個使用者操作的併發性和獨立性;
2. 資料的臨時性:既然是臨時表,顧名思義,存放在該表中的資料是臨時性的。ORACLE根據你建立臨時表時指定的引數(On Commit Delete Rows / On Commit Preserve Rows),自動將資料TRUNCATE掉。
臨時表的不足:
1. 不支援lob物件,這也許是設計者基於執行效率的考慮,但實際應用中確實,要此功能時就無法使用臨時表了。
2. 不支援主外來鍵關係。
臨時表用於何處
在對多表做關聯查詢時,其中每張表的資料量都比較大,而多表關聯後,所得到的結果集確是相當的小且查詢的結果的速度比較快,那麼這時可以考慮用臨時表。
臨時表分兩種型別的臨時表:
1. 會話級臨時表
2. 事物級臨時表
臨時表:顧明思義,存在該表的資料是臨時的。
會話臨時表:該臨時表肯定與會話有關。會話在不退出時,則些臨時表中的資料存在,會話退出,該臨時表中的資料也會隨之消失。在多使用者操作的情況下,一個會話從來不阻塞另一個會話使用臨時表。即使鎖定臨時表,一個會話也不會阻塞其他會話使用臨時表。其語法為:
Create global temporary table table_name
(col1 type1, col2 type2 …) On commit preserve rows;
示例:
Create global temporary table temp_emp
(empno number(8),
Ename varchar2(30),
Sal number(8,2)
)
On commit preserve rows;
事物臨時表:指該臨時表與事務相關,當進行事務提交或者事務回滾的時候,臨時表中的資料將自行被截斷,其他的內容和會話級的臨時表的一致(包括退出SESSION的時候,事務級的臨時表也會被自動截斷)。語法為:
Create global temporary table table_name
(col1 type1, col2 type2 …)
On commit delete rows;
示例:
Create global temporary table temp_dept
(d_no number(4),
D_name varchar2(30),
D_num number(8)
)
On commit delete rows;
會話臨時表和事物臨時表的區別:
在語法上,會話臨時表採用on commit preserve rows,而事物臨時表採用on commit delete rows;在用途上,會話級臨時表只會在會話結束時,臨時表中的資料才會被截斷。而事物臨時表則不管是在事物提交(commit)、事物回滾(rollback)或會話結束,臨時表中的資料都會被截斷。
ORACLE中給表、列增加註釋以及讀取註釋
1、給表填加註釋:SQL>comment on table 表名 is '表註釋";
2、給列加註釋:SQL>comment on column 表.列 is '列註釋';
3、讀取表註釋:SQL>select * from user_tab_comments where comments is not null;
4、讀取列註釋:SQL>select * from user_col_commnents where comments is not null and table_name='表名';
附表USER_TAB_COMMENTS和user_col_comments的結構:
1、user_tab_comments由table_name、table_type和comments三部分組成。
1、建立表
在Oracle資料庫中,使用者可以根據使用者不同的需求建立不同型別的表,常用的表型別有如下:
型別 說明
堆表 資料按照堆組織,一無系方式存放在單獨的表欄位中,也是標準表,我們平常用的都是堆表。
索引表 資料以B樹結構,存放在主鍵約束所對應的索引段中
簇表 簇有共享相同資料庫的一組表組成。在某些情況下,使用簇表可以節省儲存空間。
分割槽表 資料被劃分為更小的部分,並且儲存到相應的分割槽段中,每個分割槽可以獨立管理和操作。
1.1 資料型別
資料型別
引數
描述
char(n)
n=1 to 2000位元組
定長字串,n位元組長,如果不指定長度,預設為1個位元組長(一個漢字為2位元組)
varchar2(n)
n=1 to 4000位元組
可變長的字串,具體定義時指明最大長度n,這種資料型別可以放數字、字母以及ASCII碼字符集(或者EBCDIC等資料庫系統接受的字符集標準)中的所有符號。如果資料長度沒有達到最大值n,Oracle 8i會根據資料大小自動調節欄位長度,如果你的資料前後有空格,Oracle 8i會自動將其刪去。VARCHAR2是最常用的資料型別。
可做索引的最大長度3209。
number(m,n)
m=1 to 38
n=-84 to 127
可變長的數值列,允許0、正值及負值,m是所有有效數字的位數,n是小數點以後的位數。
如:number(5,2),則這個欄位的最大值是99,999,如果數值超出了位數限制就會被擷取多餘的位數。
如:number(5,2),但在一行資料中的這個欄位輸入575.316,則真正儲存到欄位中的數值是575.32。
如:number(3,0),輸入575.316,真正儲存的資料是575。
date
無
從公元前4712年1月1日到公元4712年12月31日的所有合法日期,
long
無
可變長字元列,最大長度限制是2GB,用於不需要作字串搜尋的長串資料,如果要進行字元搜尋就要用varchar2型別。
raw(n)
n=1 to 2000
可變長二進位制資料,在具體定義欄位的時候必須指明最大長度n,Oracle 8i用這種格式來儲存較小的圖形檔案或帶格式的文字檔案,如Miceosoft Word文件。
raw是一種較老的資料型別,將來會逐漸被BLOB、CLOB、NCLOB等大的物件資料型別所取代。
long raw
無
可變長二進位制資料,最大長度是2GB。Oracle 8i用這種格式來儲存較大的圖形檔案或帶格式的文字檔案,如Miceosoft Word文件,以及音訊、視訊等非文字檔案。
在同一張表中不能同時有long型別和long raw型別,long raw也是一種較老的資料型別,將來會逐漸被BLOB、CLOB、NCLOB等大的物件資料型別所取代。
blob
clob
nclob
無
三種大型物件(LOB),用來儲存較大的圖形檔案或帶格式的文字檔案,如Miceosoft Word文件,以及音訊、視訊等非文字檔案,最大長度是4GB。
LOB有幾種型別,取決於你使用的位元組的型別,Oracle 8i實實在在地將這些資料儲存在資料庫內部儲存。
可以執行讀取、儲存、寫入等特殊操作。
bfile
無
在資料庫外部儲存的大型二進位制物件檔案,最大長度是4GB。
這種外部的LOB型別,通過資料庫記錄變化情況,但是資料的具體儲存是在資料庫外部進行的。
Oracle 8i可以讀取、查詢BFILE,但是不能寫入。
大小由作業系統決定。
1.2建立表的語法
Create table [schema,] table_name(
column_name data_type [default express] [constraint][,column_name data_type [default express] [constraint]][,column_name data_type [default express] [constraint]]
);
上面的一些解釋,需要明白下,[]表示這在建立表的時候是可選的。而沒有[]這個東西表明在建立的時候 是必須要寫的!~~~比方說[constraint] 這個給當前列加約束,那麼約束是可以加或者不加的!
Scheme:指定表所屬的使用者名稱或者所屬的使用者模式名稱。
table_name:顧名思義,就是表名。
column_name:列名
data_type:資料型別,就像在1.1中的寫的。
default express:預設值。
constraint:新增列的約束,表示該列必須要滿足的規則。
比如:
not null表示非空,就是這個欄位不能為空。
1.3檢視錶資訊
當我們建立了表之後,可以通過describe(簡寫desc)進行檢視錶的結構。如下:
這個命令很有用,特別是在我們運用資料字典的時候,因為你剛開始不知道這個資料字典裡的欄位。
當然,我們還可以通過查詢資料字典試圖user_tables 來查詢表的有關資訊!
這個只是表明有這個表,那如果要檢視錶的結構呢,就像和desc一樣呢?那麼你可以用到user_tab_columns資料字典,如下:
1.4指定表的模式
在上面建立表的語法中,有一個是scheme的欄位!~,它就是指定表的模式。用來表示所屬的使用者名稱或者所屬的使用者模式名稱。如下圖:
1.4指定重做日誌
在建立表的時候,如果使用Logging字句,則表示對錶的所有操作都將記錄到重做日誌中。
接著,我們在資料字典裡user_tables進行檢視 是否果真如此,如下:
當然你也可以使用nologging這個,表示不需要日誌!~
1.5指定快取
如果一個使用者請求的資料是最近才開始使用的,那麼這個資料最有可能存放在緩衝中。那麼有人可能會問,在緩衝有什麼好處呢?其實,好處是大大滴好。因為在緩衝的話,下次要在次讀取資料的話,就不需要從磁碟中讀了,直接從緩衝力拿 不是很方便嗎?
建立表的時候,可以用cache關鍵改變這種結果。 哦 對了,Oracle 是使用LRU(least Recently Userd)來管理緩衝的。如果在表的後面加上cache的話,那麼Oracle在執行LRU的時候,就不會把這個表相關的資料給換出去。如圖:
二。修改表
建立了表之後,那當然就需要對錶進行維護咯!
新增欄位的語法:alter table tablename add (column datatype [default value][null/not null],….);
修改欄位的語法:alter table tablename modify (column datatype [default value][null/not null],….);
刪除欄位的語法:alter table tablename drop (column);
新增、修改、刪除多列的話,用逗號隔開。
2.1增加和刪除列
①增加列
語法是:
alter table 表名 add 列名 資料型別
②刪除列
語法如下:
alter table 表名 drop column 列名
你也可以同時刪除幾個,那麼列名需要用()起來~~
alter table 表名 drop column (列名1,列名2.。。)
比如:alter table mybook3 drop column publicdata; 就把剛的那列刪除了。
2.2使用unused
如果對一個表刪除大量的資料,由於需要對每個列的記錄進行處理,所以刪除的速度可能會很慢。這個時候,我們可以使用關鍵字unused來代替這個操作!~啥意思呢?其實這在使用者的角度來說,這個和刪除是沒有分別的,只是被標記為unused的欄位依然留在資料庫中,可以想象為被註釋了,實質上空間並沒有釋放。
語法:
alter table 表名 set unused(列名);
通過資料字典user_unused_col_tabs可以檢視資料中的有哪些欄位被標記為unused。
當然 也可以刪除這個標記,語法如下:
alter table 表名 drop unused 列名
2.2更新列
有時候,我們建立了表之後,發現需要對一些欄位進行修改,比如更新列名、列的資料型別、數字列的精度以及列的預設值等等。
①修改列名
更新列的語法:
alter table 表名 rename column 老的列名 to 新的列名
②修改列的資料型別
在我們修改資料型別的時候,我想要注意2點:
☆在表裡有資料的情況下,一般情況下我們無需把資料的長度由短向長的改變,為什麼呢?很簡單啊,會精度丟失呀!~但是你可以這麼做,只是你要知道後果。
☆當表裡沒資料時,那就可以逆向進行改變了。
語法如下:
alter table 表名 modify 列名 新的資料型別
修改列的精度 也是一樣道理!
③修改列的預設值
語法如下:
alter table 表名 modify(列名 default 預設值)
2.3重新命名錶
語法:
alter table 表名 rename to 新
NOTE;對錶進行重新命名很簡單呢,但是不建議這樣用。因為這樣做的影響非常的大。雖然Oracle可以自動更新資料字典中表的外來鍵、約束和表關係等,但是還不能更新資料庫中的儲存程式碼等等。所以,需要謹慎使用。
注意:重點有一個表名為tb,欄位段名為name,資料型別nchar(20)。
1、假設欄位資料為空,則不管改為什麼欄位型別,可以直接執行:
alter table tb modify (name nvarchar2(20));
2、假設欄位有資料,則改為nvarchar2(20)可以直接執行:
alter table tb modify (name nvarchar2(20));
3、假設欄位有資料,則改為varchar2(40)執行時會彈出:“ORA-01439:要更改資料型別,則要修改的列必須為空”,這時要用下面方法來解決這個問題:
/*修改原欄位名name為name_tmp*/
alter table tb rename column name to name_tmp;
/*增加一個和原欄位名同名的欄位name*/
alter table tb add name varchar2(40);
/*將原欄位name_tmp資料更新到增加的欄位name*/
update tb set name=trim(name_tmp);
/*更新完,刪除原欄位name_tmp*/
alter table tb drop column name_tmp;
總結:
1、當欄位沒有資料或者要修改的新型別和原型別相容時,可以直接modify修改。
2、當欄位有資料並用要修改的新型別和原型別不相容時,要間接新建欄位來轉移。
2.4刪除表定義
如果使用者需要刪除所建立的表的定義,可以使用如下語法:
drop table 表名 [cascade constraints | purge]
我們需要知道的是刪除表定義和刪除表資料的區別,
刪除表定義,刪除表的結構和資料都不存在。
刪除表資料,只是刪除資料但是結構還在。
在使用drop table語句的時候 ,可以使用如下2個引數:
★cascade constraints
表示在刪除表,不僅刪除本表,而且刪除所有應用這個表的試圖、約束等等。因為有些表因為關係(比如外來鍵,這個下個章節會說),所以刪除不了,會提示有錯,那這個時候你需要使用這個。
我新建2個表:
班級表:myclass
學生表ok,我們有了上面的環境之後,我們往2個表中隨便插入一些資料。然後,我現在刪除myclass表,結果如下:
現在,我們把cascade constraints 這個加上,結果如下:
purge
表示在刪除表定義之後,立即釋放該表所佔的資源空間。
語法
drop table 表名 purge;
表名應該以字母開頭,可以在表名中包含數字,下劃線,#和$等。
一、建立表:
第一種:直接建立
create table 表名
(
field1 type[(size)] [index1],
field2 type[(size)] [index2],
......,
[[multifieldindex],...]
)
第二種:從其他表中建立表
create table 表名 as select語句.但是這個select語句如果涉及到long資料型別,就不行了。
建立表時,把較小的不為空的欄位放在前面。可以給欄位加上約束條件。
新增列 alter table 表名 add 列定義
更改列 alter table 表名 modify (列名 新屬性, ......);
刪除列 alter table 表名 drop column 列名s [cascade constraint]
alter table 表名 drop unused colunm
未用列 alter table 表名 set unused column 列名 [cascade constraint]
更改表名 rename 原來表名 to 新表名
create table TestA
(
NID NUMBER not null,
FNAME VARCHAR2(40),
PLACE VARCHAR2(40),
PRICE NUMBER,
a VARCHAR2(10)
)
insert into TestA values (1,'李達','北京',123,'你好');
insert into TestA values (2,'浩達','上海',1234,'好');
insert into TestA values (3,'熊愛華','南京',153,'到好');
insert into TestA values (4,'離線','吉林',183,'你');
commit;
select * from TestA
增加一列:
alter table TestA add b varchar2(10);
alter table TestA add d varchar2(10);
alter table TestA add e varchar2(10);
刪除一列:
alter table TestA drop column b;
更改欄位名:
1.把TestA 中的列 a 改為 c
alter table TestA rename column a to c;
2.把 TestA 表重新命名為 TestB 表
alter table TestA rename to TestB;
select * from TestB for update
將一列的資料更新到另一列,可以用CAST函式進行資料型別轉換
UPDATE 表名 SET 欄位名 = CAST(欄位名1 AS VARCHAR2(30));
update TestB set d = cast(price as int);整數
update TestB set e = price;
-----Oracle修改欄位型別和長度語句:
1、假設欄位資料為空時,則不管改為什麼欄位型別,都可以直接執行:
ALTER TABLE tableName modify(columnName 型別);
例如:
alter table TestB modify(f varchar(255));
2、假設欄位裡有資料,則改為nvarchar2(30)可以直接執行:
alter table TestB modify (e nvarchar2(30));
3、假設欄位有資料,則改為varchar2(30)執行時會彈出:"ORA-01439:要更改資料型別,則要修改的列必須為空",
這時要用上面的方法來解決這個問題:
--------修改原欄位名 price 為 price_tmp
alter table TestB rename column price to price_tmp;
----------增加一個和原欄位名同名的欄位name
alter table TestB add price varchar2(40);
--------將原欄位 price_tmp 資料更新到增加的欄位 price
update TestB set price=trim(price_tmp);
主要講述Alter table語句的用法,對錶進行修改,alter table 語句可以執行以下任務:
1、新增、修改或刪除列
2、新增或刪除約束
3、啟用或禁用約束
一、新增列(alter table table_name add 列名 型別)
⑴、向表order_status2新增一個名為modified_by的列,型別為integer
SQL>alter table order_status2 add modified_by integer;
向表order_status2新增一個名為initially_created的列,型別為date,預設為sysdate
⑵、SQL>alter table order_status2 add initially_created date default sysdate not null;
二、修改列(alter table table_name modify 列名 ….)
1、修改列的長度,條件是該列的型別的長度可以修改,如:char或varchar2
2、修改數字列的精度
3、修改列的資料型別
4、修改列的預設值
以下將一一舉例說明:
⑴修改列的長度
將表order_status2中status列的長度從10增加到20(型別為varchar2)
SQL>alter table order_status2 modify status varchar2(20);
注:只有在表中還沒有任何行或所有列都為空值時才可以減小列的長度
⑵修改數字列的精度
將order_status2中id列的精度從40修改為20(型別為number)
SQL>alter table order_status2 modify id number(20);
注:只有在表中還沒有任何行或所有列都為空值時才可以減小數字列的精度
⑶修改列的資料型別
將order_status2表中status列的資料型別從varchar2修改為char
SQL>alter table order_status2 modify status char(20);
⑷修改列的預設值
將order_status2表中last_modified列的預設值修改為sysdate-1
SQL>alter table order_status2 modify last_modified default sysdate-1;
⑸刪除列
將order_status2表中的initially_creaded列刪除
SQL>alter table order_status2 drop column initially_created;
三、新增約束(CHECK、NOT NULL、PRIMARY KEY、FOREIGN KEY、UNIQUE、CHECK OPTION、READ ONLY等)
⑴新增CHECK約束
向表order_status2中status列新增一個check約束
SQL>alter table order_status2 add constraint order_status2_status_chk check (status in (‘PLACED’,’PENDING’,’SHIPPED’));
新增一個ID約束,限制ID的值大於0;
SQL>alter table order_status2 add constraint order_status2_id_chk check (id>0);
⑵新增NOT NULL約束
向order_status2表中status列新增一個NOT NULL約束
SQL>alter table order_status2 modify status constraint order_status2_status_nn not null;
對modified_by 列新增一個NOT NULL約束
SQL>alter table order_status2 modify modified_by constraint order_status2_modified_by_nn not null;
SQL>alter table order_status2 modify last_modified not null;
⑶新增FOREIGN KEY約束
使用alter table首先從order_status2中刪除modified_by列,然後新增一個引用employees.employee_id列的FOREIGN KEY約束;
SQL>alter table order_status2 drop column modified_by;
SQL>alter table order_status2 add constraint order_status2_modified_by_fk modified_by references employees(employee_id);
使用一個帶有FOREIGN KEY 約束的ON DELETE CASCADE子句,可以指定在父表中刪除一行記錄時,子表中匹配的所有行也都將被刪除
SQL>alter table order_status2 drop column modified_by;
SQL>alter table order_status2 add constraint order_status2_modified_by_fk modified_by references employee(employee_id) on delete cascade;
即當employee表中刪除一行記錄時,在order_status2表所有匹配的行也都將被刪除
SQL>alter table order_status2 add constraint order_status2_modified_by_fk modified_by references employee(employee_id) on delete set null;
即當employee表中刪除一行記錄時,在order_status2表所有匹配的行也都將被設定為空值
⑷新增UNIQUE約束
向order_status2表的status列新增一個UNIQUE約束
SQL>alter table order_status2 add constraint order_status2_status_uq unique(status);
⑸刪除約束
使用alter table的drop constraint子句可以刪除約束
SQL>alter table order_status2 drop constraint order_status2_status_uq;
⑹禁用約束
以下是新增一個UNIQUE約束並禁用
SQL>alter table order_status2 add constraint order_status2_status_uq unique(status) disable;
禁用一個現有的約束
SQL>alter table order_status2 disable constraint order_status2_status_nn;
⑺啟用約束
以下是啟用order_status2_status_uq約束
SQL>alter table order_status2 enble constraint order_status2_status_uq;
通過指定ENABLE NOVALIDATE,可以選擇只對新資料應用某個約束
SQL>alter table order_status2 enable novalidate constraint order_status2_status_uq;
⑻延遲約束
延遲約束(deferred constraint)是在事務被提交時強制執行的約束
INITIALLY IMMEDIATE:是每次向表中新增資料、修改表的資料或刪除資料時都要檢查這個約束(這與約束的預設行為相同)
INITIALLY DEFERRED:在事務提交(即執行commit命令)時才會檢查約束
SQL>alter table order_status2
add constraint order_status2_status_uq unique(status)
deferrable initially deferred|immediate;
獲得相關約束資訊
通過查詢user_constraints可以獲得有關約束的資訊
使用all_constraints可以獲得所有可以訪問的約束的資訊
SQL>select constraint_name,constraint_type,status,deferrable,deferred
From user_constraints
Where table_name=upper(‘order_status2’);
獲得有關列的約束資訊
通過查詢user_cons_columns可以獲得有關列的約束資訊
使用all_con_columns可以獲得所有可以訪問的列的約束資訊
SQL>column column_name format a15
SQL>select constraint_name,column_name
From user_cons_columns
Where table_name=upper(‘order_status2’);
下面是對user_constraints和user_cons_columns進行的聯合查詢
SQL>select ucc.column_name,ucc.constraint_name,uc.constraint_type,uc.status
From user_constraints uc,user_cons_columns ucc
Where uc.table_name=ucc.table_name
And uc.constraint_name=ucc.constraint_name
And ucc.table_name=upper(‘order_status2’);
⑼重新命名錶
SQL>rename order_status2 to order_state;
⑽向表新增註釋
以下是向表order_status2新增註釋
SQL>comment on table order_status2 is ‘order_status2 stores the of an order’;
以下是向列order_status2.last_modified新增註釋
SQL>comment on column order_status2.last_modified is ‘last_modified stores the date and time the order was modified last’;
使用user_tab_comments檢視獲取表的註釋
SQL>select * from user_tab_comments where table_name=’ORDER_STATUS2’;
使用user_col_comments檢視獲取有關列的註釋
SQL>select * from user_col_comments where table_name=’ORDER_STATUS2’;
⑾截斷表
SQL>truncate table order_status2; (能降低高水位,回收空間,只刪除表的資料,不刪除此表)
SQL>drop table order_status2;
---更新完,刪除原欄位 price_tmp
alter table TestB drop column price_tmp;
注意:欄位沒有資料或修改的新型別和原型別相容時,可以直接modify修改,否則要新建間接欄位來轉移
刪除表 drop table 表名 [cascade constraints] 刪除表後,表上的索引,觸發器,許可權,完整性約束等都會被刪除。
二、表的約束條件
1. check:
確保指定列中的值符合一定條件。check約束可以涉及該行的同屬於check約束的其他資料列,但是不能涉及其他行或者其他表。單一的資料列可以有多個check保護,一個check約束可以保護多個資料列。可以在create table時建立check約束,也可以在alter table時修改表的約束。
其語句格式為 constraint [約束名] check(codition). 約束名不是必須的,但是最好有一個名字。下面是一個check約束的例子:
create table 表名
(
a1 int constraint chka1 check (a1 in (1,0)),
a2 int
)
或者
alter table 表名 add constraint(s) chka1 check(a1 in (1,0));
alter table 表名 disable/enable/drop constraint(s) chka1;
2. not null:
它作用在單一資料列上,保證資料列必須要有資料值。當not null是在alter table時才新增上時,寫法有所不同:
create table 表名
(
a1 int not null,
a2 int
)
alter table 表名 modify a2 not null
3. unique:
保證那些具有惟一性但又不是主鍵的一部分列的唯一性。可以保護多個列,唯一性約束與表一起建立,可以用alter table語句修改它:
create table 表名
( a1 int unique,
a2 int)
alter table 表名 add constraints 約束名 unique(列名s)
alter table 表名 disable /enable/ drop constraint(s) 約束名
不能刪除帶有外來鍵指向的表的唯一性約束,除非先禁用或者刪除了外來鍵。刪除或者禁用唯一性約束通常會同時刪除相關聯的唯一索引,降低效能,要避免這種情況,可以在唯一性約束保護的資料列上先建立非唯一性索引,再新增唯一性約束。
4. primary key:
是表中的一列或者多列,決定表中每個行的唯一性,主鍵列必須是not null。如果是複合主鍵,要放入括號中。比如:
create table 表名
(
stuid int,
courseid int,
primary key(列名1, 列名2, ......),
score float
)
alter table 表名 add constraints 主鍵名 primary key (列名s)
alter table 表名 drop/disable/enable primary key(或者用名字);
5. foreign key:
下面是一個例子:
create table a create table b
( (
a1 int primary key, b1 int primary key,
a2 int not null, b2 int not null,
a3 int unique )
)
create table c
(
ca int,
cb int,
primary key(ca, cb),
constraint 外來鍵名1 foreignkey(本表列1) references 其他表(其他表中對應列),
constraint 外來鍵名2 foreignkey(本表列2) references 其他表(其他表中對應列)
)
alter table 表名 add constraints 外來鍵名 foreign key(本表列名) references 其他表(其他表中對應列);
alter table 表名 disable/enable/drop constraints 外來鍵名
1、複製表結構(不復制資料):
create table 臨時表名稱 as select * from 源表名稱 where 1=2;
例如:
create table TEMP_SYS_USER as select * from SYS_USER where 1=2;
commit;
2、複製表結構(同時複製資料):
create table 臨時表名稱 as select * from 源表名稱;
例如:
create table TEMP_SYS_USER as select * from SYS_USER;
commit;
3、設定某列值(所有記錄該列值都相同):
update 表名 set 表名.列名=要設定的值(若是字串,格式為:'具體值');
例如:
update TEMP_SYS_USER set TEMP_SYS_USER.USR_FLAG=1;
commit;
4、設定某列值(按條件設定):
update 表名 set 表名.列名=要設定的值(若是字串,格式為:'具體值')where 條件;
例如:
update TEMP_SYS_USER set TEMP_SYS_USER.USR_FLAG=1 where TEMP_SYS_USER.USR_ID>187;
commit;
5、以插入的方式將table2中的資料插入到table1中(相當於兩表合併)
insert into table1 select * from table2 ;
commit;
6、刪除零時表:
drop table TEMP_SYS_USER;
commit;
7、設定時間型別資料:
update table1 set table1.djrq=to_date('1977-01-01','yyyy-mm-dd')
where table1.shiyongbumen='一隊' and table1.djrq is null;
8、查詢有重複欄位的記錄:
Select * From 表 Where 重複欄位 In (Select 重複欄位 From 表 Group By 重複欄位 Having Count(*)>1);
9、查詢表中主鍵欄位的最大值:
SELECT MAX(主鍵欄位) FROM 表;
(1)建立表的基本語法如下:
Sql程式碼
create table tableName(columnName dataType [default expression][column columnStraint],...n) [tablespace tableSpaceName]
(2)修改表的基本語法如下:
Java程式碼
alter table tableName
[add(columnName dataType [default expression][column columnStraint],...n)] --新增列
[modify(columnName [dataType][default expression][columnStraint],...n)] --修改列
[drop drop_clause] --刪除列或約束條件 drop column columnName
(3)刪除表的語法:drop table tableName.
(4)在往表中插入記錄時,如果需要插入某列的值為空,則值必須置為null,如果列值指定為該列的預設值,則用default。
(5)merge語句,使用該語句可以實現對錶的更新或插入。語法格式如下:
Sql程式碼
merge into tableName using tableName on(join_condition) when matched then update set...
when not matched then insert(...) values(...)
這個語句的意思是把using表合併到into表,合併條件是on(condition),當條件滿足時只能是更新into表中的對應的記錄,當條件不滿足時,則也只能是往into表裡面新增對應的資料,而該資料中也只能使用using表中當前記錄對應的資料。
示例如下:
假設有一個student表,那麼以下語句就可以實現當a的id大於b的id的時候把所有student的年齡加2,否則就新增一條記錄。
Sql程式碼
merge into student a using student b on(a.id>b.id) when matched then update set age=age+2 when not matched then insert(id,name,age,sex,no)
values(b.id+100,b.name,b.age,b.sex,b.no);
(6)刪除表記錄之delete和truncate。
delete的語法格式如下:
delete from tableName [where condition]
該語句的意思是刪除tableName表中滿足condition條件的記錄,當condition省略時則刪除表中所有記錄。
truncate的語法格式如下:
truncate table tableName
該語句的意思是刪除tableName表中的所有記錄,使用truncate可以釋放佔用的資料塊表空間。truncate刪除是不能回滾的,而delete刪除是可以回滾的。正因為如此使用truncate刪除所有記錄的速度比用delete刪除所有記錄的速度快。
臨時表的特點:
1. 多使用者操作的獨立性:對於使用同一張臨時表的不同使用者,ORACLE都會分配一個獨立的臨時表,這樣就避免了多個使用者在對同一張臨時表操作時發生交叉,從而保證了多個使用者操作的併發性和獨立性;
2. 資料的臨時性:既然是臨時表,顧名思義,存放在該表中的資料是臨時性的。ORACLE根據你建立臨時表時指定的引數(On Commit Delete Rows / On Commit Preserve Rows),自動將資料TRUNCATE掉。
臨時表的不足:
1. 不支援lob物件,這也許是設計者基於執行效率的考慮,但實際應用中確實,要此功能時就無法使用臨時表了。
2. 不支援主外來鍵關係。
臨時表用於何處
在對多表做關聯查詢時,其中每張表的資料量都比較大,而多表關聯後,所得到的結果集確是相當的小且查詢的結果的速度比較快,那麼這時可以考慮用臨時表。
臨時表分兩種型別的臨時表:
1. 會話級臨時表
2. 事物級臨時表
臨時表:顧明思義,存在該表的資料是臨時的。
會話臨時表:該臨時表肯定與會話有關。會話在不退出時,則些臨時表中的資料存在,會話退出,該臨時表中的資料也會隨之消失。在多使用者操作的情況下,一個會話從來不阻塞另一個會話使用臨時表。即使鎖定臨時表,一個會話也不會阻塞其他會話使用臨時表。其語法為:
Create global temporary table table_name
(col1 type1, col2 type2 …) On commit preserve rows;
示例:
Create global temporary table temp_emp
(empno number(8),
Ename varchar2(30),
Sal number(8,2)
)
On commit preserve rows;
事物臨時表:指該臨時表與事務相關,當進行事務提交或者事務回滾的時候,臨時表中的資料將自行被截斷,其他的內容和會話級的臨時表的一致(包括退出SESSION的時候,事務級的臨時表也會被自動截斷)。語法為:
Create global temporary table table_name
(col1 type1, col2 type2 …)
On commit delete rows;
示例:
Create global temporary table temp_dept
(d_no number(4),
D_name varchar2(30),
D_num number(8)
)
On commit delete rows;
會話臨時表和事物臨時表的區別:
在語法上,會話臨時表採用on commit preserve rows,而事物臨時表採用on commit delete rows;在用途上,會話級臨時表只會在會話結束時,臨時表中的資料才會被截斷。而事物臨時表則不管是在事物提交(commit)、事物回滾(rollback)或會話結束,臨時表中的資料都會被截斷。
ORACLE中給表、列增加註釋以及讀取註釋
1、給表填加註釋:SQL>comment on table 表名 is '表註釋";
2、給列加註釋:SQL>comment on column 表.列 is '列註釋';
3、讀取表註釋:SQL>select * from user_tab_comments where comments is not null;
4、讀取列註釋:SQL>select * from user_col_commnents where comments is not null and table_name='表名';
附表USER_TAB_COMMENTS和user_col_comments的結構:
1、user_tab_comments由table_name、table_type和comments三部分組成。
相關文章
- MySQL對錶和庫的一些基本操作MySql
- Python對excel的基本操作PythonExcel
- SQLAIchemy對資料基本操作SQLAI
- 資料結構(線性錶鏈式儲存)的幾個基本操作資料結構
- SQL—對資料表內容的基本操作SQL
- Go 操作 Redis 的基本操作GoRedis
- Docker的基本操作Docker
- MySQL的基本操作MySql
- git的基本操作Git
- 做什麼操作會丟失其他使用者對錶的許可權
- 陣列的基本操作陣列
- Vim命令的基本操作
- Numpy的基本操作(五)
- Hive表的基本操作Hive
- JS — 物件的基本操作JS物件
- Spring Boot的基本操作Spring Boot
- Docker映象的基本操作Docker
- Hbase shell的基本操作
- react的基本操作(1)React
- openGauss 對錶執行VACUUM
- redis基本操作Redis
- VSCode基本操作VSCode
- Docker基本操作Docker
- ElasticSearch基本操作Elasticsearch
- ElasticSearch - 基本操作Elasticsearch
- candance 基本操作
- svn基本操作
- oracle基本操作Oracle
- Hash基本操作
- linux基本操作Linux
- python基本操作Python
- FFMPEG基本操作
- dos 基本操作
- 基本操作題
- Laravel 基本操作Laravel
- HBase 基本操作
- MongoDB基本操作MongoDB
- webpack 基本操作Web
- Git基本操作Git