1. 程式人生 > >Oracle 學習筆記(一)

Oracle 學習筆記(一)

tween 就會 重復 lte 分支 oracle comment 樹結構 ping

一、字符串函數

lower(字符串) 小寫

upper(字符串) 大寫

initcap(字符串) 首字母大寫

concat(列1,列2) 兩列合並

length(字符串) 按照字

lengthb(字符串) 按照字節

lengthc(字符串) unicode 的長度

substr(列名,m,n ) m: 開始索引號,n:截取長度

instr(字符串,字符) 字符在字符串中的位置

leading ‘a‘ from ‘aaaaaabababaaaaaaaa‘ 截取連續的前置a

trailing ‘a‘ from ‘aaaaaaababaaaaaaaa‘ 截取連續的後置a

both ‘a‘ from ‘aaaaaaababaaaaaaaa‘ 截取連續的前置和後置a

lpad(字符串,n,字符) 在字符串的左側添加n個字符

rpad(字符串,n,字符) 在字符串的右側添加n個字符

replace(字符串,字符1,字符2) 將字符1 替換成字符2

traim(字符串) 去掉字符串兩邊的空格

ltraim(字符串) 去掉字符串左邊的空格

rtraim(字符串) 去掉字符串右邊的空格

二、數字操作函數

ROUND(數字,位數) 四舍五入
TRUNC(數字,位數) 小數全部舍棄,取整
CEIL(數字) 小數全部舍棄,取整(上進一位)

ABS(數字) 數字的絕對值
ACOS(數字) 反余弦
COS(數字) 余弦
FOOR(x) 小於或等於x的最大數
LOG(數字) 對數
MOD(x,y) x/y 的余數
POWER(x,y) x的y次冪
SQRT(數字)  平方根

三、 日期操作函數

sysdate 數據庫的當前時間

nls_date_format 重新定義日期的顯示格式

alter session set nls_date_format=‘yyyy/mm/dd:hh24:mi:ss‘

round(日期1-日期2) 兩個日期之間的差,單位天,帶小數

months_between(日期1,日期2) 兩個日期間的月數

add_months(日期1,月份)

next_day(日期1,“friday”) 從日期1算起,下一個星期5是哪一天

last_day(日期1) 日期1月底是哪一天

extract(year from 日期1) 日期1中特定的部分 , year,month,day,hour,minute,second

日期進位和截取

round(date,‘mm‘)

round(date,‘month‘)

round(date,‘yyyy‘)

round(date,‘year‘)

trunc(date,‘mm‘)

trunc(date,‘month‘)

trunc(date,‘yyyy‘)

trunc(date,‘year‘)

to_char 轉換成char 類型

to_date 轉換成日期類型

to_number 轉換成數字

四、 NULL 操作

NULL 值指,空值,末賦值或不可知的值

NVL(expr1,epxr2) 如果 expr1 為非空,就返回 expr1,否則返回 epxr2, 數據類型要一致
NVL2(expr1,epxr2,epxr3) 如果 expr1 為非空,就返回 expr2, 否則返回 epxr3
NULLIF(expr1,epxr2) 如果 expr1和 epxr2 相同就返回空,否則返回 expr1
COALESCE(expr1,epxr2,...,exprn) 返回第一個非空的值

五、 分支語句

1. CASE 語句

select 列1,列2,列3,

CASE 列4

when ‘值1‘ then ‘返回值1‘

when ‘值2‘ then ‘返回值2‘

when ‘值3‘ then ‘返回值3‘

ELSE

‘值0‘

END ‘新列1‘

2. Decode 語句

Decode 語句和 CASE 語句一樣,都是分支語句,Decode 是 Oracle 自定義的,其它數據庫不支持

