1. 程式人生 > >Oracle基礎學習

Oracle基礎學習

系統全域性共享區  system global area   (SGA):共享的記憶體空間,被看做資料庫的一個大的緩衝池。可被oracle的各個程序公用。包括library 和 data dictionary 使用PGA:是一個使用者連線到資料庫的緩衝區 的記憶體區域 library Cache是sql語句分析後的結果儲存到這個快取中第二次直接用,減少時間 database buffer Cache  對應所有檔案中常用到的資料塊。資料庫的任何修改都在這完成。然後由dbwr 程序將修改後資料寫入磁碟重做日誌檔案。   對資料庫的修改都先記錄到日誌檔案中。再由lgwr程序寫入磁碟oracle 邏輯儲存結構database 資料庫》tablespace 表空間》segment 段》ectent 區》oracle block塊oracle 賦予許可權  grant  ... to    回收許可權 revoke ... from cmd  登入oracle sqlplus / as sysdba 預設用Windows 使用者驗證登入建立使用者: create user a identified ba a ; 使用者名稱 a  密碼 a賦予許可權: grant create session to a;  賦予建立會話的許可權回收許可權:revoke  create session from a; 回收會話功能 後  就不能登入資料庫了連結資料庫:conn  使用者名稱/密碼資料字典;資料庫的資訊,比如建立者,建立時間,所屬表的資訊模式物件:oracle  資料庫 工具    daca :資料庫管理工具。建立刪除資料庫等。    netmanager:建立對遠端資料庫的連結。配置服務和監聽    sql developer:圖形化工具    sql * plus:dos命令  遠端資料庫sqlplus 使用者名稱/密碼@testdb 只能32位客戶端    pl/sql deleloper:圖形化工具 類似 sql developer查詢語句:select */列明  from  表 where 條件  group by  分組查詢 order by 排序 關鍵字大小不敏感別名 : select 列明  as  別名 from 表明  有空格的別名得用引號去重新命名: distinct  比如:select distinct  */列名 from  表;表示式的應用: 連線操作符   (列名 ||"工資是"|| 列名)這裡查詢的為一列 where 子句: 字串和日期 要用單引號  select * from a where name ='啊啊'                        日期: time>' dd-mon-yy' 日-月-年   全是兩位and or  not  in 模糊查詢: like '%字串%'  %代表多個字元  _代表一個字元查詢空值   is  null  非空  is  not null排序:order by 升序   asc 降序 desc  預設是升序 select ename,job,mg,hiredate, sal salary from order by salary desc,hiredate asc 先根據sal的降序,sal相同時再 hiredate的升序排序 oracle 中 null預設是最大值內建函式:     字串函式: chr(int) 對應的asc|| 碼   比如 chr(65) 返回出來的是  A   這是單行函式     contat(string1, string2)    連結字串。連線string1和string2 可以是列明 比如 把表中                                           的 姓名和工資連線起來     initcap(sring)  string 字串的第一個變為大寫     lower(string) 全為小寫      upper(string) 全為大寫    lpad(string,count[,char]) 讓指定的字元char在字串string的左邊填充 比如lpad(name,10,'*')如果name不夠十個在左邊填充*    rpad(string,count[,char]) 右邊    ltrim(string,char) 去掉左邊的字元char    rtrim(string,char) 去掉右邊的char    replace(string, char,char)替換字元 後面替換前面的    substr(string , start,length) 獲取子字串 第三個到第六個   後面引數 3,6    length(string) 獲取長度數字函式    abs(value)絕對值    ceil(value)返回大於或者等於value的最小整數    foolr(value)返回小於或等於value的最大整數    power(value,exponent) 求value的指數值  2的3次方    round(value,preponent)對precision的精度四捨五入   mod(value, divisor) 取餘時間函式    日期:預設格式:dd-mon(中文) -yy    add_months(date,count) 指定日期上增加count月    last_day(date) 返回所在月的最後一天    next_day(date,'星期幾') 返回下一週的星期幾的年月日     months_between(data1,data2)返回data1和data2 之間有幾個月    sysdate 獲取當前系統日期    current_timestamp 獲取當前的日期和日期值     round (date,'year')對日期四捨五入     trunc(date,'year') 對日期進行擷取 只要年份其他為一月一號    day 是星期幾  dd 日期 幾號 型別裝換函式    to_char(date,'format' ) 把日期 裝換為指定格式 字串和數字之間的轉換    to_date(string ,'format') 把字串轉換為時間    to_number(string,'format') 字串轉int    $9,999.99 表示:4個9表示 4位整數 .99表示 兩位小數通用函式:   oracle 預設 一個為null相加都為null    nvl(a,b) 如果a為null則返回b,否則返回a     nvl2(a,b,c)如果a不為null則返回b,否則返回c    nullif(a,b)如果a和b 相等返回null,否則返回a    coalesce() 返回清單中第一個不為空的值  引數為無數個    decode(a,b,c,d,e,f)a等於b返回c  a等於d返回e  否則返回f  有無數個引數分組查詢    avg ,max ,min,count,sum    count(*) 條數      group by  分組 統計  以什麼分組 比如 group by  年級  select 後的列明必須出現在group by之後。否則語法錯誤,並且不能在 where 語句後select max(avg(sal)) from emp group by deptno;  先以deptno分組求 各個組的平均工資再得到最高 平均工資連線查詢:    select * from emp e,dept d  得到笛卡爾積    select * from emp e, dept d where e.deptno=d.deptno 進行篩選 後得到需要的資料    連結查詢得到新的 中間表      左外連結: select d.dname , e.ename from dept.d ,emp e where d.depeno= e.deptno(+);首先查詢符合條件的 然後不符合條件的也會查出來    右外連結: 
select d.dname , e.ename from dept.d ,emp e where d.depeno= e.deptno(+);首先查詢符合條件的 然後不符合條件的也會查出來       自連線: select e1.ename,e2.ename mgr  from emp e1,empe2 where e1.mgr = e2.empno;  自己連線自己子查詢;    單行子查詢:子查詢查詢出來的 只有一個記錄比如得到一個人的工資    having 外層查詢語句    多行子查詢: 多行操作符: in  not in  any all    子查詢有空  查詢出來的都是空    內聯檢視: 子查詢作為一張零時的表。    rownum     top-n分析:  select ename,sal from (select ename,sal from emp order by sal desc) where rownum <=10                       子查詢先按降序 排列;得到一張零時表,然後再取前十;    集合操作:         並 -union     交-intersecint 差-minus


