Oracle基礎學習
阿新 • • 發佈:2019-01-04
系統全域性共享區 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
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;
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