Oracle數據庫學習筆記

數據庫課程設計

基於Oracle

第一階段——需求分析

自上而下結構分析SA

數據流圖

基本符號:

  • 箭頭: 數據的流動
  • 圓或圓角矩形: 數據加工
  • 矩形: 實體
  • 側邊開口矩形: 存儲

繪製步驟:

  • 畫頂層數據流圖
  • 畫系統內部,即下層數據流圖,分解可分解的結構,進行編號
  • 分解至不能再分解,得到最終的細化

注意:

  • 細化前後每部分的輸入輸出要一致,父子守恆
  • 數據流是依賴數據加工存在的,因此,存儲與存儲,實體與實體,實體與儲存之間不存在直接的數據關聯

數據字典

數據字典是數據的最小組成單位
包括: 數據項,數據結構,數據流,數據存儲,處理過程等

第二階段——概念結構設計

將需求分析得到的用戶需求抽象爲信息結構即概念模型的過程
常見四類方法:

  • 自頂向下
  • 自底向上 √本階段常用方法
  • 逐步擴張
  • 混合策略

E——R圖

描述實體與關係模型,包含元素:

  • 菱形: 實體之間的連接關係
  • 矩形: 實體
  • 橢圓: 依賴實體的屬性

其中屬性有一些特殊用法,比如

  • 主屬性:下劃線
  • 派生屬性: 計算所得,建表時不用,用虛線表示,
  • 可選屬性: 括號
  • 多值屬性: 同心圓

數據冗餘與視圖

爲提高效率,允許保留部分冗餘,但是要定義在視圖中

第三階段——邏輯結構設計

將概念結構轉換爲轉化爲DBMS

第四階段——物理結構設計

第五階段——實施

第六階段——運行維護

Oracle數據庫

數據庫與實例: 一個數據庫可以建立多個實例(SID),一個實例可以在任何時候訪問數據庫

SQL

DDL

基本數據庫對象: 表,視圖,約束
創建:

create table 表名稱(

字段1 數據類型 【default 默認值】,

字段2 數據類型  【default  默認值】

.......

字段3 數據類型  【default 默認值】

主鍵外鍵相關約束
);

主鍵、外鍵、唯一、檢查這四項,既可以創建列約束,也可以創建表約束。而缺省 和 非空只能創建列約束。

主鍵約束和唯一性約束的一個重要區別就是主鍵約束不能爲空,而唯一性約束可以

刪除:

drop table mytable;

更改:

1、增加列
  alter table SMS_LOG ADD SEND_ID NUMBER;
2、刪除列
  ALTER TABLE users DROP COLUMN address;
3、修改字段類型
  alter table GROUP modify CREATOR_NO varchar2(50);

DML

增刪改查,其中查可以單獨歸類爲DQL
增:

insert into a (id) values(4);        //表a後有選擇字段,未選定的字段如果指定了default,則以default的值代替null

刪:

delete from mytable where 1 = 1 ;

UPDATE 表名 SET 字段='XXX' WHERE 條件;


解析順序

from->where->group by->having->select->order by

  • 聚合函數

  • 笛卡爾乘積

可以用逗號,也可以用CROSS join

  • 等值連接
    使用等號作爲連接條件
  • 非等值連接
    使用where配合邏輯條件
  • 外連接

除了正常的left/right join,Oracle外連接還有一種獨有的實現語法


select ename dno
from employee , my
where employee.empmp = my.empmp(+)  --帶+的是副表,不帶加號的是主表,主表全部顯示,

Oracle支持全外連接 關鍵字是full join

  • 自然連接

省略連接條件,根據相同列屬性(同名同類型)自動進行同類型連接

nature join

注意自然連接的公共屬性輸出不允許限定表的歸屬

比如對於emp,dept兩個表都有的公共屬性deptno,正常等值連接輸出時需要限定emp.deptno 否則會混淆屬性 ,
但是自然連接不允許加上表的歸屬,直接select deptno

  • using子句

代替屬性相等的條件聲明,要求查詢必須是等值連接,且等連接中的列必須是同名,
form emp join dept
using(deptno)

  • 先過濾數據再連接,提高效率

  • 子查詢

不相關子查詢不依賴父查詢數據,子查詢語句可以單獨運行

相關子查詢依賴父查詢數據,子查詢語句不能單獨運行,通常通過父表重命名在子查詢裏進行調用

查詢每個部門低於平均工資的員工

select *
from emp e
where e.sal < (select avg(sal) from emp where deptno=e.deptno)



select *
from emp e
where exist (select count(*)
                from emp
                where emp.deptno=e.deptno
                having count(*)>3)

集合查詢

  • union: 只有相同類型的數據才能合併
  • intersect : 交集
  • minus : 差集,去重

瑣碎關鍵字

  • dual

一個單行單列的表,充當一個佔位表,使輸出的有意義,保持輸出結構平衡

  • sysdate : 獲取系統時間

表間數據轉換

insert into table1 select * from table2;
//如table1的字段爲 id,name,value,而table2的字段爲id,name
insert into table1 select id,name,null from table2;
//如table1的字段爲 id,name,而table2的字段爲id,name,value
insert into table1 select id,name from table2;

合併 merge : 備份,merge into後面是備份到的表,using後面是被備份的表

