Oracle基礎二

數據表基本操作

 

數據庫的數據邏輯上是存儲在表空間中,物理上是存儲在數據文件中。

創建數據表

CREATE TABLE TABLE1(ID NUMBER(3) NOT NULL,NAME VARCHAR2(20) NULL);

CREATE TABLE TABLE1 AS SELECT ID,NAME FROM TABLE2;

注意:如果查詢涉及到Long數據類型,那麼CREATE TABLE ...AS SELECT 不會工作。

 

修改數據表

增加列

ALTER TABLE TABLE1 ADD createDate DATE;

修改列

ALTER TABLE TABLE1 MODIFY NAME VARCHAR(30); 

注意:大部分時候列的值爲空才能修改。

刪除數據列

ALTER TABLE TABLE1 DROP COLUMN NAME ;

 

 

更改表名

RENAME oldname TO newname;

 

 

刪除表

DROP TABLE  TABLE1;

 

清空表數據

TRUNCATE TABLE  TABLE1;

 

注意區別

區別
1。delete from後面可以寫條件,truncate不可以
2。delete from記錄是一條條刪的,所刪除的每行記錄都會進日誌,而truncate一次性刪掉整個頁,因此日至裏面只記錄頁釋放,簡言之,delete from更新日誌,truncate基本不,所用的事務日誌空間較少
3。delete from刪空表後,會保留一個空的頁,truncate在表中不會留有任何頁
4。當使用行鎖執行 DELETE 語句時,將鎖定表中各行以便刪除。truncate始終鎖定表和頁,而不是鎖定各行。
5。如果有identity產生的自增id列,delete from後仍然從上次的數開始增加,即種子不變,而truncate後,種子會恢復初始
6。truncate不會觸發delete的觸發器,因爲truncate操作不記錄各個行刪除

 

 

約束

非空約束 NO TNULL(簡單不用演示)

唯一 UNIQUE

column_name data_type constraint 約束名 unique//單列數據

constraint 約束名(多列) unique using index tablespace(table_name) storage(stored clause)

添加約束

alter table 表名 add constraint 約束名 unique(列名) using index tablespace 表空間名

 

主鍵 PRIMARY

列名後面直接加上主鍵約束

itemid varchar2(20) constraint pk_items primary key

如果主鍵約束保護多個列,必須作爲一個表約束創建

constraint pk_items primary key(itemid,itemname)  using index tablespace(table_name) storage(stored clause)

禁用或刪除

alter table items drop primary key;

alter table items disable primary key

 

外鍵 FOREIGN KEY

alter table invency

add constraint fk_invency_items

foreign key(itemid) references items(itemid);

 

條件 CHECK

 條件列約束不保護log數據類型和數據列和對象、嵌套表、varry、ref等

constraint chk_status check(status in('正常','出差','休假'));

 

約束的維護

禁用約束 alter table 表名 disable constraint 約束名

啓用約束 alter table 表名 enable constraint 約束名

刪除約束 alter table 表名 drop constraint 約束名 

序列的創建

create sequence sequence1

increment by 1 

start with 1

maxvalue 10000

minvalue 1

nocycle

cache 20或nocache

noorder //不指定排序

sequence1.currval

sequence1.nextval

drop sequence sequence1;

--------------------------------------------------------------------------------------------

索引

如果沒有建立索引的話,那麼查詢該表的任何記錄都會通過順序地逐行掃描得到,這會導致大量的磁盤i/o,從而會大大降低數據庫系統的效率,索引通常用於提高查詢效率。當然過多的索引也會使更新、插入、刪除操作花費更多的時間。

B-tree索引(如唯一索引、主鍵索引)也就是B-樹索引。基本上這些索引存儲的是所在的列值以及用來查找自身行的指向實際數據表的指針。

注意:如果索引是創建在多個列上的話,那麼第一列非常重要。第一列會單獨掃描。後面列不會。

函數索引(基於函數建立的)