pl/sql developer declare 這裡宣告變數    x number := 100; 具體宣告變數begin  dbms_output.put_line(x); 執行程式塊的具體內容end;簡單的pl/sql模組 無名快例項declarebegin  dbms_output.put_line('當前時間是:'||to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'));end;輸出  當前時間是:2016-12-13 09:20:27 註釋 、 /*  */宣告變數  變數名  變數型別 :=賦值常量    變數名  constant 變數型別 := 賦值賦值方式 :=    select   into   比如:  select count(*) into y from emp;賦值多個變數  select count(*) ,avg(sal) into y,x from emp;if條件控制語句    if<布林表示式> then         pl/sql 語句    end if      if<布林型別> then        pl/sql語句    elsif <布林型別> then         pl/sql 語句    else    end ifcase 條件控制語句    case selector        when 選擇1 then 結果        else 結果    例子: select ename,sql, case                                               when sal >=800 and sal<1200 then '800---1200'                                               when sal>=1200 and sal <1600 then '1200--1600'                                                else 'others'                                               end  '工資結果'                from emp; 
     例子2    選擇器  類似java  中的 case       出現在 sql 語句中  而 if then  出現在pl/sql中迴圈語句    loop 執行語句 exit when<條件語句> end loop;   例子 :    declare        x number :=1begin    loop    x:=x+1;    exit when x=5;    end loop;endwhile <條件> loop    執行語句end loop;for 迴圈for 計數器 in reverse  1..5 loop  1到5      reverse  表示從5到1  不寫 就是  1到5     語句end loop;null 語句;  什麼都不做 異常處理:  預定義異常 非預定義異常 使用者定義異常    語法結構 :     declare          salary sal into salary from emp;        exception            when too_many_rows then                 dbms_output.put_line('too many rows');返回太多行了           when too_data_found then                dbms_output.put_line('no data found') 沒有找到資料     end;函式定義  一有名字的 pl/sql  程式塊語法定義:     顯示遊標使用方法declare    cursor cur1 is select * from emp; 把查詢的放入 cur1遊標中    1.定義遊標    emp_record emp%rowtype;  emp的行記錄型別 放emp表的一行記錄      2.行記錄begin  open cur1;    開啟遊標                                3.開啟遊標  loop    fetch cur1 into emp_record;  得到一行記錄 遊標向下移動        4.用行記錄去讀遊標中的一行記錄    exit when cur1%notfound; 判斷還有沒有資料                  5.判斷是否還有記錄    dbms_output.put_line(emp_record.ename);                     end loop; close cur1; 關閉遊標                                    6.關閉遊標 end;隱式遊標
for rowdate in(select * from emp) loop     dbms_output.put_line(rowdata,ename);end loop;end;和上面的顯示遊標 功能一樣引數遊標declare     cursor cur1(eno number) is select * from emp where empno = eno; 帶引數 eno的遊標 然後根據eno去查詢begin     open cur1(7499);  傳遞 7499這個引數過去    loop        fetch cur1 into emp_record;        exit when cur1%notfound;        dbms_output.put_line(emp_record.ename);    end loop;close cur1; 遊標的屬性    cursor_name%found 最近fetch  取值是夠為空  返回 bool 型別的值    cursor_name%notfound 與found相反    cursor_isopen 檢視遊標是否開啟    cursor_name%rowcount  以及從遊標讀取的記錄數;儲存過程    createorreplaceprocedure proc1 is    salary number;begin  select sal into salary from emp where empno = 7499;
  dbms_output.out_line(salar)end proc1;呼叫儲存過程命令視窗  exec proc1; sql視窗下 begin  proc1;end;  一個儲存過程呼叫另外一個儲存過程: createorreplaceprocedure proc1(eno in number,salary out number ) is    --salary number;begin  select sal into salary from emp where empno = eno;
  dbms_output.out_line(salar)end proc1;
in  輸入out 輸出in out  都可以使用方法包包頭 package   類似java中的介面  全是方法的宣告包體 packagebody 包頭方法的實現createorreplacepackage pkg1 is    function fu2(eno number) return varchar2;    procedure prco2(eno number,empname out varchar2);end pkg1;  

 createorreplacepackagebody pkg1 is--h函式  function fu2(eno number) return varchar2 is    empname varchar2(20);  begin    select ename into empname from emp where empno=eno;    return empname;  end fu2;  --過程    procedure prco2(eno number,empname out varchar2) is    begin      select ename into empname from emp where empno=eno;    end prco2;    --包裡允許函式和過程的過載  引數個數不同end pkg1;包的管理    刷包表示year的:y 表示年的最後一位 yy 表示年的最後2位 yyy 表示年的最後3位 yyyy 用4位數表示年表示month的:mm 用2位數字表示月;mon 用簡寫形式 比如11月或者nov ;month 用全稱 比如11月或者november表示day的:dd 表示當月第幾天;ddd表示當年第幾天;dy 當週第幾天 簡寫 比如星期五或者fri;day當週第幾天 全寫比如星期五或者friday。表示hour的:hh 2位數表示小時 12進位制; hh24 2位數表示小時 24小時表示minute的:mi 2位數表示分鐘表示second的:ss 2位數表示秒 60進位制表示季度的:q 一位數 表示季度 (1-4)另外還有ww 用來表示當年第幾周 w用來表示當月第幾周。24小時制下的時間範圍:00:00:00-23:59:5912小時制下的時間範圍:1:00:00-12:59:59兩個時間 相減得到的是天數 得到月份  months_between(data1,data2)時間直接減去數字   減去是天數 各部門工資最高select ename,sal,deptno from emp where (deptno,sal)in