1. 程式人生 > >Oracle資料庫基礎學習DAY1

Oracle資料庫基礎學習DAY1

1.資料字典(data dictionary)是資料庫中所有物件及其關係的資訊集合。
·系統空間資訊
·資料庫中物件資訊
·效能以及統計資訊
·Oracle使用者資訊
·使用者訪問、操作資訊
·使用者角色等許可權資訊
·列的相關資訊
2.資料檔案包括了全部資料庫資料
·一個數據庫可以有多個數據檔案
·一個數據檔案只能對應一個數據庫
·可以對資料檔案進行設定
·一個表空間可以由一個或多個數據檔案組成
·資料檔案是物理結構
3.控制檔案
·控制檔案是一個很小的二進位制檔案,
它維護著資料庫的全域性物理結構,
用以支援資料庫的啟動和執行
·建立資料庫時同時就建立了與之對應的控制檔案,
在資料庫使用過程中,Oracle不斷的更新控制檔案,
所以只要資料庫是開啟的,控制檔案就處於可寫狀態。
·它是二進位制檔案
4.表空間
·表空間是Oracle資料庫恢復的最小單元,
容納著許多資料庫實體,如表、檢視、
索引、聚簇、回退段和臨時段等。
·是邏輯結構
5.日誌檔案
·日誌檔案也叫做重做日誌檔案,
用於記錄對資料庫的所有操作資訊。
·日誌檔案是保證資料庫安全和資料庫備份與恢復的檔案
·在一個Oracle資料庫中,至少有兩個日誌檔案組,
每組有一個或多個日誌成員。
6.賬戶
 使用者名稱/密碼登陸身份說明
 sys/change_on_installSYSDBA或SYSOPER不能以normal登陸,預設管理員
 system/managerSYSDBA或NORMAL不能以SYSOPER登陸,預設管理員
 scott/tigerNORMAL普通使用者


7.建立表空間
create tablespace XXX datafile '/u01/app/test.dbf' size 500m next 50m maxsize 1g autoextend on;


8.建立和刪除使用者
create user pacey identified by 123456;//建立使用者pacey
grant connect,resource,sysoper to pacey;//授予連線,資源,sysoper許可權
conn pacey/123456//登陸pacey使用者
conn / as sysdba//登陸管理員
drop user pacey cascade;//刪除使用者pacey


9.oracle許可權
grant connect,resource to pacey with admin option; //授予許可權並可以轉交許可權給他人
 許可權型別
·會話許可權 
create session//建立會話,登陸,連線資料庫
alter session  //更改會話
·表許可權
create table//建立、更改和刪除表
·表空間許可權
create tablespace//建立表空間
alter tablespace//更改表空間
drop tablespace//刪除表空間
·物件許可權
Oracle資料庫的方案物件主要指:表、索引、檢視、
序列、同義詞、過程、函式、包、觸發器。
建立物件的使用者擁有該物件的所有許可權,不需要授予。
·系統許可權
Oracle資料庫的系統許可權首先授予sys,system。
使用grant語句可以授權給指定的使用者,角色等;
語法為:
grant ____ to _____ ;
例如:
grant create table to user1 with admin option;
·查詢系統許可權
select * from system_privilege_map;
·查詢當前會話可以使用的系統許可權
select * from session_privs;
select * from user_sys_privs;
·回收系統許可權
revoke ____ from ____;
例如:
revoke create table from user1;
·授予物件許可權
grant alter on tablename1 to user1;


10.SQL語言
·綜合統一
·高度非過程化
·面向集合的操作方式
·同一種語法結構提供兩種使用方式
·語言簡單、易學易用
 SQL的功能所使用的動詞(關鍵字)
 資料定義(DDL)create drop alter
 資料查詢(DQL)select
 資料操作(DML)insert update delete
 資料控制(DCL)commit rollback grant revoke(收回許可權)


11.示例資料庫
·預設使用者--scott
·預設密碼--tiger
·scott所屬4個表:dept、emp、bonus、salgrade


