Oracle數據庫的基本使用

Oracle數據庫的基本使用

1.創建表空間/用戶/用戶授權

  • 創建表空間

    create tablespace test--創建表空間
    datafile 'c:\itheima.dbf'--指定數據文件的位置
    size 100m--初始化大小
    autoextend on--自動增長
    next 10m;--每次增長的大小
    
  • 刪除表空間

    drop tablespace test;
    
  • 創建用戶

    create user user1--創建用戶名
    identified by user1--指定密碼
    default tablespace test;--指定默認的表空間
    
  • 給用用戶授權

    --oracle數據庫中常用的角色
    connect--連接角色,基本角色
        resource--開發者角色
    dba--超級管理員角色
    --給用戶授權dba角色
    grant dba to user1
    

2.數據類型和表的創建以及操作

  • 數據類型

    1. Varchar, varchar2 表示一個字符串
    2. NUMBER NUMBER(n)表示一個整數,長度是n NUMBER(m,n):表示一個小數,總長度是 m,小 數是 n,整數是 m-n
    3. DATA 表示日期類型
    4. CLOB 大對象,表示大文本數據類型,可存 4G
    5. BLOB 大對象,表示二進制數據,可存 4G
  • 創建表

    --創建一個Person表
    create table person(
    pid number(20),
    pname varchar2(10)
    );
    
  • 修改表結構

    --修改表結構
    --添加列
    alter table person add ( gender number(1));
    --修改列類  
    alter table person modify gender char(1);
    --修改列的名稱
    alter table person rename column gender to sex;
    --刪除一列
    alter table person drop column sex;
    
  • 三個刪除

    --刪除表中所有的記錄
    delete from person;
    --刪除表結構
    drop table person;
    --刪除表,再次創建表;效果等同於刪除表中的全部記錄.
    --在數據量大的情況下,尤其在表中帶有索引的情況下,該操作的效率高
    --索引可以提高查詢效率,但會影響增刪改的效率.
    truncate table person;
    

3.序列的使用

--序列不真的屬於任何一張表,但是可以邏輯和表做綁定
--序列:默認從1開始,依次遞增,主要用來給主鍵賦值使用.
----dual:虛表,只是爲了補全語法,沒有任何意義
create sequence s_person;
select s_person.nextval from dual;

4.scott用戶介紹

----scott用戶,密碼:tiger
--解鎖scott用戶
alter user scott account unlock;
--解鎖scott用戶的密碼
alter user scott identified by tiger;
--切換到scott用戶下

5.單行函數

--單行函數:作用於一行,返回一個值
----字符函數:
select upper('yes') from dual;
select lower('YES') from dual;
----數值函數
select round(26.18,1) from dual;---四捨五入,後面的參表示保留小數的位數
select trunc(26.18,1) from dual;---直接截取不再看後面位數的數字是否大於5
select mod(10,3) from dual;---求餘
----日期函數
----查詢出emp表中所有員工入職距離現在幾天.
select sysdate-e.hiredate from emp e;
----算出明天此刻的時間
select sysdate+1 from dual;
----查詢出emp表中所有員工入職距離現在幾月.
select months_between(sysdate,e.hiredate) from emp e;
----查詢出emp表中所有員工入職距離現在幾年.
select months_between(sysdate,e.hiredate)/12 from emp e;
----查詢出emp表中所有員工入職距離現在幾周.
select round((sysdate-e.hiredate)/7,0) from emp e;
----轉換函數
---日期轉換字符串
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
---字符串轉日期
select to_date('2018-6-7 18:23:43','fm yyyy-mm-dd hh24:mi:ss') from dual;
----通用函數
---算出emp表中所有員工的年薪
----獎金裏面有null值,如果null只和任意數字做算術運算,結果都是null.
select e.sal*12+nvl(e.comm,0) from emp e;--nvl處理空值

6.條件表達式

