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.數據類型和表的創建以及操作
-
數據類型
- Varchar, varchar2 表示一個字符串
- NUMBER NUMBER(n)表示一個整數,長度是n NUMBER(m,n):表示一個小數,總長度是 m,小 數是 n,整數是 m-n
- DATA 表示日期類型
- CLOB 大對象,表示大文本數據類型,可存 4G
- 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) :=ⅈ--手動輸入一個值 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;
-