反轉鍵索引(不能對位圖索引和索引組織表進行反轉鍵索引

位圖索引(爲相異值很少的列創建的),一般而言,只有當對錶中值相宜度較小的多個不同的列都使用位圖索引,這樣位圖索引纔會有用。

位圖連接索引

壓縮索引

降序索引(可以顯著優化order by x,y,z desc子句查詢)

分區索引

其他:索引組織表、簇索引、域索引、隱藏索引、虛擬索引等

創建索引

創建不唯一索引

create index idx_itemname on item(name) tablespace 表空間名;

創建唯一索引

create unique index idx_itemid on item(id) tablespace 表空間名;

創建位圖索引

create bitmap index idx_itemsdeleted on item(isdeleted) tablespace 表空間名;

創建反轉鍵索引

create unique index reidx_delivey on delivey(did,date) tablespace 表空間名 reverse;

創建函數索引(既可以是普通的B-樹索引,也可以是位圖索引)

create index idx_sub on item(substr(itemid,1,4))tablespace 表空間名;

注意:

導入數據後再創建索引

不需要爲很小的表創建索引

對於取值範圍很小的字段(如性別)應當建立位圖索引

限制表中的索引數目

爲索引設置合適的pctfree值

存儲索引的表空間最好單獨設置

使用索引

全表掃描(Full table scan):就是順序地訪問表中的每條記錄。oracle採用一次讀入多個數據塊的方式優化全表掃描。

索引掃描(index scan):可以採用基於rowid的方式訪問以提高訪問表的效率。rowid包含了表中記錄的物理位置。oracle採用索引實現了數據和存放數據的物理位置rowid之間的聯繫。通常索引提供了快速訪問rowid的方法,因此基於索引列的查詢就可以得到性能上的提高。

索引唯一掃描(index unique scan)

索引範圍掃描(index range scan)使用於2種情況:範圍的索引、非唯一性的索引

注意:全表掃描需要讀入的數據塊數等於該表的實際數據塊數

oracle評價使用索引的代價時有2個重要的數據

CF:每讀入一個索引塊要對應讀入多少個數據塊

FF:sql語句所選擇的結果集佔總的數據量的百分比

一般的估算公式是:FF*(CF+索引塊個數)

索引不是越多越好

很多時候,單列索引不如複合索引

用於多表連接的字段,加上索引列會很有用

----------------------------------------------------------------------------------

Meger更新

meger into t1 using t on(條件)

when matched then ××××

when not matched then ××××

 oracle常用函數和命令

  1、set linesize 100;  設置長度
 2、set pagesize 30;   設置每頁顯示數目
 3、em a.sql  打開記事本 
 4、@ a 執行文件a中的代碼,可指定文件的路徑 @d:a.txt
 5、conn 用戶名/密碼  根據用戶名和密碼連接數據庫 如果連接超級管理員(sys) 則應加上as sysdba;
 6、show user; 顯示當前連接的用戶
 7、select * from tab;  得到當前用戶下的所有表
 8、desc temp; 查看錶結構
 9、/  繼續執行上一個查詢語句
    clear scr;  清屏

字符函數
10、select upper('coolszy') from dual; 將小寫字母轉換成大寫,dual 爲一虛表
11、select lower('KUKA') from dual; 將大寫字母轉換成小寫
12、select initcap('kuka') from dual; 將首字母大寫
13、select concat('Hello',' world') from dual; 連接字符串,但沒有||好用select concat('Hello','world') from dual;
14、select substr('hello',1,3) from dual; 截取字符串
15、select length('hello') from dual; 求字符串長度
16、select replace('hello','l','x') from dual; 替換字符串
17、select substr('hello',-3,3) from dual; 截取後三位

補充:trim、lpad、rpad、instr

數值函數
18、select round(789.536) from dual; 四捨五入,捨去小數
19、select round(789.536,2) from dual; 保留兩位小數
20、select round(789.536,-1) from dual; 對整數進行四捨五入
21、select trunc(789.536) from dual; 捨去小數,但不進位
22、select trunc(789.536,2) from dual;
23、select trunc(789.536,-2) from dual;
24、select mod(10,3) from dual; 返回10%3的結果

補充:abs、ceil、floor、power、rand、sqrt、

日期函數
25、select sysdate from dual; 返回當前日期
26、select months_between(sysdate,'16-6月 -08') from dual; 返回之間的月數
27、select add_months(sysdate,4) from dual; 在日期上加上月數
28、select next_day(sysdate,'星期一') from dual; 求下一個星期一
29、select last_day(sysdate) from dual; 求本月的最後一天

補充、trunc、round

其中sysdate的格式

CC:世紀

WW:爲一年中的周

W:爲一個月中的周

D:爲星期幾

DDD:爲一年中的第幾天

YEAR:爲年

MONTH:爲月

DAY:爲日

 


轉換函數
30、select to_char(sysdate,'yyyy') year,to_char(sysdate,'mm'),to_char(sysdate,'dd') from dual;
31、select to_char(sysdate,'yyyy-mm-dd') from dual;
32、select to_char(sysdate,'fmyyyy-mm-dd') from dual; 取消月 日 前面的0
33、select to_char('20394','99,999') from dual; 分割錢 9表示格式
34、select to_char('2034','L99,999') from dual; 加上錢幣符號
35、select to_number('123')*to_number('2') from dual;
36、select to_date('1988-07-04','yyyy-mm-dd') from dual;

其中日期格式

YYYY:完整的年份號碼

YEAR:當前的年份拼出來

RR:年份中阿拉伯數字的最後2位

MM:2位數的月份

MONTH:當前的月份拼出來

MON:月份的前3個字母

DY:用3個字母來表示當前的星期數

DAY:當前星期數的全拼

DD:數字的月份日期值

HH24:二十四進制的小時數

MM:分鐘數

SS:秒數

數字的顯示格式

9 :代表一個數字

L:強制顯示一個當地的貨幣符號

0:強迫0顯示

.:顯示一個小數點

$:顯示美元符號

,:顯示一個千位分隔符號

 

to_number函數

to_date函數

decode函數

decode(exp,sl,r1,s2,r2....sn,rn)可以理解成增強型的if else

greatest(n1,n2,n3,...n)返回序列中最大的值

least(n1,n2,n3,...n)返回序列中最小的值

nullif(c1,c2)如果兩個指定的表達式相等,則返回空值。

nvl(c1,c2)如果c1爲NULL,則NVL函數返回c2的值,否則返回c1的值。

注意事項:c1和c2必須爲同一數據類型,除非顯示的使用TO_CHAR函數。

nvl2(c1,c2,c3)如果參數表達式c1值爲NULL,則NVL2()函數返回參數表達式c3的值;如果參數表達式c1值不爲NULL,則NVL2()函數返回參數表達式c2的值。

 

 

 

 

 

通用函數
37、select nvl(null,0) from dual; 如果爲null,則用0代替
38、select decode(1,1,'內容是1',2,'內容是2',3,'內容是3') from dual; 類似於 switch...case...

事務處理
39、commit;  提交事務
40、rollback; 回滾事務


41、select rownum from table; 在沒一列前面顯示行號
42、drop table 表名 cascade constraint
    on delete casecade 當父表中的內容被刪除後,子表中的內容也被刪除

43、desc表名 顯示錶的結構
44、create user [username] identified by [password] 創建新的用戶
45、grant 權限1、權限2...to 用戶  給創建用戶權限
 ex:grant create session to [username] 此時只能連接到數據庫
    grant connect,resource to [username] 此時權限能滿足要求
46、alter user [username] identified by [password] 修改用戶密碼
47、alter user [username] password expired 下次登錄時提示修改密碼
48、alter user [username] account lock  鎖住用戶
49、alter user [username] account unlock  解鎖鎖用戶
50、grant select,delete on scott.emp to [username] 把scott下emp表的兩個權限給用戶
51、revoke select ,delete on scott.emo from [username] 回收權限

 

 定量謂詞

some、any、all

in 不如 exists 不如 連接查詢

 

 

概念

 

子查詢(標量子查詢、比較子查詢、相關子查詢、嵌套子查詢)

集合操作(union、union all、intersect、minus)

注意

對於blob、clob、bfile、varry或嵌套表類型的列,不能使用集合操作符

對於long類型的列,不能使用集合操作符union、intersect、minus

多表連接

基本連接(多個表之間用逗號隔開)

交叉連接(cross join)實際就是一個 inner join on true

自連接(對同一個表進行多次的引用)

自然連接 natural join

條件連接(有on條件)主要有內連接、外連接(左外、右外)、全外連接

層次化查詢

select [level],exp......

from table_name

[where 條件]

[start with 開始條件]

[connect by prior 連接的條件]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發佈了130 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章