單行函數,多行函數

顧名思義,單行函數就是一行調用的函數,比如數字函數
多行函數就是多行語句,比如聚集函數

數字函數

  • 四捨五入: round(原數,保留位數) from dual;
  • 首字母大寫: initcap
    保留位數爲0就是保留整數,負數就是往整數部分保留(保留十位,百位等);
  • 截斷: truck()只取到小數點後一位,只舍不入
  • 取模:mod()
  • 大小寫轉換:upper()大寫,lower()小寫
  • 獲取長度:length
  • 去掉空白:ltrim,rtrim,trim
  • 截取字符串: substr(str,begin,length):begin爲負數時,從後面數begin位,然後向後截取length,begin可省
  • 查找子串: instr(父串,子串,開始查找位置,第幾次出現的位置),最後兩個參數可以省略
  • 字符串填充: LPAD(原字符串,預達到長度,填充字符),RPAD,L是左填充,R是右填充

日期處理

  • last_day() : 參數月份當月的最後一天
  • add_mouth():
  • next_day():
  • mouth_between()

類型轉換函數

  • to_char(): 數字轉字符
  • to_number(): 字符轉數字
  • to_date()/to_char();字符和日期

to_date(“2015-2月-12”,“YYYY-MM‘月’-DD”)

  • 顯示轉換與隱式轉換
  • 錢的格式,to_char(sal,“L999,999.99”);

L是本地金錢單位,¥或者$,後面數字是格式

  • decode情景查詢,等值比較;case情景查詢可以是區間段比較

decode(表達式 條件1,結果1,條件2,結果2,…缺省值)
case 表達式 when 條件 then 結果…end : 只能是等值比較,如果區間段的話,select後面不加變量,變量在條件語句中體現

nvl(col,“xxx”)

nvl2(col,“aaa”,“bbb”)

nvl如果是col列非空就顯示值,如果是空值就輸出指定的xxx,nvl2如果非空就輸出aaa,空值就輸出bbb

  • 修改數據庫系統時間 alter system;修改本數據實例時間alter session;

層次查詢

start with子句 : 起始位置

connect by prior子句 : 父子結點關係

select ename,empno,mgr,level
from emp
start with ename='KING'
connect with prior empno=mgr

從KING這個人開始找,找出empno等於前一個mgr的,level是對應層次

start with可以省略 ;如果省略的話,將每一條數據作爲根節點查一遍;prior代表方向,上一級;
語句的邏輯是prior empno=mgr : 上一級的empno等於mgr;
所以empno = prior mgr : 意思就是本次查詢的empno等於下次查詢的mgr

  • 翻譯函數 translate
select translate('abcdggggggg','acd','123') from dual
//將字符串中的acd對!應!替換成123,因爲acd不是子串,是不連續的,所以這是和replace的區別
//對於後兩個參數長度不匹配時從前往後一一對應,

分析查詢

  • 開窗函數 over()

用於分組之後,顯示統計的結果是由哪些部分合成
括號裏可以是order by或者partition by

select sum(sal),deptno  --empno,sal無法顯示
from emp
group by deptno

select sum(sal) over(partition by deptno) ,empno,sal
from emp
group by deptno


select sum(sal)over(partition by deptno order by sal)empno,sal
from emp
group by deptno
//顯示的的逐漸遞增的過程,sumsal是逐漸累加的
  • rank()等級,有並列的會加上 1,2,2,4
  • dense_rank(): 連續等級,有並列的不會加,1,2,2,3
  • first_value/last_value(): 顯示查詢出來的第一條數據的某個參數,附加到每一條查詢數據中
  • row_number:

數據類型

  • number: 不指定是32位,number(a,b):a代表全部位數,b代表小數位數,小數位數若爲負數,就是小數點向左數的對應位數置零
  • Interger(n):n位整數
  • varchar,varchar2:varchar固定長度,不夠空格填充,varchar2不填充
  • char:固定長度字符
  • date,time:日期類型
  • nchar:限定字符集

序列


create sequence name
    start with 1 //從1開始
    increment by 1      //每次增長1
    maxvalue 1000       // 最大值增長到多少
    minvalue 1          //最小值
    cache ()            //是否緩存


select name.nextvalue from dual
select name.currentvalue from dual

truncate table name //截斷表,清空數據,不可回滾

視圖

爲了安全,不對外公開內容,選擇部分數據對外可見,隱藏數據的複雜性

關係視圖

關係視圖是一張虛擬的表,增刪改查操作與表類似

create [or replace] [force] view 名字(列);
as
select 子句
with check option

or replace表示替換已存在的同名

force表示即是原表不存在也強制創建

with check option是對視圖的DML限制

關係型視圖的增刪改查都是基於原表,即添加信息也是向表中添加

create or replace view my_view
as
select *
from dept
where deptno > 10
with check option

with check option 對於update要保證之前能查到的條目更新之後一樣能查到
對於delete無影響
對於insert插入的數據必須能查到
with字句與where是成對出現的,沒有where的with無意義

對象視圖

  • Oracle中的對象
create or replace my_name as object(
列屬性,和建表相同
);

內前視圖

前三種視圖都是對基礎表的增刪改查
但是下一種是佔用空間的

物化視圖

不適合頻繁更改的操作
create materialized

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章