1. 程式人生 > >oracle菜鳥日記7

oracle菜鳥日記7

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 ;(使表上的所有觸發器有效)