數據庫課程設計
基於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