1. 程式人生 > 實用技巧 >Oracle資料庫入門

Oracle資料庫入門

--建立表空間
create tablespace oraclestudy
datafile 'E:\oraclestudy.dbf'
size 100m
autoextend on
next 10;

--刪除表空間
drop tablespace oraclestudy;

--建立使用者
create user oraclestudy --使用者名稱
identified by oraclestudy --密碼
default tablespace oraclestudy --預設表空間

--給使用者授權
--roacle資料庫種常用角色
connect--連線角色 基本角色
resource--開發者角色
dba--超級管理員角色

--給 oraclestudy使用者新增dba角色
grant dba to oraclestudy;

--切換到oraclestudy使用者下


--切換到oraclestudy使用者下

--建立一個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;

--新增一條記錄
insert into person (pid,pname) values(1,'小明');
commit;

--查詢表中記錄
select * from person

--修改資料
--修改一條記錄
update person set pname = '小王' where pid = 1;
commit;

--刪除部分資料
delete person where pid = 1 and pname = '小明';
commit;

--三個刪除
--刪除表中全部記錄
delete from person;
--刪除表結構
drop table person;
--先刪除表,再常見表,效果等同於刪除表中資料
--在資料量大的情況下,尤其在表中有索引的情況下,該操作效率高
truncate table person;

--序列:預設從1開始,依次遞增,主要用來給主鍵賦值使用
--序列不屬於任何一張表,但是可以邏輯和表做繫結
create sequence s_person;

--dual:虛表,只是為了補全語法,沒有任何意義
select s_person.currval from  dual;



--scott使用者,密碼預設tiger
--解鎖scott使用者
alter user scott account unlock;  
--解鎖使用者的密碼(此句也可以用來重置密碼)
alter user scott identified by tiger; 

--切換到scott使用者


--單行函式:作用於一行,返回一個值

--字元函式
select upper('yes') from dual;--小寫變大寫
select lower('YES') from dual;--小寫變大寫

--數字函式
select round(26.11,1) from dual; --四捨五入
select trunc(28.192,2) from dual; --直接擷取位數
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;

--轉換函式
--日期轉字串
select to_char(sysdate,'yyyy-mm-dd hh:mi:ss') from dual; 
--字串轉日期
select to_date('2020-08-09 09:52:55','fm yyyy-mm-dd hh:mi:ss') from dual;
--通用函式
--算出emp表中所有員工的年薪
select e.sal*12+nvl(e.comm,0) from emp e;



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


--分組查詢
--查詢出每個部門的平均工資
--分組查詢中,出現在group by 後面的的原始列,才能出現在select後面 
--沒有出現在group by 後面的列,想要出現在select後面,必須加聚合函式。
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;
--注意,所有條件都不能使用別名判斷

----where是過濾分組前的資料,having是過濾分組後的資料。
---表現形式:where必須在group by之前,having是在group by之後。

---多表查詢中的一些概念
---笛卡爾積
select *
from emp e, dept d;
---等值連線
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 * from emp;
---查詢出員工姓名,員工領導姓名
---自連線:自連線其實就是站在不同的角度把一張表看成多張表。
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;



---oracle中專用外連線
select *
from emp e, dept d
where e.deptno(+) = d.deptno;

---自連線:自連線其實就是站在不同的角度把一張表看成多張表。
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;


---子查詢
---子查詢返回一個值
---查詢出工資和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;



----oracle中的 分頁
---rownum行號:當我們做select操作的時候,
--每查詢出一行記錄,就會在該行上加上一個行號,
--行號從1開始,依次遞增,不能跳著走。

----排序操作會影響rownum的順序
select rownum, e.* from emp e order by e.sal desc
----如果涉及到排序,但是還要使用rownum的話,我們可以再次巢狀查詢。
select rownum, t.* from(
select rownum, e.* from emp e order by e.sal desc) t;


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

---檢視
---檢視的概念:檢視就是提供一個查詢的視窗,所有資料來自於原表。

---查詢語句建立表
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;
---檢視的作用?
---第一:檢視可以遮蔽掉一些敏感欄位。
---第二:保證總部和分部資料及時統一。


---索引
--索引的概念:索引就是在表的列上構建一個二叉樹
----達到大幅度提高查詢效率的目的,但是索引會影響增刪改的效率。
---單列索引
---建立單列索引
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';---觸發單列索引。


oralce插入資料庫中文亂碼問題解決:
  1.檢視伺服器端編碼
    select userenv(‘language‘) from dual;
    我實際查到的結果為:AMERICAN_AMERICA.ZHS16GBK
  2.執行語句 select * from V$NLS_PARAMETERS
    檢視第一行中 PARAMETER 項中為 NLS_LANGUAGE 對應的 VALUE 項中是否和第一步得到的值一樣。
    如果不是,需要設定環境變數.
    否則PLSQL客戶端使用的編碼和伺服器端編碼不一致,插入中文時就會出現亂碼.
  3.設定環境變數
    計算機->屬性->高階系統設定->環境變數->新建
    設定變數名:NLS_LANG,變數值:第1步查到的值, 我的是 AMERICAN_AMERICA.ZHS16GBK
  4.重新啟動PLSQL,插入資料正常