一、表空間的創建以及刪除 聲明:此操作環境為windows,oracle10G 二、用戶 1.用戶的創建、設置密碼、設置表空間 2、授權 3、刪除用戶 4.解鎖用戶 三、Oracle數據類型(簡單的) 四、簡單DDL(數據定義語言) 1.創建表 2.修改表結構 五、DML(數據操作語言) =》 增刪 ...
表空間? ORACLE資料庫的邏輯單元。 資料庫---表空間 一個表空間可以與多個數據文件(物理結構)關聯 一個資料庫下可以建立多個表空間,一個表空間可以建立多個用戶、一個用戶下可以建立多個表。 create tablespace test datafile 'c:\test.dbf' size 100m autoextend on next 100m; test 為表空間名稱 datafile 指定表空間對應的數據文件 size 後定義的是表空間的初始大小 autoextend on 自動增長 ,當表空間存儲都占滿時,自動增長 next 後指定的是一次自動增長的大小。
二、用戶
1.用戶的創建、設置密碼、設置表空間
create user test identified by password default tablespace test; -- create user 用戶名 -- identified by 後邊是用戶的密碼 -- default tablespace 後邊是表空間名稱 -- oracle資料庫與其它資料庫產品的區別在於,表和其它的資料庫對象都是存儲在用戶下的。
2、授權
-- oracle資料庫常用角色: -- connect--連接角色,基本角色 -- resource--開發者角色 -- dba--超級管理員角色 -- 例1:給一個用戶授予dba許可權(這在生產環境中是不推薦的) grant dba to test; -- 例2:給一個用戶授予開發者許可權(註意,必須加上connect,不然無法連接資料庫) grant resource,connect to test;
3、刪除用戶
-- 註意:刪除用戶的時候,該用戶需要處於未登陸狀態 -- 例1:刪除一個沒有自己創建對象的用戶 drop user test; -- 例2:刪除含有自己創建的對象的用戶時(需要使用CASCADE) drop user test cascade;
4.解鎖用戶
-- 例如:解鎖scott用戶(密碼預設是tiger) -- 解鎖scott用戶 alter user scott account unlock; -- 設置scott用戶的密碼【此句也可以用來重置密碼】 alter user scott identified by tiger;
三、Oracle數據類型(簡單的)
NO | 數據類型 | 描述 |
---|---|---|
1 | varchar,varchar2 | 表示一個字元串 |
2 | number | NUMBER(n)表示一個整數,長度是n NUMBER(m,n):表示一個小數,總長度是m,小數是n,整數是m-n |
3 | date | 表示日期類型 |
4 | clob | 大對象,表示大文本數據類型,可存4G |
5 | blob | 大對象,表示二進位數據,可存4G |
四、簡單DDL(數據定義語言)
1.創建表
語法: Create table 表名( 欄位1 數據類型 [default 預設值], 欄位2 數據類型 [default 預設值], ... 欄位n 數據類型 [default 預設值] ); -- 創建一個person表 create table person( pid number(20), pname varchar2(10) );
2.修改表結構
---添加一列 alter table person add (sex number(1)); -- 修改列類型 alter table person modify sex char(1); -- 修改列名稱 alter table person rename column sex to gender; -- 刪除一列 alter table person drop column gender;
五、DML(數據操作語言) =》 增刪改
1.插入數據
insert into person (pid,pname) values('1','小李'); commit;
2.修改數據
update person set pname = '小張' where pid = '1'; commit;
3.三種刪除
-- 刪除表中全部記錄 delete from person; -- 刪除表結構 drop table person; -- 先刪除表,再次創建表。效果等同於刪除表中全部記錄。 -- 在數據量大的情況下,尤其在表中帶有索引的情況下,該操作效率高。 -- 索引可以提供查詢效率,但是會影響增刪改效率。 truncate table person;
六、序列
簡介:
序列不真的屬於任何一張表,但是可以邏輯和表做綁定。 序列:預設從1開始,依次遞增,主要用來給主鍵賦值使用。 dual:虛表,只是為了補全語法,沒有任何意義。
1、創建序列
create sequence sq_person;
2.兩個函數及序列用法
-- sequence.nextval 序列自增並查詢 select sq_person.nextval from dual; -- sequence.currval 查詢序列當前參數 select sq_person.currval from dual; -- 註意:序列剛創建的時候不能直接使用currval函數,需要在nextval函數執行後才能執行 -- 充當主鍵(插入數據): insert into person (pid, pname) values (s_person.nextval, '小明'); commit;
3.刪除序列
drop sequence sq_person;
七、DQL(數據查詢語言)
前言:要測試以下部分例子:請切換到scott用戶 以下使用的表為該用戶自帶的預設表
1.簡單查詢
select * from person; -- 開發不推薦 select pid,pname from person; -- 開發推薦
2.單行函數、條件表達式、多行函數、分組查詢、多表查詢、子查詢、分頁查詢
a.單行函數
-- 字元函數 -- 接收字元輸入返回字元或者數值,dual是偽表 -- 1. 把小寫的字元轉換成大小的字元 upper('smith') select upper('yes') from dual;--YES -- 2. 把大寫字元變成小寫字元 select lower('YES') from dual;--yes -- 數值函數 select round(56.16, -2) from dual;---四捨五入,後面的參數表示保留的位數 select trunc(56.16, -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) 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; -- 通用函數 -- 算出emp表中所有員工的年薪 -- 獎金裡面有null值,如果null值和任意數字做算術運算,結果都是null。 select e.sal*12+nvl(e.comm, 0) from emp e;
b.條件表達式
---條件表達式的通用寫法,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;
c.多行函數
-- 多行函數【聚合函數】:作用於多行,返回一個值。 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; -- 平均工資
d.分組查詢
-- 查詢出每個部門的平均工資 -- 分組查詢中,出現在group by後面的原始列,才能出現在select後面 -- 沒有出現在group by後面的列,想在select後面,必須加上聚合函數。 -- 聚合函數有一個特性,可以把多行記錄變成一個值。 select e.deptno, avg(e.sal)--, e.ename from emp e group by e.deptno; -- 查詢出平均工資高於2000的部門信息 select e.deptno, avg(e.sal) asal from emp e group by e.deptno having avg(e.sal)>2000; -- 所有條件都不能使用別名來判斷。 -- 比如下麵的條件語句也不能使用別名當條件 select ename, sal s from emp where sal>1500; -- 查詢出每個部門工資高於800的員工的平均工資 select e.deptno, avg(e.sal) asal 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) asal from emp e where e.sal>800 group by e.deptno having avg(e.sal)>2000;
e.多表查詢
-- 笛卡爾積 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;
f.子查詢
-- 子查詢返回一個值 -- 查詢出工資和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;
g.分頁查詢
-- 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
八、視圖
-- 前言:如果要操作視圖,用戶需要dab許可權 -- 視圖的概念:視圖就是提供一個查詢的視窗,所有數據來自於原表。 -- 查詢語句創建表 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'; -- 觸發單列索引。
bug總結:
1.中文亂碼的解決:
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,插入數據正常
作者:醉煙
出處:https://www.cnblogs.com/WangLei2018/ 本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。