Oracle資料庫入門
阿新 • • 發佈:2020-08-09
--建立表空間 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,插入資料正常