---條件表達式
---條件表達式的通用寫法, mysql和oracle通用
---給emp表中的員工起中文名
select e.ename,
      case e.ename
        when 'SMITH' then '張三'
          when 'ALLEN' then '李四' 
            when 'WARD' then '王五'
              --else '無名'
                end
from emp e;
---判斷emp表中員工的工資,如果高於3000顯示高收入,如果高於1500低於3000顯示中等收入,其餘顯示低收入
select e.sal,
      case
        when e.sal>3000 then '高收入'
          when e.sal>1500 then '中等收入' 
              else '低收入'
                end
from emp e;
----oracle中除了起別名,都用單引號.
----oracle專用條件表達式
select e.ename,
      decode(e.ename,
         'SMITH' , '張三',
           'ALLEN' , '李四' ,
             'WARD' , '王五',
               '無名') 中文名 
from emp e;

7.多行函數

--多行函數(聚合函數):作用於多行,返回一個值
select count(1) from emp;---查詢總數量
select sum(sal) from emp;---工資總和
select max(sal) from emp;---最大工資
select min(sal) from emp;---最低工資
select avg(sal) from emp;---平均工資

8.分組查詢

---查詢出每個部門的平均工資
select e.deptno,avg(e.sal)
from emp e
group by e.deptno
---查詢出平均工資高於2000的部門信息
select e.deptno,avg(e.sal)
from emp e
group by e.deptno
having avg(e.sal)>2000;
---所有條件都不能使用別名來判斷.

---查詢出每個部門工資高於800的員工的平均工資
select e.deptno,avg(e.sal)
from emp e
where e.sal>800
group by e.deptno
----where是過濾分組前的數據,having是過濾分組後的數據.
---表現形式:where必須在group by之前,having是在group by之後.
---查詢出每個部門工資高於800的員工的平均工資,然後再查詢出平均工資高於2000的部門
select e.deptno,avg(e.sal)
from emp e
where e.sal>800
group by e.deptno
having avg(e.sal)>2000

9.自連接概念

---自連接概念
---自連接:自連接其實就是站在不同的角度把一張表看成多張表.
select e1.ename,e2.ename
from emp e1,emp e2
where e1.mgr = e2.empno
----查詢員工姓名,員工部門名稱,員工領導姓名,員工領導部門名稱
select e1.ename, d1.dname,e2.ename,d2.dname
from emp e1,emp e2,dept d1,dept d2
where e1.mgr = e2.empno
and e1.deptno = d1.deptno
and e2.deptno = d2.deptno

10.子查詢

---子查詢返回一個值
---查詢出工資和scott一樣的員工信息
select * from emp where sal in 
(select sal from emp where ename = 'SCOTT')
---子查詢返回一個集合
---查詢出工資和10號部門任意員工一樣的員工信息
select * from emp where sal in
(select sal from emp where deptno = 10)
---子查詢返回一張表
---查詢出每個部門的最低工資,和最低工資員工的姓名,和該員工所在部門的名稱
---1.先查出每個部門的最低工資
select deptno,min(sal) msal
from emp
group by deptno;
---2.三表聯查,得到最終的結果
select t.deptno,t.msal,e.ename,d.dname
from (select deptno,min(sal) msal
      from emp
      group by deptno) t,emp e,dept d
where t.deptno = e.deptno
and t.msal = e.sal
and e.deptno = d.deptno;

11.分頁查詢

----oracle中的分頁
---rownum行號:行號從1開始,一次遞增,不能調走
----排序操作會影響rownum的順序
select rownum,e.* from emp e order by e.sal desc;

select rownum,t.* from
(select rownum,e.* from emp e order by e.sal desc) t

----emp表工資倒敘排列後,每頁5條記錄,查詢第二頁
----rownum行號不能寫上大於一個正數
select * from
(select rownum rn,e.* from
        (select * from emp order by sal desc) e
where rownum<11) tt where rn>5

12.視圖