12.資料型別
 型別含義儲存描述
 CHAR固定長度字串最大長度2000bytes
 VARCHAR2可變長度的字串最大長度4000bytes
 DATE日期(日-月-年)DD--MM-YY(HH-MI-SS)
 NUMBER(P,S)數字型別P為整數位數,S為小數位數


13.鍵
·主鍵約束:一個表只能有一個主鍵約束。主鍵可以是單個欄位,
也可以是多個欄位,其所有欄位都是NOT NULL。
·Unique約束:一個表可以有多個Unique約束,unique的欄位可以為NULL。
·主鍵與Unique:不同點在於一個表只能有一個主鍵約束,但是可以有多個
Unique約束;主鍵所有欄位都是not null,unique可以是null共同點是都能保證唯一性
·主鍵、Unique與索引:主鍵約束與Unique約束預設會成為索引。
當主鍵和Unique有多個欄位時,有索引字首性問題,
即where語句匯中的條件必須有主鍵或者unique的第一個欄位,
否則不會使用索引
·外來鍵與主鍵、Unique:外來鍵必須為另外一張表(父表)的主鍵或唯一索引。
如果新增記錄,而父表中沒有則報錯。反之,如果要刪除父表中的記錄,
而子表中有記錄,也會報錯。但是如果在建立外來鍵約束時,
如果使用on delete cascade,則刪除父表中資料時,不報錯而直接把子表關聯的資料刪除。
如果要刪除父表,則需要加上cascade constraints,
此時子表的foreign key被去除,表中記錄保持不變。


14.查詢資料
·基本查詢:針對一個表的查詢,他是相對於多表查詢而言的。
SELECT [ALL|DISTINCT|DISTINCTROW] {*|table.*|[table.]field1[AS alias1]}
FROM tableexpression[,...][IN externaldatabase]
[WHERE...]
[GROUP BY...]
[HAVING...]
[ORDER BY...]
[WITH OWNERACCESS OPTION]
例如:
select * from dept;
select dname from dept;
select dname as new_name from dept;
select distinct dname from dept;
·萬用字元
% :表示任意個或多個字元,可匹配任意型別和長度的字元
_ :表示任意單個字元。匹配單個任意字元,
    它常用來限制表示式的字元長度語句(可以表示一箇中文字元)
. :匹配任何單個的字元。(單位元組字元)
* :匹配零個或多個在它前面的東西。
    例如,"x*"匹配任何數量的"x"字元,"[0-9]*"匹配任何數量的數字,
    而".*"匹配任何數量的任何東西。
^ :例子:select * from emp where regexp_like(ename,'^A') //查詢A開頭的 
$ :例子:select * from emp where regexp_like(ename,'A$') //查詢A結尾的
{n} :例子:select * from emp where regexp_like(ename,'A{3}$') //查詢AAA結尾的
例子:
--regexp_like  
--查詢value中以1開頭60結束的記錄並且長度是7位  
select * from fzq where value like '1____60';  
select * from fzq where regexp_like(value,'1....60');  
--查詢value中以1開頭60結束的記錄並且長度是7位並且全部是數字的記錄。  
--使用like就不是很好實現了。  
select * from fzq where regexp_like(value,'1[0-9]{4}60');  
-- 也可以這樣實現,使用字符集。  
select * from fzq where regexp_like(value,'1[[:digit:]]{4}60');  
-- 查詢value中不是純數字的記錄  
select * from fzq where not regexp_like(value,'^[[:digit:]]+$');  
-- 查詢value中不包含任何數字的記錄。  
select * from fzq where regexp_like(value,'^[^[:digit:]]+$');  
--查詢以12或者1b開頭的記錄.不區分大小寫。  
select * from fzq where regexp_like(value,'^1[2b]','i');  
--查詢以12或者1b開頭的記錄.區分大小寫。  
select * from fzq where regexp_like(value,'^1[2B]');  
-- 查詢資料中包含空白的記錄。  
select * from fzq where regexp_like(value,'[[:space:]]');  
--查詢所有包含小寫字母或者數字的記錄。  
select * from fzq where regexp_like(value,'^([a-z]+|[0-9]+)$');  
--查詢任何包含標點符號的記錄。  
select * from fzq where regexp_like(value,'[[:punct:]]');
·運算子
運算子含義
=等於
<>,!=不等於
>大於
>=大於等於
<小於
<=小於等於
BETWEEN...AND在兩值之間
IN在一組值得範圍內
LIKE與字串匹配
IS NULL為空值
·具體資料條數
MySQL中是limit關鍵字
MSSQL中的top關鍵字
Oracle中則是rownum
例子:
select * from emp where rownum<=5;
·表示式
可以在查詢的列中使用表示式來進行算數運算(+-*/)
連線字串(||)、使用系統函式等。
例子:
select empno,ename,sal+300 from where rownum<=5;

