Oracle數據庫知識要點


一、卸載安裝(來自百度經驗)

  完全卸載:

    1. 停止相關服務

    2. 運行Universal Installer,卸載產品

    3. 清理注冊表

    4. 重啟電腦,刪除目錄(Oracle文件夾和app文件夾)

  安裝:

    1. 運行setup.exe

    2.取消勾選“接收安全更新”選項

    3. 選擇創建和配置數據庫

    4. 桌面類

    5. 企業版

    6. 使用utf-8字符集

    7. 口令管理,將Scott解鎖,設置密碼tiger

    打開sql plus用設置好的賬戶登錄測試一下

二、配置

  1. 確保服務(service和listener)開啟

  2. 打開Net Manager配置listener和Oracle主目錄

  3. 打開net configuration assistant配置監聽程序和本地網絡服務名配置

三、配置PLSQL

  1. tools-->preferences Oracle Home:Oracle主目錄

  2. 查看主目錄/network/admin/下是否有tnsnames.ora文件和listener.ora

  問題匯總:TNS無法解析制定的連接符標識https://www.cnblogs.com/justlove/p/8252779.html

                  可以試着把主機名改為本計算機名

四、SQL數據庫用戶操作語句

  新建用戶:create user [username] identified by [password]

  分配表空間:alter user [username] default tablespace users temporary tablespace temp profile default

  新建用戶同時分配表空間:create user zhangsan identified by 123456 default tablespace users temporary tablespace temp profile default

  賦予權限:grant connect to zhangsan; grant resource to zhangsan; 給查詢權限:grant select on emp to zhangsan;

  一次賦予多種權限用逗號隔開,如: grant connect,resource to zhangsan

  刪除用戶:drop user zhangsan

  去除權限:revoke connect from zhangsan

  修改用戶密碼:alter user zhangsan identified by newpassword

  鎖定用戶:alter user zhangsan account lock

五、Oracle中的數據類型

  number(10)表示數字類型,長度為10

  number(5,2)表示總長度為5,小數位占其中的2位

  char(10)字符型,最多放2000個字符

  varchar()或者varchar2()可變長度字符,最多放4000個字符

  date日期類型,系統默認日期格式:2-3月-2019

  timestamp日期精確到毫秒

  blob大數據,存儲二進制數據,最大4G

六、SQL表操作語句

創建表:

create table student(

  sid number(10),

  sname varchar(20),

  cid number(10),

  ......

)

修改表:

  追加列:alter table student add(sex varchar(5))

  修改列:alter table student modify(sname varchar(15))

  刪除列:alter table student drop column sex

  修改列名:alter table student rename column sex to gender

  修改表名:rename student to students

  刪除表:drop table student

約束 (分為列級約束和表級約束)

  種類:主鍵primary key、唯一unique、非空not null、外鍵foreign key references、檢查check

  添加列級約束:

  create table student(

    sid number(10) primary key,

    sname varchar(20) not null,

    cid number(10) references class,

    ......

  )

    添加表級約束:

  create table student(

    sid number(10) ,

    sname varchar(20) ,

    cid number(10) ,

    ......

    constraint student_sid_pk primary key(sid),

    constraint student_cid_fk foreign key(cid) references class(cid),

    ......

  )

  或者alter table add constraint ...

七、數據處理

Crete table  表名 As Select * from 表名

創建一個表,並將查詢出來的數據插入到新的表中

去掉數據復制表結構:

Create table 表名 As Select * from 表名 Where 添加一個沒有結果的條件  empno=null

八、查詢語句

||連接查詢結果

sql中,所有的空值運算之后都為空

Nvlcomm,0空值處理

Nvl處理空值   第一個參數為列,第二參數表示為如果列中的值為空,用0來代替

去掉重復 關鍵字:distinct

sql語句中,字符、日期都必須用單引號引起來

數值的比較,字符串的比較,日期的比較,between…and….(在兩者之間,包含兩個邊界),like(_,%)(模糊查詢,關鍵字查詢),in(匹配查詢)

Is null表示空   is not null 表示非空

Between。。and。。格式: select * from 表明 where 列明 between  XX and  XX

比較符:> < >= <= !=<> =   sql中的賦值符號:    :=  賦值符號

邏輯運算符: and 與     or或    not

  排序關鍵字:order by      asc 升序 為默認排序可以省略       desc 降序

九、函數

單行函數:只對一行數據影響的函數叫單行函數

單行函數:字符、數值、日期、轉換、通用

字符函數:lower  將字符轉換為小寫;upper 將字符轉換為大寫

instr(列,str1)  查詢字符   str1在列中的字符

--concat  連接   將兩個字符連接    類似於||

select concat(ename,job) from emp

--length 返回字符串的長度  

select lengthename) from emp

  數值函數:

--dual 這個表沒有具體的數據,只是在查詢的時候,我們查詢的格式為 select  from 表名,當不需要用到表而用到查詢結構的時候用dual占位