---視圖的概念:視圖就是提供一個查詢的窗口,所有數據來自原表.
---使用查詢語句創建表
create table emp as select * from scott.emp;
select * from emp;
---創建視圖【必須有DBA權限】
create view v_emp as select ename,job from emp;
---查詢視圖
select * from v_emp;
---修改視圖[不推薦]
update v_emp set job='CLERK' where ename='ALLEN';
commit;
---創建自讀視圖
create view v_emp1 as select ename,job from emp with read only;
---視圖的作用
---第一:視圖可以屏蔽掉一些敏感字段.
---第二:保證總部和分部數據及時統一.

13.索引

--索引的概念:索引就是在表的列上構建一個二叉樹
----達到大幅度提高查詢效率,但是索引回影響增刪改的效率.
---單列索引
---創建一個單列索引
create index idx_ename on emp(ename);
---單列索引觸發規則:條件必須是索引列中的原始值.
---單行函數,模糊查詢,都會影響索引的觸發.
select * from emp where ename='SCOTT';
---複合索引
---創建複合索引
create index idx_enamejob on emp(ename,job);
---複合索引的第一列爲優先檢索列;
---複合索引的觸發規則:如果要觸發複合索引,必須有優先檢索列的原始值.
select * from emp where ename='SCOTT' and job='xx'---觸發複合索引
select * from emp where ename='SCOTT' or job='xx'---不觸發索引
select * from emp where ename='SCOTT';--如果既有單列索引和複合索引,此時只觸發單列索引

14.pl/sql編程語言