Decode(coll|expression,search1,result1,search2,result2,...,defaul

六、 表的連接

笛卡兒連接: cross join

如果是兩個表,第一張表的所有行與第二個表的所有行進行矩陣相乘,得到 n*m 行的結果。 避免笛卡兒連接: 給定一個正確的連接條件 表的別名一旦定義,表的本名就無效

外連接: left/right outer join

外連接分為: 左外連接 left outer join,右外連接 right outer join, outer 可省略

使用 where A.列1 = B.列1,

where A.列1 (+)= B.列1, (等價於 右外連接) 將第一張表,第二張表沒有的數據也顯示,+號不能同時出現在等號 的兩邊,只能出現在一邊 +號是oracle 特有的,出現在左邊指右外連接,在右邊指左外連接

自連接: self join

即自身連接。

自然連接: natural join

所有同名的列,都作為等值條件,且數據類型相同,不能加表的前綴 using(列名) 指定列的連接,當有多列同名時,使用其中某一列作為連接條件

七、 DDL 和 DML語句

DDL: 數據定義語言,包括表的創建,修改,刪除,驗證

DML: 數據修改語言,包括數據行的修改,刪除 表是存放數據的最基本對象。

我們將一般的表叫做 heap table (堆表),其含義為雜亂無章的存放數據,堆表是數據庫的重要組織形式,它表別於索引表和 cluster 表。

表的名稱規則:

標準 ASCII 碼可以描述

字母開頭 30個字母內

不能是保留字

可以包含大小寫字母 ,數字,下畫線,$,# 千萬不要使用漢字作為表的名稱或列的名稱,因為漢字是ASCII碼所不能描述的, ORACLE 的核心是 ASCII 編寫的

在現有表的基礎上創建新表: create table t2 as select * from emp; 這個新表會包括數據

如果不想包含數據,加一個false 的條件選擇 create table t2 as select * from emp where 1=0;

修改表結構:

如果列為null,可以隨意修改列的類型和寬度。 如果有數據,修改會受到限制,但不會破壞數據。

Alter table t2 modify(name varchar(20)); Alter table t2 add(name varchar(50));

修改表的名稱: rename t2 to newTableName

修改列的名稱: Alter table t2 rename column c1 to newColumnName

表註釋: comment on table t2 is ‘註釋內容‘

列註釋: comment on column c1 is ‘列註釋‘

刪除表: drop table t2, 在commit 前,表末真正刪除

顯示回收站的信息: show recyclebin

將回收站的表還原: flashback table t2 to before drop; flashback table t2 to before drop rename to tt2;

清空回收站內指定的表: purge table t2;

清空當前用戶的回收站,不影響其它用戶的回收站: purge recyclebin; DML 語句

DML,數據操作語言,insert, update, delete, merge

插入數據: insert into t2(c1,c2,c3) values(v1,v2,v3); 在插入時,沒有列出的列,就會插入null,如果該列有defalult 值 ,就會使用默認值 當插入日期的時候, 最好強制轉換成日期類型,使用to_date 函數

修改數據: update t2 set c1=‘1‘ where 子句

刪除行: delete t2 where 子句

事務: 提交事務: commit; 回滾事務: rollback;

約束: 添加約束: alter table t2 add constraint 約束名稱 unique(列名)

alter table t2 add constraint 約束名稱 primary key(列名)

alter table t2 add constraint 約束名稱 check(length(列)>10)

主鍵不是必需的,可以沒有,主鍵是通過索引實現的,索引的名稱和主鍵的名稱相同 外鍵:

alter table t2 add constraint 名稱 foreign key(列名) references 表名(列名)

級連的外鍵,主表行被刪除,子表的相關列自動被賦予 NULL 值

alter table t2 add constraint 名稱 foreign key(列名) references 表名(列名) on delete set null

alter table t2 add constraint 名稱 foreign key(列名) references 表名(列名) on delete cascade; 子表相關的列的自動刪除

序列:

CREATE SEQUENCE 序列名稱

MINVALUE 1

MAXVALUE 999

INCREMENT BY 1

START WITH 1

CACHE 20 --NOCACHE

NOORDER

NOCYCLE ;

序列名稱.nextval 序列的下一個值 序列名稱.currval 序列的當前值 當序列沒有值在內存中時,currval 值無效,先 nextval 後,才會有效 序列的不連續問題: 事務回退,序列號不回退 其它語句引用了該序列 Cache n 序列的值到內存中,一次存放n個值, 默認是20個,如果連續使用,可將n 設置大些 NOCACHE 每次取值都要計算 停止數據庫後,內存中存放的序列會丟失 order 在單實例中沒有差別,它體現在群集 rac 環境中,它的含義是, 為集群中的每個節點相要獲得的序列的值都要重新從序列的定義中計算獲得, order 和 CACHE 是相互排斥的,一旦使用的 order 項, CACHE 項會無效。 如果使用序列作主鍵,請設置 NOCYCLE, 不循環 如果要快速發生序列值,將 CACHE 設置大一些 如果序列要很長時間才能用完, 可以考慮使用循環的序列

八、View 視圖

視圖的定義存在於數據字典中,Oracle 的所有字典都是視圖, 視圖只是一個定義,沒有獨立的數據,數據還是存放在表中 為使用提供了方便 增加了數據的負擔 降低了數據庫的性能 (如果用不當) 限制對數據庫的訪問 將復雜的查詢包起來,化繁為簡 提供給用戶獨立的數據 在同一個表上建立不同的視圖,減少視圖的個數 可以從 user_views 中查看所有的視圖, user_object 查看所有對象 創建視圖: create or replace view 視圖名稱 as select * from t2 WITH 約束項 Read only 只讀 check option constraint 約束名稱

刪除視圖 drop view 視圖名稱

視圖上運行 DML Delete 限制

1.有組的函數

2.有group by 子句

3.用了distinct 關鍵字

4.有rownum 列

Update 限制

1.有組的函數

2.有group by 子句

3.用了distinct 關鍵字

4.有rownum 列

5.有表達式的列

Insert 限制

1.有組的函數

2.有group by 子句

3.用了distinct 關鍵字

4.有rownum 列

5.有表達式的列

6.基表中有not null 的列,但該列沒有出現在視圖的定義裏

Top-n 查詢 使用 where rownum <=5 -- 前5條

查詢結果的集合操作

並集 union / union all

union all 不進行排序,也不去掉重復的行

uion 進行排序,去掉重復的行

交集 intersect 相同的部分,進行排序,去掉重復的行

補集 minus 第一個表有,第二個表沒有的行去掉重復的行

九、 分組

group by 分組,在有 group by 的 select 語句中,不是組的列一定要放在 group by 中
對 group by 結果篩選,使用 having 過濾

rollup
rollup分組,一次全表掃描, group by rollup(列1,列2,列3...,列n),結果集共有 n+1 個
Grouping(列名) 表示該列是否參加了分組操作,0:參加; 1: 末參加

cube
group by cube(列1,列2,列3...,列n),結果集共有 2^n 個

樹結構查詢
start with 子句,處理層次結構的數據
start with(列1=‘val1‘) connect by prior id=父級id

查詢時,刪除節點,下級保留
select name from t2
where name<> ‘will‘
start with(id=‘004‘)
connect by prior id=fid

刪除節點及其子節點
select name from t2
start with(id=‘004‘)
connect by prior id=fid
and name<> ‘will‘

Oracle 學習筆記(一)