oracle實戰(一)

1、表空間的建立以及刪除

聲明:此操做環境爲windows,oracle10Ghtml

表空間? ORACLE數據庫的邏輯單元。 數據庫---表空間 一個表空間能夠與多個數據文件(物理結構)關聯
一個數據庫下能夠創建多個表空間,一個表空間能夠創建多個用戶、一個用戶下能夠創建多個表。 create tablespace test datafile 'c:\test.dbf' size 100m autoextend on
next 100m; test 爲表空間名稱 datafile 指定表空間對應的數據文件 size 後定義的是表空間的初始大小 autoextend on 自動增加 ,當表空間存儲都佔滿時,自動增加 next 後指定的是一次自動增加的大小。

 

2、用戶

1.用戶的建立、設置密碼、設置表空間

create user test identified by password default tablespace test; ​ -- create user 用戶名 -- identified by 後邊是用戶的密碼  -- default tablespace 後邊是表空間名稱  -- oracle數據庫與其它數據庫產品的區別在於,表和其它的數據庫對象都是存儲在用戶下的。

 

二、受權

-- oracle數據庫經常使用角色: -- connect--鏈接角色,基本角色 -- resource--開發者角色 -- dba--超級管理員角色
-- 例1:給一個用戶授予dba權限(這在生產環境中是不推薦的)
grant dba to test; -- 例2:給一個用戶授予開發者權限(注意,必須加上connect,否則沒法鏈接數據庫)
grant resource,connect to test;

 

三、刪除用戶

-- 注意:刪除用戶的時候,該用戶須要處於未登錄狀態 -- 例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; 

3、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

4、簡單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;

 

 

5、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;

6、序列

簡介:

序列不真的屬於任何一張表,可是能夠邏輯和表作綁定。 序列:默認從1開始,依次遞增,主要用來給主鍵賦值使用。 dual:虛表,只是爲了補全語法,沒有任何意義。mysql

 

一、建立序列

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;

 

7、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

 

8、視圖

-- 前言:若是要操做視圖,用戶須要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; -- 視圖的做用? -- 第一:視圖能夠屏蔽掉一些敏感字段。 -- 第二:保證總部和分部數據及時統一。

 

9、索引

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

CREATE INDEX index_name ON table_name(column_name,column_name) include(score) -- 索引範例二 -- 普通索引
CREATE UNIQUE INDEX index_name ON table_name (column_name) ; -- 非空索引
CREATE PRIMARY KEY INDEX index_name ON table_name (column_name) ; -- 主鍵索引 -- 使用ALTER TABLE語句建立索引
alter table table_name add index index_name (column_list) ; alter table table_name add unique (column_list) ; alter table table_name add primary key (column_list) ; -- 刪除索引
drop index index_name on table_name ; alter table table_name drop index index_name ; alter table table_name drop primary key ; -- 建立索引
alter table tbl_name add primary key (column_list): -- 該語句添加一個主鍵,這意味着索引值必須是惟一的,且不能爲 null。

alter table tbl_name add unique index_name (column_list): -- 這條語句建立索引的值必須是惟一的(除了 null 外,null 可能會出現屢次)。

alter table tbl_name add index index_name (column_list): -- 添加普通索引,索引值可出現屢次。

alter table tbl_name add fulltext index_name (column_list): -- 該語句指定了索引爲 fulltext ,用於全文索引。

-- 刪除索引
drop index [indexname] on mytable; -- 修改
alter mytable add index [indexname] on(username(length)) -- 查詢 -- 使用 show index 命令來列出表中的相關的索引信息。能夠經過添加 \g 來格式化輸出信息。
show index from table_name \g

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,插入數據正常

 

做者:醉煙sql

本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。

原文出處:https://www.cnblogs.com/WangLei2018/p/11295639.html數據庫

相關文章
相關標籤/搜索