oracle菜鳥日記7
阿新 • • 發佈:2019-02-10
1. 注意在oracle中的00,01這類的詞,這類都屬於數字型
比如: grouping(deptno) || grouping(job)=‘00或者01’
2. 對於列名是漢字的可以加雙引號表示,而如果要在列中使用漢字則目前我還真不知道怎麼做。。。。。
3. 高階分組:
grouping(分組列)如果分組列不為null則返回0,為null則返回1,grouping裡面的引數只能是一個,如果對於多個分組列,則可以用 || 進行連線表示
不同的情況,比如 =‘000’,‘001’,‘110’之類的
舉例:
SQL> select deptno,job,case when grouping(deptno)||grouping(job) = '00'
2 then 'sum'
3 when grouping(deptno)||grouping(job) = '10'
4 then 'job sum'
5 when grouping(deptno)||grouping(job) = '0
6 then 'deptno sum'
7 when grouping(deptno)||grouping(job) = '1
8 then 'deptno and job sum'
9 end "小計",
10 sum(sal) as total
11 from emp
12 group by cube (deptno,job)
13 order by grouping(job),grouping(deptno);
DEPTNO JOB 小計 TOTAL
---------- --------- ------------------ ----------
10 MANAGER sum 2450
30 MANAGER sum 2850
30 CLERK sum 950
20 MANAGER sum 2975
20 ANALYST sum 6000
20 CLERK sum 1900
10 PRESIDENT sum 5000
30 SALESMAN sum 5600
10 CLERK sum 1300
SALESMAN job sum 5600
CLERK job sum 4150
DEPTNO JOB 小計 TOTAL
---------- --------- ------------------ ----------
ANALYST job sum 6000
MANAGER job sum 8275
PRESIDENT job sum 5000
10 deptno sum 8750
30 deptno sum 9400
20 deptno sum 10875
deptno and job sum 29025
已選擇18行。
group by cube(a,b) 有2的n次方種分組形式, (a,b),(a),(b),()
group by rollup(a,b) 有n+1種分組形式, (a,b),(a),() 從右向左依次卷積,
group by sets ((a,b),(a),(b),()) 指定分組形式
grouping_id() 返回分組的二進位制形式的值,裡面的引數可以是多個分組列,比如 grouping_id(a,b,c) 當是010情況時,則返回2,100時返回4
group by後面不能跟巢狀子查詢
4.ora_rowscn 偽列表示每一張表上的行scn(系統改變號),而scn_to_timestamp(ora_rowscn) 則是將scn轉換成對應的系統時間
例如:SQL> select empno,sal,scn_to_timestamp(ora_rowscn) bx from emp;
EMPNO SAL BX
---------- ---------- -----------------------------------------
7369 1000 31-3月 -10 12.01.02.000000000 上午
7499 1600 31-3月 -10 12.01.02.000000000 上午
7521 1250 31-3月 -10 12.01.02.000000000 上午
7566 2975 31-3月 -10 12.01.02.000000000 上午
7654 1250 31-3月 -10 12.01.02.000000000 上午
7698 2850 31-3月 -10 12.01.02.000000000 上午
7782 2450 31-3月 -10 12.01.02.000000000 上午
7788 3000 31-3月 -10 12.01.02.000000000 上午
7839 5000 31-3月 -10 12.01.02.000000000 上午
7844 1500 31-3月 -10 12.01.02.000000000 上午
7876 1100 31-3月 -10 12.01.02.000000000 上午
7900 950 31-3月 -10 12.01.02.000000000 上午
7902 3000 31-3月 -10 12.01.02.000000000 上午
7934 1300 31-3月 -10 12.01.02.000000000 上午
已選擇14行。
5. (日期1-日期2) year to month 表示將日期差精確到年月,不到30天不向前面的月進一,不滿12,不向前面的年進一。
6.translate(a,b,c)函式,在刪除引數a中的字元時,一定要最少指明一個被替換的值,就算被替換的值在a中不出現(只是形式),但也要有,如果任何b的
替換引數為null,則真個結果也為null;
例如:
SQL> select translate('abcd*efg','*','') a from dual
2 /
A
-
SQL> select translate('abcd*efg','x*','6') a from dual
2 /
A
-------
abcdefg
7.歐洲國家的貨幣一般用逗號作為小叔部分的分隔符;
8.約束延期:我們可以設定約束延期驗證,當對於父子關係的兩張表來說,我們向其中一個新增資料時,先向父表新增再向子表新增這個順序是沒有問題的,
但是,顯示生產環境中,順序不是我們可以控制的,所以當先向子表新增再向父表新增時,就會出錯,應為新增在子表中的值在父表中沒有出現,這時候
我們就需要進行約束延期,等到commit的時候再開始檢查約束,而不是在新增的過程中進行檢查約束。
方法: 先刪除約束,再重建延期約束
(1) alter table table_name drop constraint constraint_name;
(2) alter table table_name add constraint foreign key(子列) references table_name2(父列)
initially deferred deferrable enable;
9.一個&的意思 是每次碰到這個變數,都問問你是啥
兩個&,那麼只問你一次,以後這個變數都按這個值處理
10.對於ntile分桶,ntile(n)over(partition by / order by),按照後面的分組或者排序的結果將表分成n份,比如十行資料分成3份,則按照分組
或者排序後的結果,將前三行分到一號桶,中間三行分到2號桶,最後4行分到3號桶。
11.對於width_bucket(a,b,c,d)函式,具有4個引數,a引數表示依據那一列進行分組,b引數表示lower bound,c引數表示upper bound,d引數表示分多少份
比如 width_bucket(sum(sal),0,50000,10),就表示按照sum(sal)的值進行分組,0到50000之間分成10組,也就是說0-5000,5001-10000,..
依次類推,sum(sal)的結果在哪個桶的區間內就分到幾號桶中。
12.只要沒有聚集函式,那麼分組列會返回重複行
13.floor(n),向下取整,只能得到整數,trunc(n,m),預設向下取整,但實際有兩個引數,引數m表示取到小數點右邊第幾位,負數表示小數點左邊
第幾位,而round(n),它是支援4舍五入的。
例如:
SQL> select round(11.6) from dual;
ROUND(11.6)
-----------
12
SQL> select trunc(11.6) from dual;
TRUNC(11.6)
-----------
11
SQL> select floor(11.6) from dual;
FLOOR(11.6)
-----------
11
SQL> select trunc(11.678,2) from dual;
TRUNC(11.678,2)
---------------
11.67
SQL> select trunc(12221.678,-2) from dual;
TRUNC(12221.678,-2)
-------------------
12200
14.事務的讀一致性
系統預設的事務環境是讀寫,讀寫環境:當有兩個使用者同時訪問同一個資料的時候,其中一個使用者先查詢了一行,然後另一個使用者修改了那一行並提交,第一個
使用者再查詢那一行的時候,他會發現不是原來的資料了,有時候我們希望資料保持一致性,那麼我們就該將事務環境設定為只讀,這樣我們就會一直得到我們
期望的資料,而不會因為別的使用者的提交而改變我們的查詢結果,
set transaction read only ;(只讀)
set transaction read write;(讀寫)
15.設定事務的隔離級別:
隔離級別會允許或者不允許:髒讀,幻讀(增加資料行並提交了),不可重複讀(被刪除並提交了)
set transaction isolation level [read uncommit][read commit][repeatable read][serializable]
如果設定隔離級別過高,那麼付出的代價也會很大,因為需要額外的鎖請求,事務的吞吐量也會受限,所以序列化事務更容易產生死鎖。
16.to_number()只能將字元型的純數字轉換成數字型,對於字母,標點符號,貨幣單位,全都不能轉
to_char()可以將數字型,日期,字元,全部轉為字元型
17.alter session set nls_sort=binary_ci;
alter session set nls_comp=linguistic;
這兩個組合允許搜尋不區分大小寫
18.寫包和包體的時候最好都帶上or replace,因為有可能報錯:已經存在某某名字;
19.alter index index_name unusable;(使索引失效)
alter index index_name rebuild;(使索引生效)重建索引;
19.alter table table_name disable constraint constraint_name;(使約束失效)
alter table table_name enable constraint constraint_name;(使約束有效)
20.alter trigger trigger_name disable;(使觸發器失效)
alter trigger trigger_name enable;(使觸發器有效)
alter table table_name disable alltrigger ;(使表上的所有觸發器失效)
alter table table_name enable alltrigger ;(使表上的所有觸發器有效)
比如: grouping(deptno) || grouping(job)=‘00或者01’
2. 對於列名是漢字的可以加雙引號表示,而如果要在列中使用漢字則目前我還真不知道怎麼做。。。。。
3. 高階分組:
grouping(分組列)如果分組列不為null則返回0,為null則返回1,grouping裡面的引數只能是一個,如果對於多個分組列,則可以用 || 進行連線表示
不同的情況,比如 =‘000’,‘001’,‘110’之類的
舉例:
SQL> select deptno,job,case when grouping(deptno)||grouping(job) = '00'
2 then 'sum'
3 when grouping(deptno)||grouping(job) = '10'
4 then 'job sum'
5 when grouping(deptno)||grouping(job) = '0
6 then 'deptno sum'
7 when grouping(deptno)||grouping(job) = '1
8 then 'deptno and job sum'
9 end "小計",
10 sum(sal) as total
11 from emp
12 group by cube (deptno,job)
13 order by grouping(job),grouping(deptno);
DEPTNO JOB 小計 TOTAL
---------- --------- ------------------ ----------
10 MANAGER sum 2450
30 MANAGER sum 2850
30 CLERK sum 950
20 MANAGER sum 2975
20 ANALYST sum 6000
20 CLERK sum 1900
10 PRESIDENT sum 5000
30 SALESMAN sum 5600
10 CLERK sum 1300
SALESMAN job sum 5600
CLERK job sum 4150
DEPTNO JOB 小計 TOTAL
---------- --------- ------------------ ----------
ANALYST job sum 6000
MANAGER job sum 8275
PRESIDENT job sum 5000
10 deptno sum 8750
30 deptno sum 9400
20 deptno sum 10875
deptno and job sum 29025
已選擇18行。
group by cube(a,b) 有2的n次方種分組形式, (a,b),(a),(b),()
group by rollup(a,b) 有n+1種分組形式, (a,b),(a),() 從右向左依次卷積,
group by sets ((a,b),(a),(b),()) 指定分組形式
grouping_id() 返回分組的二進位制形式的值,裡面的引數可以是多個分組列,比如 grouping_id(a,b,c) 當是010情況時,則返回2,100時返回4
group by後面不能跟巢狀子查詢
4.ora_rowscn 偽列表示每一張表上的行scn(系統改變號),而scn_to_timestamp(ora_rowscn) 則是將scn轉換成對應的系統時間
例如:SQL> select empno,sal,scn_to_timestamp(ora_rowscn) bx from emp;
EMPNO SAL BX
---------- ---------- -----------------------------------------
7369 1000 31-3月 -10 12.01.02.000000000 上午
7499 1600 31-3月 -10 12.01.02.000000000 上午
7521 1250 31-3月 -10 12.01.02.000000000 上午
7566 2975 31-3月 -10 12.01.02.000000000 上午
7654 1250 31-3月 -10 12.01.02.000000000 上午
7698 2850 31-3月 -10 12.01.02.000000000 上午
7782 2450 31-3月 -10 12.01.02.000000000 上午
7788 3000 31-3月 -10 12.01.02.000000000 上午
7839 5000 31-3月 -10 12.01.02.000000000 上午
7844 1500 31-3月 -10 12.01.02.000000000 上午
7876 1100 31-3月 -10 12.01.02.000000000 上午
7900 950 31-3月 -10 12.01.02.000000000 上午
7902 3000 31-3月 -10 12.01.02.000000000 上午
7934 1300 31-3月 -10 12.01.02.000000000 上午
已選擇14行。
5. (日期1-日期2) year to month 表示將日期差精確到年月,不到30天不向前面的月進一,不滿12,不向前面的年進一。
6.translate(a,b,c)函式,在刪除引數a中的字元時,一定要最少指明一個被替換的值,就算被替換的值在a中不出現(只是形式),但也要有,如果任何b的
替換引數為null,則真個結果也為null;
例如:
SQL> select translate('abcd*efg','*','') a from dual
2 /
A
-
SQL> select translate('abcd*efg','x*','6') a from dual
2 /
A
-------
abcdefg
7.歐洲國家的貨幣一般用逗號作為小叔部分的分隔符;
8.約束延期:我們可以設定約束延期驗證,當對於父子關係的兩張表來說,我們向其中一個新增資料時,先向父表新增再向子表新增這個順序是沒有問題的,
但是,顯示生產環境中,順序不是我們可以控制的,所以當先向子表新增再向父表新增時,就會出錯,應為新增在子表中的值在父表中沒有出現,這時候
我們就需要進行約束延期,等到commit的時候再開始檢查約束,而不是在新增的過程中進行檢查約束。
方法: 先刪除約束,再重建延期約束
(1) alter table table_name drop constraint constraint_name;
(2) alter table table_name add constraint foreign key(子列) references table_name2(父列)
initially deferred deferrable enable;
9.一個&的意思 是每次碰到這個變數,都問問你是啥
兩個&,那麼只問你一次,以後這個變數都按這個值處理
10.對於ntile分桶,ntile(n)over(partition by / order by),按照後面的分組或者排序的結果將表分成n份,比如十行資料分成3份,則按照分組
或者排序後的結果,將前三行分到一號桶,中間三行分到2號桶,最後4行分到3號桶。
11.對於width_bucket(a,b,c,d)函式,具有4個引數,a引數表示依據那一列進行分組,b引數表示lower bound,c引數表示upper bound,d引數表示分多少份
比如 width_bucket(sum(sal),0,50000,10),就表示按照sum(sal)的值進行分組,0到50000之間分成10組,也就是說0-5000,5001-10000,..
依次類推,sum(sal)的結果在哪個桶的區間內就分到幾號桶中。
12.只要沒有聚集函式,那麼分組列會返回重複行
13.floor(n),向下取整,只能得到整數,trunc(n,m),預設向下取整,但實際有兩個引數,引數m表示取到小數點右邊第幾位,負數表示小數點左邊
第幾位,而round(n),它是支援4舍五入的。
例如:
SQL> select round(11.6) from dual;
ROUND(11.6)
-----------
12
SQL> select trunc(11.6) from dual;
TRUNC(11.6)
-----------
11
SQL> select floor(11.6) from dual;
FLOOR(11.6)
-----------
11
SQL> select trunc(11.678,2) from dual;
TRUNC(11.678,2)
---------------
11.67
SQL> select trunc(12221.678,-2) from dual;
TRUNC(12221.678,-2)
-------------------
12200
14.事務的讀一致性
系統預設的事務環境是讀寫,讀寫環境:當有兩個使用者同時訪問同一個資料的時候,其中一個使用者先查詢了一行,然後另一個使用者修改了那一行並提交,第一個
使用者再查詢那一行的時候,他會發現不是原來的資料了,有時候我們希望資料保持一致性,那麼我們就該將事務環境設定為只讀,這樣我們就會一直得到我們
期望的資料,而不會因為別的使用者的提交而改變我們的查詢結果,
set transaction read only ;(只讀)
set transaction read write;(讀寫)
15.設定事務的隔離級別:
隔離級別會允許或者不允許:髒讀,幻讀(增加資料行並提交了),不可重複讀(被刪除並提交了)
set transaction isolation level [read uncommit][read commit][repeatable read][serializable]
如果設定隔離級別過高,那麼付出的代價也會很大,因為需要額外的鎖請求,事務的吞吐量也會受限,所以序列化事務更容易產生死鎖。
16.to_number()只能將字元型的純數字轉換成數字型,對於字母,標點符號,貨幣單位,全都不能轉
to_char()可以將數字型,日期,字元,全部轉為字元型
17.alter session set nls_sort=binary_ci;
alter session set nls_comp=linguistic;
這兩個組合允許搜尋不區分大小寫
18.寫包和包體的時候最好都帶上or replace,因為有可能報錯:已經存在某某名字;
19.alter index index_name unusable;(使索引失效)
alter index index_name rebuild;(使索引生效)重建索引;
19.alter table table_name disable constraint constraint_name;(使約束失效)
alter table table_name enable constraint constraint_name;(使約束有效)
20.alter trigger trigger_name disable;(使觸發器失效)
alter trigger trigger_name enable;(使觸發器有效)
alter table table_name disable alltrigger ;(使表上的所有觸發器失效)
alter table table_name enable alltrigger ;(使表上的所有觸發器有效)