---pl/sql編程語言
---pl/sql編程語言是對sql語言的擴展,使得sql語言具有過程化編程的特性.
---pl/sql編程語言比一般的編程語言,更加靈活高效.
---pl/sql編程語言主要用來編寫存儲過程和存儲函數等.
  • pl/sql編程語言定義變量

    ---聲明方法
    ---賦值操作可以使用:=也可以使用into查詢語句賦值
        declare
          i number(2) := 10;--定義變量(數值類型)
          s varchar2(10) := '小明';--定義變量(字符串類型)
          ena emp.ename%type;--引用表字段類型(引用型變量)
          emprow emp%rowtype;---記錄型變量
      begin
            dbms_output.put_line(i);
            dbms_output.put_line(s);
            select ename into ena from emp where empno = 7788;
            dbms_output.put_line(ena);
            select * into emprow from emp where empno = 7788;
            dbms_output.put_line(emprow.ename || '的工作爲' || emprow.job);
        end;
    
  • pl/sql中的if判斷

    ---pl/sql中的if判斷
    ---輸入小於18的數字,輸出未成年
    ---輸入大於18小於40的數字,輸出中年人
    ---輸入大於40的數字,輸出老年人
    declare
    i number(3) :=&ii;--手動輸入一個值
    begin
    if i<18 then
      dbms_output.put_line('未成年');
    elsif i<40 then
      dbms_output.put_line('中年人');
    else
      dbms_output.put_line('老年人');
    end if;
    end;
    
  • pl/sql中的循環

    ---pl/sql中的loop循環
    ---用三種方式輸出1到10中的10個數字
    ---while循環
    declare
      i number(2) := 1;
    begin
      while i<11 loop
        dbms_output.put_line(i);
        i := i+1;
      end loop;
    end;
    ---exit循環
    declare
      i number(2) := 1;
    begin
      loop
        exit when i>10;
        dbms_output.put_line(i);
        i := i+1;
      end loop;
    end;
    ---for循環
    declare
    
    begin
      for i in 1..10 loop
        dbms_output.put_line(i);
      end loop;
    end;
    
  • pl/sql中的遊標

    ---遊標:,可以存放多個對象,多行記錄
    ---輸出emp表中所有員工的姓名
    declare
      cursor c1 is select * from emp;
      emprow emp%rowtype;
    begin
      open c1;
        loop
          fetch c1 into emprow;
          exit when c1%notfound;
          dbms_output.put_line(emprow.ename);
        end loop;
      close c1;
    end;
    
    ----給指定部門的員工漲工資
    declare
      cursor c2(eno emp.deptno%type)
      is select empno from emp where deptno = eno;
      en emp.empno%type;
    begin
      open c2(10);
        loop
          fetch c2 into en;
          exit when c2%notfound;
          update emp set sal=sal+100 where empno=en;
        end loop;
      close c2;
    end;
    
    ---查詢10號部門所有的員工
    select * from emp where deptno = 10;
    
  • pl/sql的存儲過程

    ---存儲過程
    --存儲過程:存儲過程就是提親已經編譯好的一段pl/sql語言,放置在數據庫端
    ----------可以直接被調用.這一段pl/sql一般都是固定步驟的業務.
    ----給指定的員工漲100元
    create or replace procedure p1(eno emp.empno%type)
    is
    
    begin
      update emp set sal = sal+100 where empno = eno;
      commit;
    end;
    
    select * from emp where empno = 7788;
    ---測試p1
    declare
    
    begin
      p1(7788);
    end;
    
  • pl/sql的存儲函數

    ---通過存儲函數實現計算指定員工的年薪
    ---存儲過程和存儲函數的參數都不能帶長度
    ---存儲函數的返回值類型不能帶長度
    create or replace function f_yearsal(eno emp.empno%type) return number
    is
      s number(10);
    begin
      select sal*12 +nvl(comm,0) into s from emp where empno=eno;
      return s;
    end;
    
    ----測試f_yearsal
    ----存儲函數在調用的時候返回值需要接收.
    declare
      s number(10);
    begin
      s := f_yearsal(7788);
      dbms_output.put_line(s);
    end;
    
  • pl/sql語言out類型參數的使用

    ---out類型的參數如何使用
    ---使用存儲過程來計算年薪
    create or replace procedure p_yearsal(eno emp.empno%type,yearsal out number)
    is
      s number(10);
      c emp.comm%type;
    begin
      select sal*12,nvl(comm,0) into s,c from emp where empno = eno;
      yearsal := s+c;
    end;
    
    ---測試p_yearsal
    declare
      yearsal number(10);
    begin
      p_yearsal(7788,yearsal);
      dbms_output.put_line(yearsal);
    end;
    
    ---in和out類型的參數區別:凡是涉及into查詢語句賦值或者:=賦值操作的參數,都必須使用out來修飾
    
  • 觸發器的使用
    —觸發器,就是制定一個規則,在我們做增刪改操作的時候,
    ----只要滿足該規則,自動觸發,無需調用.
    —語句級觸發器:不包含for each row的觸發器
    —行級觸發器:包含有for each row的就是行級觸發器.
    ----加for each row是爲了使用:old或者new對象.

    • 語句級觸發器

      ---插入一條記錄,輸出一個新員工入職
      create or replace trigger t1
      after
      insert
      on person
      declare
      
      begin
        dbms_output.put_line('一個新員工入職');
      end;
      
      --觸發t1
      insert into person values(1,'小紅');
      commit;
      select * from person;
      
    • 行級觸發器

      ---行級觸發器
      ---不能給員工降薪
      ---raise_application_error(-20001~-20999之間,'錯誤的提示信息');
      create or replace trigger t2
      before
      update
      on emp
      for each row
      declare
      
      begin
        if :old.sal>:new.sal then
          raise_application_error(-20001,'不能給員工降薪');
        end if;
      end;
      
      --觸發t2
      update emp set sal = sal-1 where empno=7788;
      commit;
      select * from emp where empno=7788;
      
    • 觸發器實現行級自增

      ---觸發器實現行級自增,[行級觸發器]
      ---分析:在用戶做插入操作的之前,拿到即將插入的數據,
      ----給該數據中的主鍵列賦值.
      create or replace trigger auid
      before
      insert
      on person
      for each row
      declare
      
      begin
        select s_person.nextval into :new.pid from dual;
      end;
      
      select * from person;
      ---使用auid實現主鍵自增
      insert into person (pname) values('a');
      commit;
      
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章