select ename || '是一位'||job as 工作,
to_char(hiredate,'YYYY_MM_DD') as 入職時間,
sal*12 as 年薪 from scott.emp;

select 姓名,avg(數學) as 數學平均分,avg(語文)  
as 語文平均分,avg(政治) as 政治平均分,
avg(數學)+avg(語文)+avg(政治) as 總分平均分 
from 表名;
·分組查詢
資料分組是通過在select語句中新增group by字句完成的。可使用分組函式
(又稱聚合函式)來對每個組中的資料進行彙總、統計。
可以使用having字句來篩選查詢的結果。
例如:
select deptno,avg(sal), max(sal) from emp group by deptno;




#############################練習#######################################
1、查詢姓名首字母為"A"或第二個字元為"A"的所有員工資訊
select * from emp where ename like 'A%' or ename like '_A%';
select * from emp where regexp_like(ename,'^A') or regexp_like(ename,'^.A');
select * from emp where substr(ename,1,1)='A' or substr(ename,2,1)='A';
注:substr(str1,pos,[len]) //可用於匹配字串


2、查詢部門20和30中的、崗位不是"CLERK"或"SALESMAN"的所有員工資訊
select * from emp where deptno in(20,30) and job not in('CLERK','SALESMAN');


3、查詢出工資在2500-3500之間,1981年入職的,沒有獎金的所有員工資訊
select * from emp where to_char(hiredate,'yyyy-mm-dd') like '1981%' 
and sal between 2500 and 3500 and comm is null;

select * from  
(select * from emp where sal between 2500 and 3500 and comm is null) 
where extract(year from hiredate) = 1981;
注:extract可用於提取date中的年月日資料


select * from emp where sal between 2500 and 3500 
and hiredate between to_date(19810101,'yyyymmdd')
and to_date(19811231,'yyyymmdd') and comm is null;


4、查詢比平均員工工資高的員工資訊。
select * from emp where sal > (select avg(sal) from emp);


5、查詢平均工資高於2000的部門資訊
select * from dept where deptno 
in(select deptno from emp group by deptno having avg(sal) > 2000);


6、查詢出WARD的工作所在地。
select LOC from dept where deptno 
=(select deptno from emp where ename = 'WARD');


select emp.name,dept.loc from dept,emp where dept.deptno=emp.deptno and emp.ename='WARD';


7、查詢出工資比ADAMS高的所有人姓名、部門、所在地
select emp.ename,dept.dname,dept.loc from dept,emp 
where dept.deptno = emp.deptno 
and emp.sal > (select sal from emp where ename = 'ADAMS');


8、查詢工資排名第7的員工資訊。
select *
  from emp
where sal = (select min(sal)
from (select * from emp order by sal desc)
       where rownum <= 7);


select *
  from (select * from emp order by sal desc)
where rownum <= 7
minus
select * from (select * from emp order by sal desc) where rownum <= 6;


select empno, ename, job, mgr, hiredate, sal, comm, deptno
  from (select row_number() over(order by emp.sal desc) as rn, emp.*
  from emp)
where rn = 7;