Turnc() 數字截斷

round()四舍五入

mod()   求余

日期函數:  sysdate   分為日期和時間

Months_between  獲得兩者之間的月份數

--獲得1987/4/191981/2/20這個日期間的月份差

select months_between('19-4-1987','19-4-1981') from dual

add_months   向指定的日期中添加若干月份

last_day 獲得本月的最后一天

round (日期,年//日)   日期同樣有四舍五入

trunc     日期的截斷

轉換函數:  分為兩種形式:隱式轉換   顯示轉換

隱式轉換:自動類型轉換

顯示轉換:對數據用方法進行轉換

To_char 轉換為字符

To_number 轉換為數字

To_date 轉換為日期

To_char(date\number,’字符格式’)

將日期轉換為字符串  to_char(sysdate,’yyyy-mm-dd’)

將數字轉換為字符串  to_char(sal,’00000.00或者9999.99’)

格式中的9的位數,一定要大於等於要轉換的數字的位數

如果是貨幣可以在前面加上$或者L(本地貨幣)為字符串

To_date(‘字符’,‘日期格式’)

yyyy  代表年   mm代表月  dd代表日  hh時  miss

--插入一條數據到數據庫表emp   將日期轉換為指定格式

insert into emp values(7856,'lisi','SALESMAN',7698,to_date('1982-12-12','yyyy-mm-dd'),6000,200,10)

To_number(‘字符’,’數字格式’)

--將¥1234.55轉換為數字

select to_number('1234.55','L999999999.000') from dual

如果字符含有貨幣符號,那么格式中也必須有貨幣符號

  通用函數:

Nvl(參數1,參數2)處理空值

Nvl2(參數1,參數2,參數3)  參數1列中的數據,如果不為空執行參數2,如果為空執行參數3

Case  參數  when 列值 then 返回數據

[when  列值2  then 返回數據2

.......]

Else 返回數據

End [別名]

通過每一列查出的值作為參數匹配when后面的值,入果匹配上了則返回then后面的值,如果都沒匹配上 則返回else中的值,整個函數只是一列

Decode(參數,列值1,返回值1,列值2,返回值2,列值3,返回值3,返回值)

分組函數:min、max、avg、sum、count

 十、高級查詢

  分組查詢:通過關鍵字group by分組的查詢

  規則:select中出現的非組函數列,在group by 中必須出現

     group by 中出現的列,select中可以沒有

     order by 放在最后排序

                 having:針對已分組的數據再次過濾,可以使用組函數,而where不能!

  多表查詢:兩張表及兩張表以上的查詢叫多表查詢。

  內連接:inner join 效率高於等值查詢

  外連接:outer join 分為左外連接和右外連接查詢。

  滿連接:full outer join 

  子查詢:查詢的嵌套,用括號扣起來的查詢語句。分為單行子查詢和多行子查詢。

    in:匹配任意一個結果

    any:用於否定?(有點懵逼)

    all:匹配所有?(有點懵逼)

  合並查詢:union並集、union all不取消重復行、intersect交集、minus差集 

  分頁查詢:

    select * from emp

    delete from emp where empno=7999
    --在Oracle查詢中系統會為每張表提供一個rownum的偽列,rownum是一個永遠從1到最大條數的有序排列
    --rownum只能從1開始,所以如果數據不從一開始,需要先將rownum查詢出來成為一個獨自列
    --如果分頁查詢的時候需要排序,一定要在查詢rownum之前排序
    select *
    from (select e.*,rownum r from (
    select * from emp order by sal
    ) e
    where rownum<=3*5)
    where r>(3-1)*5

     --此處查詢第三頁數據,五條數據為一頁

十一、事務管理

  隱式提交:DDL語句(操作表結構)自動保存

  顯式提交:commit手動提交

  隱式回滾:異常關閉數據庫,自動回滾

  顯示回滾:rollback  回滾到前一個提交點

  savepoint 創建保存點

  rollback to 保存點名字

十二、視圖

  虛表,數據來源於表,一般用於查看

  create or replace view as...

十三、序列

  主要用於提供主鍵值

  create sequence 序列名

    [Increment by n]  --序列的步長,默認值為1

    [start with n]     --序列初始位置,不能小於最小值

    [minvalue n] --最小值

    [maxvalue n] --最大值

    [cycle/nocycle] --序列是否可以循環再取

    [cache n] --序列的緩存

十四、觸發

  //創建一個觸發器:create trigger 觸發器名稱

  結合序列使用,首先創建一個序列:

  --序列:可以供多個用戶來產生唯一數值的數據庫對象,提供有規律的數值
  create sequence emp2_seq
  increment by 1 --設計序列的步長
  minvalue 1 --最小值
  maxvalue 9999999 ---最大值
  start with 1 --起始值
  nocycle --是否循環
  cache 20 --緩沖 一般設置為20
  --使用序列
  --獲取序列的下一個值 通過 序列名.nextval
  insert into emp2 values(null,'MORRIS','CLREK',7499,'10-2月-1981',1100,50,10)
  select * from emp2
  --獲取序列的當前值
  select emp2_seq.currval from dual

  --觸發:在執行某一動作的時候,觸發其他動作的執行
  create or replace trigger emp2_trg --創建觸發
  before insert on emp2 --在emp2表插入之前觸發
  for each row --循環每一行
  declare
    begin
      select emp2_seq.nextval into:new.empno from dual; --查詢序列中的下一個值,into賦值給新的主鍵
    end emp2_trg;

十五、索引

  --創建索引
  create index ename_index on emp(ename)

  --刪除索引

  drop index ename_index

 

十六、PLSQL基礎

  賦值符號:  :=

  引用類型:  V_name table_name.column_name%type

  聲明式記錄類型:  Type record_name is record(

              v_name type(number),

              ......

            );

  引用式記錄類型:v_emp emp%rowtype;

  選擇結構:

    if...then...

    elsif...then...

    else....

    end if;

  case結構:

    case ... when...then ...

    when...then...

    else...

    end case;

  循環結構:

    loop...exit when...end loop;

    while... loop...end loop;

    for v_i (計數器) in [reverse] 下限...上限 loop...end loop;

  goto順序結構:

    通過標簽跳轉,一般用於結束循環

    注意:標簽不能緊鄰end;

十七、游標

 顯式游標:

    1. 聲明游標:cursor 名字(參數...) is 查詢語句(where條件);
    2. 打開游標:open 名字(參數...);
    3. 提取游標數據:fetch 名字 into 記錄類型變量/變量列表;
    4. 關閉游標:close 名字;

例子: declare

      cursor emp_cur is select * from emp;

      vemp emp%rowtype;

   begin 

      open emp_cur;

      fetch emp_cur into vemp;

      while emp_cur%found loop

        dbms_output.put_line(vemp.empno||"  "||vemp.ename);

        fetch emp_cur into vemp;

      end loop;

      close emp_cur;

      end;

 帶返回值的游標:

  帶參帶返回值:

declare

  cursor emp_cur(vjob varchar2)

  return emp%rowtype   --設置返回值類型,用於規定select查詢結果

  is select * from emp

     where job=vjob;

  vemp emp%rowtype;

begin

  open emp_cur('CLERK');

  loop

    fetch emp_cur into vemp;

    exit when emp_cur%notfound;

    if vemp.sal <1200 then

      update emp set sal=sal+50 where empno = vemp.empno;

    end if;

  end loop;

end;

   FOR循環游標:

    for 接收變量 in 游標名字(參數...) loop

      ..........

    end loop;

    接收變量不需要聲明!不需要打開游標!

declare

cursor emp_cur(vdname varchar2) is select * from emp where deptno = 

(select deptno from dept where dname=vdname);

begin

   -- open emp_cur('SALES'); 隱含打開游標啊

    for vemp in emp_cur('SALES') loop

      --隱含提取游標

        dbms_output.put_line('員工編號為:'||vemp.empno||',姓名為:'||vemp.ename||',職位為:'||vemp.job||',工資為:'||vemp.sal);

        --隱含關閉游標

    end loop;

end;

begin

  for vemp in (select * from emp) loop

    dbms_output.put_line('員工編號為:'||vemp.empno||',姓名為:'||vemp.ename||',職位為:'||vemp.job||',工資為:'||vemp.sal);

  end loop;

end;

   隱式游標:

begin

  update emp set comm=500 where empno=7499;

 -- if sql%found then

    --DBMS_OUTPUT.PUT_LINE('更新數據成功!');

  --end if;

  if sql%rowcount>0 then

    DBMS_OUTPUT.PUT_LINE('更新數據'||sql%rowcount||'條成功!');

  end if;

end;

   游標變量:

定義:type 類型名 is ref cursor [返回類型]

聲明:變量名 類型名

打開:open...

提取:fetch ...into...

關閉:close...

十八、異常處理

分為:系統異常和手動異常

手動異常:

declare

 too_data_nofind exception--聲明異常  關鍵字exception

begin

  update emp set sal=sal+1 where deptno=50;--一個沒有不能找到的條件

  if sql%notfound then

    raise too_data_nofind;--拋出異常,關鍵字raise

  end if;

--拋出異常后代碼不會被執行

  dbms_output.put_line('今天天氣不錯,適合游泳!');

exception 

  when too_data_nofind then --匹配異常

    dbms_output.put_line('找不到此部門中的人!!');

end;

 十九、存儲過程及函數

區別就是存儲函數有返回值。

create [or replace] procedure/function 名字(參數...)

[return...]

as -- 相當於declare

begin

  ...........

  [return ...]

end 名字; 

執行存儲過程:exec 名字;

       或者begin 名字 end;

參數有in、out、in out之分。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM