Oracle以數據存儲量大,處理速度快,安全性高,容錯性強等出色的特徵,長期以來佔據着全球數據庫市場的主導地位。java
安裝:百度搜索安裝教程sql
鏈接:使用PLSQL Developer對Oracle進行鏈接數據庫
體系結構:編程
數據庫:Oracle數據庫是數據的物理存儲。這就包括數據文件ORA或者DBF,控制文件,聯機日誌,參數文件。其實Oracle數據庫的概念和其餘數據庫不同,這裏的數據庫是一個操做系統只有一個庫,能夠看做是Oracle就只有一個大數據庫安全
實例:一個Oracle實例有一個系列的後臺進程和內存結構組成,一個數據庫能夠有N個實例oracle
用戶:用戶是在實例下創建的,不一樣的實例能夠建相同名字的用戶。app
表空間:表空間是Oracle對物理數據庫上相關數據文件的邏輯映射,一個數據庫在邏輯上被劃分到一個到若干個表空間,每一個表空間包含了在邏輯上相關聯的一組結構,每一個數據庫至少有一個表空間編程語言
數據文件:數據文件是數據庫的物理存儲單位。數據庫的數據是存儲在表空間中的。真正是在某一個或多個數據文件中。而一個表空間能夠由一個或多個數據文件組成,一個數據文件只能屬於一個表空間,一旦數據文件被加入到某個表空間後,就不能刪除這個文件,若是要刪除某個數據文件,只能刪除其所屬於的表空間才行。ide
建立表空間:函數
create tablespace demo
datafile'c:\demo.dbf'
size 100m
autoextend on
next 10m;
刪除表空間
drop tablespace demo;
建立用戶
create user demoUser
identified by 123456
default tablespace demo;
給用戶受權
grant dba to demo;
補充:oracle數據庫中的經常使用角色:一、connect,鏈接角色,基本角色;二、resource,開發者角色;三、dba,超級管理員角色
Oracle數據類型
一、Varchar,varchar2,表示一個字符串
二、number,number(n)表示一個整數,長度爲n;number(m,n),總長度m,小數n,整數是m-n
三、data,表示日期類型
四、clob,大對象,表示大文本數據類型
五、blob,大對象,表示二進制數據
表的管理
一、創建表
create table person(
id number(20),
name varchar(10)
);
二、修改表的結構
2.一、添加一列
alter table person add gender number(1);
2.二、修改列類型
alter table person modify gender char(1);
2.三、修改列名稱
alter table person rename column gender to sex;
2.四、刪除列
alter table person drop column sex;
三、數據增刪改:
3.一、添加一條記錄
insert into person (id,name)value (1,‘讀者’);
commit;
3.二、修改一條記錄
update person set name=‘新讀者’ where id =1 ;
commit;
3.三、刪除
delete from person;--刪除表中全部記錄
drop table person;--刪除表結構
truncate table person;--相似deldte,可是效率更高
注意:id(主鍵的值)通常使用序列,默認從1開始,依次遞增,主要用來給主鍵賦值使用
建立一個序列:create sequence s_person;
使用序列:insert into person (id,name)vlaue (s_person.nextval,'讀者');
scott用戶,密碼tiger
解鎖scott用戶:alter user scott account unlock;
解鎖scott用戶密碼:alter user scott identified by tiger;
函數:
單行函數:做用於一行,返回一個值
多行函數:做用於多行,返回一個值
字符函數:
select upper(‘yes’) from dual:--YES
select lower(‘YES’) from dual;--yes
注意:dual表示虛表,僅用於補全語句
數值函數:
select round(12.22,1)from dual;--四捨五入,後面的參數表示保留的小數位數
select trunc(12.22,1)from dual;--直接截取
select mod(10,3) from dual;--求餘數
日期函數:
select sysdate from dual;--查詢如今的時間
select sysdate-e.hiredate from emp e;--相差的天數
select months_between(sysdate,e.hiredate)from emp e;--相差的月數
轉換函數:
select to_char(sysdate,'fm yyyy-mm-dd hh24:mi:ss') from dual;--日期轉字符串
select to_date('2018-6-7 16:39:50','fm yyyy-mm-dd hh24:mi:ss') from dual;--字符串轉日期
通用函數:
select e.sal+nvl(e.comm,0) from emp e;-- 若是e.comm的值爲null,則用默認值0
條件表達式:
第一種用法:
select e.name
case e.name
when‘SMITH’ then ‘史密斯’
when'ALLEN' then'阿倫'
else ‘無’ --可省略
end
from emp e;
第二種用法:
select e.sal
case e.sal
when e.sal>3000 then ‘高收入’
when e.sal>1500 then ‘中等收入’
else ‘低收入’
end
from emp e;
補充:oracle專用寫法
select e.name
decode(e.name
'SMITH' , '史密斯',
'ALLEN','阿倫')中文名
from emp e;
多行函數:
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;--查詢平均值
分組查詢:
select e.deptno,avg(e.sal)
from emp e
where e.sal >800
group by e.deptno
having avg(e.sal) >2000
多表查詢的概念
笛卡爾積:表1,n條記錄,表2,m條記錄,結果n*m
等值鏈接:
select * from emp e , dept d
where e.deptno=d.deptno
內鏈接:
select * from emp e inner join dept d
on e.deptno = d.deptno
外鏈接:
select * from emp e right join dept d
on e.deptno = d.deptno;--右外鏈接,右表全部內容和左表交集內容
select *from emp e left join dept d
on e.deptno = d.deptno;--左外鏈接,左表全部內容和右邊交集內容
補充:oracle中專用外鏈接
select * from emp e ,dept d
where e.deptno(+) = d.deptno;-- 等同於外鏈接的第一條語句
自鏈接:就是站在不一樣的角度把一張表當作多張表
select e1.name ,e2.name
from emp e1, emp e2
where e1.mgr=e2.empno;
子查詢
子查詢返回一個值:
select * from emp where sal =(select sal from emp where id = 1);
子查詢返回一個集合:
select * from emp where sal in(select sal from emp where deptno = 10);
子查詢返回一個表:
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 = r.sal and e.deptno=d.deptno;
分頁查詢:
select * from (
select rownum rn, e.* from(
select * from emp order by sal desc
) e where rownum<11
)where rn > 5;
視圖:就是提供一個查詢的窗口,全部的數據來自於原表
補充:經過查詢語句建立表;create table emp as select * from scott.emp;--能夠跨用戶查詢
建立視圖:create view v_emp as select name,job from emp;
查詢視圖:select * from v_emp
修改視圖:update v_emp set job= ‘CLERK’ where name = ‘ALLEN’ ;commit;
建立只讀視圖:create view v_emp as select name ,job from emp with read only;
視圖的做用:
一、視圖能夠屏蔽掉一些敏感字段
二、保證總部和分部數據及時統一
索引:就是在表的列上構建一個二叉樹,達到大幅度提升查詢效率的目的,可是索引會影響增刪改的效率
單列索引:
建立單列索引:create index idx_name on emp(name);
單列索引觸發規則,條件必須索引中的原始值,單行函數和模糊查詢不會觸發
複合索引:
建立複合索引:create index idx_namejob on emp(name,job);
複合索引中的第一列爲優先檢索列,若是要觸發複合索引,必須包含有優先檢索列中的原始值。
pl/sql編程語言
pl/sql編程語言是對sql語言的擴展,使得sql語言具備過程化編程語言的特性;比通常的過程化編程語言更加靈活,主要用來編寫存儲過程和存儲函數。
聲明方法:
declare
i number(2):=10;
s varchar(10):=‘小明’;
ena emp.name%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.name || emprow.job);
end;
if語句:
declare
i number(3):=&age;
begin
if i<18 then
dbms_output.put_line(' 未成年');
if i<50 then
dbms_output.put_line('中年人');
else
dbms_output.put_line('老年人');
end if;
end;
loop語句
whlie循環:
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;
遊標:相似與Java中的集合,能夠存放多個對象,多行記錄
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;
commit;
end loop;
close c2;
end;
存儲過程:就是提早編譯好的一段pl/sql語言,放置在數據庫,能夠直接被調用。這段pl/sql通常都是固定步驟的業務。
create or replace procedure p1(eno emp.empno%type)
is
begin
update emp set sal = sal+100 where empno = eno;
commit;
end;
調用存儲過程
declare
begin
p1(7788);
end;
存儲函數:
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;
調用存儲函數
declare
s number(10);
begin
s:=f_yearsal(7788);
dbms_output.put_line(s);
end;
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;
調用:
declare
yearsal number(10);
begin
p_yearsal(7788,yearsal);
end;
觸發器:就是制定一個規則,在咱們作增刪改操做的時候,只要知足改規則,自動觸發,無需調用。
語句級觸發器:不包含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;
行級觸發器代碼:
create or replace trigger t2
before
update
on emp
for each row
declare
begin
if :old.sal>:new.sal then
reise_application_error(-20001,'不能下降工資');
end if;
end;
java調用:
導入jar包,oracle10g對應jar包ojdba14.jar,oracle11g對應jar包ojdbc6.jar
@Test public class testOracle()throws Exception(){ Class.forName("oracle.jdbc.driver.OraceDriver"); Connection connection=DriverManager.getConnection("jdbc:oracle:localhost:1521:orcl","user","123456"); PreparedStatement pstm = connection.preparedStatement("select * from emp where = ?"); pstm = setObject(1,7788); ResultSet rs = pstm.executeQuery(); while(rs.next()){ System.out.println("rs.getString(name)"); } rs.close(); pst.close(); connection.close(); }
java調用存儲過程和存儲函數:
使用CallableStatement,進行調用。
@Test public class testOracle()throws Exception(){ Class.forName("oracle.jdbc.driver.OraceDriver"); Connection connection=DriverManager.getConnection("jdbc:oracle:localhost:1521:orcl","user","123456"); CallableStatement pstm = connection.prepareCall("{call p_yearsal(?,?)}"); pstm.setObject(1,7788); pstm.registerOutParameter(2,OracleTypes.NUMBER); pstm.execute(); System.out.println(pstm.getObject(2)); pst.close(); connection.close(); }