數據庫+SQL

數據庫基礎

數據抽象的過程

4種模型之間的關係

基本的邏輯模型類型

  • 層次模型:樹狀結構
  • 網狀模型:有向圖
  • 關係模型:二維表格表達實體集(ER模型就是一種關係模型)
  • 對象模型:面向對象編程(類和對象的概念)

常用詞語及其縮寫

數據操縱語言(Data Manipulation Language,DML)
數據庫(DataBase,DB)
數據庫系統(DataBase System,DBS)
數據庫管理系統(DataBase Management System,DBMS)
數據定義語言(Data Definition Language,DDL)
操作系統(Operation System,OS)

數據庫系統的組成

  1. 數據庫
  2. 硬件
  3. 軟件
  4. 數據庫管理員

數據庫系統層次

系統層次圖

ER圖(實體聯繫模型Entity Relationship Model)

3個基本成分:

  • 矩形:表示實體類型(即對象)
  • 菱形:表示聯繫類型(即實體間聯繫)
  • 橢圓形:表示實體類型和聯繫類型的屬性(即屬性)

3種聯繫的類型:

  • 1:1(一對一;外鍵放哪邊都行)
  • 1:N(一對多;外鍵放多的那邊)
  • M:N(多對多;單獨建表,新表的主鍵是有兩個表的主鍵組成的並集)

關係模型和關係運算理論

注意:關係=表
注意:模式=表的集合
在這裏插入圖片描述
鍵:用於唯一標識一行元組(記錄)的屬性(字段)。

鍵的分類:

  • 超鍵:用於唯一標識一行元組(記錄)的一個或多個屬性(字段)組成的集合。
  • 候選鍵:沒有冗餘屬性的超鍵。
  • 主鍵:被用戶從候選鍵中選出來作爲真正使用的鍵。
  • 外鍵:一個關係模式(表)A中的某個屬性同時是另外一個關係模式(表)B中的主鍵,則稱這個屬性爲關係模式(表)A的外鍵。

爲了直觀,用圖表示他們之間的關係
在這裏插入圖片描述

關係的定義和屬性

關係:一個屬性數目相同的元組組成的集合。

規範性限制:

  • 關係中的每一個屬性都是不可分解的,即表中無表,這也是“第一範式”。
  • 元組不重複
  • 無行序
  • 無列序

關係模型的3種完整性規則

  • 實體完整性規則(Entity Integrity Rule):主鍵不空
  • 參照完整性規則(Reference Integrity Rule):1.外鍵可與相應的主鍵不同名。2.外鍵可以用於建立一個表和自身的聯繫,即此時這個表的外鍵和主鍵是同一個屬性。3.外鍵是否可以爲NULL應當視具體情況而定。
  • 用戶定義的完整性規則

關係模型的3層體系結構

  • 關係模式:表,邏輯存儲結構,是存儲模式在邏輯層面的描述。
  • 子模式:用戶所使用的那部分數據及組成的表。(查詢結果視圖)
  • 存儲模式:數據以文件形式存儲在底層,存儲的實際模式就是存儲模式。

關係運算(重點!!!)

DML分爲:1.查詢語句:

  • 關係代數:查詢操作是以集合操作爲基礎的運算。

  • 關係演算:查詢操作是以謂詞演算爲基礎的運算。

  • 關係邏輯:查詢操作是以if-then邏輯操作爲基礎的運算。
    2.更新語句:

  • 插入

  • 修改

  • 刪除

關係代數的五個基本操作:

  • 並(Union):兩個表的屬性集合之間求並集,這裏指的是內部並,即兩個表的屬性完全一致。
    在這裏插入圖片描述
  • 差(Difference):兩個表的屬性集合之間求差集
    在這裏插入圖片描述
  • 笛卡爾積(Cartesian Product):兩個表的元組之間窮舉拼接,也叫叉乘
    在這裏插入圖片描述
  • 投影(Projection):豎切屬性集。表示如下
    在這裏插入圖片描述
  • 選擇(Selection):橫選部分行,也叫橫切。表示如下
    在這裏插入圖片描述
    關係代數的四個組合操作:

組合操作都可以通過有限個基本操作實現,即“基本操作的組合”。

  • 交(Intersection):兩個表的屬性集合之間求交集
    在這裏插入圖片描述

  • 連接(Join):叉乘+約束條件(比如要求某兩列屬性之間相等或滿足某種關係)
    在這裏插入圖片描述
    表示R與S連接,條件是R的第2列和S的第1列中值相等的那些元組(行,也叫記錄)進行連接。

  • 自然連接(Natural Join):叉乘+約束條件(相同的屬性集上的值相等的行才能拼接)+去掉重複屬性
    在這裏插入圖片描述

  • 除法(Division):表A除以表B(前提是表A中包含了表B的所有屬性),其實是,在表A中尋找某個對象滿足表B的所有行,把這些對象併成一張表就是除法的結果,這其中不用寫出表B的屬性。
    在這裏插入圖片描述
    圖和對應的關係代數語言

在這裏插入圖片描述
在這裏插入圖片描述
關係代數的七個擴充操作:

  • 改名
    在這裏插入圖片描述
    將表R中的列名依次改爲A1,A2,…

  • 廣義投影:允許在投影列表中使用算術函數來對投影進行擴展。
    在這裏插入圖片描述

  • 賦值
    在這裏插入圖片描述

  • 外連接:在自然連接的基礎上,將不滿足連接條件的行補上,缺失值的地方就寫null。
    在這裏插入圖片描述

  • 外部並:將兩個表的屬性求並集,公共屬性只取一次,不同屬性處的空值賦null。

  • 半連接:R和S進行自然連接,若是左辦連接,則結果爲R中滿足自然連接的元組構成的表;若爲右辦連接則結果爲S中滿足自然連接的元組構成的表。
    在這裏插入圖片描述

  • 聚集操作:輸入一組值,輸出一個值作爲結果的操作。例如,max,min,avg,sum,count等等。
    在這裏插入圖片描述

關係代數表達式的優化

優化原則:

  • 投影儘早進行
  • 先投影再選擇,選擇也要儘早進行。
  • 前兩個要求都要注意,保留後續操作還需要用到的屬性或元組。
  • 儘量減少操作中多個表的連接,因爲多表連接操作代價昂貴。

數據庫規範化設計

關係模式的非形式化設計準則

  • 一個表中儘量只包含跟這個表中每個元組所表示的對象有直接聯繫的屬性,儘量不包含間接聯繫的屬性。
  • 關係模式(庫)的設計應儘可能使得相應的關係(表)之間不發生增刪改查的異常,如有異常則應進行相應的說明,以確保數據庫操作的正確性。
  • 表中儘量避免經常爲null值的屬性出現。
  • 表和表之間的等值連接儘量在主鍵和外鍵上進行,且保證連接以後不會產生額外的元組(寄生元組)。

函數依賴(Function Dependency, FD)

函數依賴:一個表中的屬性a可以確定其他的某個或某些屬性,這種關係成爲函數依賴。(1對1或多對1;即不同的a的值可以對應同樣的某些屬性的值,但反過來不行。)

FD的邏輯蘊含:在一個關係模式P(庫)中,存在一個FD集合F,f是一個函數依賴,若對P中所有的關係(表),滿足F的表都滿足f,則稱F邏輯蘊含f。(即f屬於F,前提是隻需在當前這個庫P中屬於就行,相當於放寬了數學上的屬於條件)

FD的閉包:在一個關係模式P(庫)中,FD集合F的所有子集構成的集合稱爲F的閉包。記作
在這裏插入圖片描述
FD的推理規則:

  • 自反性
  • 增廣性
  • 傳遞性
  • 合併性
  • 分解性
  • 僞傳遞性
  • 複合性
  • 其他

平凡:當屬性集A確定,且a是A中的一個屬性,那麼a屬性也確定了,這是自然而然的,所以是平凡的函數依賴,即平凡的FD。否則就是非平凡的FD。

FD的最小依賴集G:

  • G中的每個FD的右邊都是單屬性(右單)
  • G中的每個FD的左邊都沒有冗餘屬性(左不冗餘)
  • G中沒有冗餘的FD(FD不冗餘)

關係模式的分解

模式分解的問題
  • 寄生元組:有泛關係,拆分導致重新合併時元組變多了。
  • 懸掛元組:無泛關係,合併導致元組變少。

在這裏插入圖片描述
在這裏插入圖片描述

無損分解(分解後再合併仍舊能恢復到和原來一樣,即不損失信息。)
保持函數依賴的有損分解(分解後再合併不能恢復到和原來一樣,即損失信息。)

關係模式的範式

  • 第一範式(1NF):表中無表
  • 第二範式(2NF):主鍵不冗餘(不存在局部依賴)
  • 第三範式(3NF):主鍵不能通過傳遞依賴確定自己當中的一部分。

傳遞依賴:如果X->Y且Y->A,同時,第一步不能反推,第二步不是平凡的,則稱A傳遞依賴於X。

事務

事務:一堆操作按照一定順序排列成的序列,這個序列作爲一個整體,其中的操作要麼都執行,要麼都不執行。
在這裏插入圖片描述
事務的調度方式

  • 串行:一個一個的按照順序執行,在cpu中同時只有一個事務在執行。
  • 並行:多個事務同時執行,在cpu中同時可以有多個事務在執行。
  • 併發:將多個事務拆分成一個一個的子任務,然後按照時間片,一個子任務一個子任務的執行,給用戶感覺好像多個事務是在同時執行一樣,而實際上,這就是子任務的串行。(所謂“假並行,真串行,就是併發。”)

事務的ACID性質:

  • 原子性:事務作爲一個整體,不可分割的執行單元。
  • 一致性:數據不會因事務的執行而遭到破壞。
  • 隔離性:多個事務併發執行的結果應與這些事務先後單獨執行(串行)的結果一樣。
  • 持久性:一個事務一旦完成執行,其結果應當永久的反映在數據庫中。

事務的狀態變遷圖
在這裏插入圖片描述

故障檢查(檢查點技術)

  • undo:事務未做完,出故障。(對應ROOLBACK語句)因爲故障可能就是由這樣的事務引起的,故undo。
  • redo:事務做完了,但是結果還在緩衝區,尚未完全寫入磁盤,出故障。因爲故障一般不會是這樣的事務引起的,故redo。

在這裏插入圖片描述

數據庫的併發控制

併發操作帶來的3個問題

  • 丟失更新:對同一個位置,一個事務的執行結果,被另一個事務的執行結果覆蓋。(多次寫入同一個位置)
  • 讀髒數據:一個事務讀取了另一個事務的錯誤結果。
  • 不可重複讀:一個事務讀取了另一個事務的中間結果。

封鎖技術

  • 排他型封鎖(X鎖):可讀可寫,只能同時由一個事務單獨調用。
  • 共享型封鎖(S鎖):只讀不寫,可以同時由多個事務一起調用。

死鎖問題

在這裏插入圖片描述

SQL入門

注意:1.SQL語句結尾又分號“;”。2.SQL語句中不區分大小寫。3.[]表示可選項,|表示或。

模式創建和撤銷(建庫和刪庫)

CREATE SCHEMA <模式名> AUTHORIZATION 用戶名;
例如
create schema ST_CO authorization lismith;

DROP SCHEMA <模式名> [CASCADE | RESTRICT]
CASCADE 強制全部刪除(級聯式)
RESTRICT 沒有被其他模式引用的部分則刪除,否則不執行(安全刪除)(約束式)
例如
drop schema ST_CO cascade;

基本數據類型

關鍵字 意義
INTEGER 長整數(也可寫成INT),長度爲4B
SMALLINT 短整數,長度爲2B
REAL 浮點數
DOUBLE PRECISION 雙精度浮點數
FLOAT(n) 浮點數,至少爲n位數字
NUMERIC(p,d) 定點數,由p位數字(不包括符號、小數點)組成,小數點後面有d位數字,也可寫成DECIMAL(p,d)或DEC(p,d)
CHAR(n) 長度爲n的定長字符串
VARCHAR(n) 最大長度爲n的變長字符串
BIT(n) 長度爲n的二進制串
BIT VARYING(n) 最大長度爲n的變長二進制串
DATE 日期,包含年、月、日,形爲YYYY-MM-DD
TIME 時間,包含一天的時、分、秒,形爲HH: MM: SS

定義新的數據類型

CREATE DOMAIN <新數據類型名> <基本數據類型>;
例如
create domain P char(8);

關係的基本操作(表的基本操作)

  • 創建
  • 修改
  • 撤銷

創建
CREATE TABLE <表名>
(<列名 類型>,
<列名 類型>,

<完整性約束>
);

例如
create table T
(T# char(4) not null,
tname char(8) not null,
title char(10),
C## char(6) not null,
primary key(T#),
foreign key(C##) reference C(C#)
);

修改

增加列
ALTER TABLE <表名> ADD <列名> <類型>;

刪除列
ALTER TABLE <表名> DROP <列名> <類型>;

修改列
ALTER TABLE <表名> MODIFY <列名> <類型>;

ALTER TABLE <表名> ALTER COLUME <列名> <類型>; (現在這種更常用)
撤銷
DROP TABLE <表名> [CASCADE | RESTRICT];

索引的基本操作

  • 創建
  • 撤銷

創建
CREATE [UNIQUE] INDEX <索引名> ON <表名> (<列名序列>)
例如
create unique index S#_INDEX on S(S#);

撤銷
DROP INDEX <索引名>
例如
drop index S#_INDEX;

數據的基本操作(增刪改查)

數據查詢
SELECT [ALL | DISTINCT] <投影屬性序列或表達式序列>
FROM <表序列或視圖序列>
[WHERE <行條件表達式>]
[GROUP BY <列名序列>
[HAVING <組條件表達式>]]
[ORDER BY <列名[ASC | DESC]>,…];

ALL表示select結果返回所有非空行(包含重複的行),DISTINCT表示select結果返回所有不重複的非空行。其中ALL是默認值,可不寫出。
ASC表示升序,DESC表示降序。

例如
select S#, C#, SCORE, SNAME, CNAME
from S,C,SC
where S.S#=SC.S# and C.C#=SC.C#
group by S#,C#
having SCORE>60
order by DESC;

from後面多個表之間用’,'表示笛卡爾積

數據增加(插入)
1.單元組插入(當插入的元組和全部列名一一對應,則可以省略寫出列名序列)
INSERT INTO <表名> [(列名序列)]
VALUES(<元組值>);
2.多元組插入
INSERT INTO <表名> [(列名序列)]
VALUES(<元組值>),(<元組值>),…;
3.查詢結果插入
INSERT INTO <表名> [(列名序列)]
<SELECT 查詢語句>;
4.表的插入
INSERT INTO <表名1> [(列名序列)]
TABLE <表名2>;

例如
insert into SC
values(‘S4’,‘C4’,85),
(‘S3’,‘C6’,90),
(‘S7’,‘C2’,70);

數據刪除
DELETE FROM <表名>
[WHERE <條件表達式>];

例如
delete from SC
where C# = ‘C4’ and
SCORE < (select avg(SCORE)
from SC
where C# = ‘C4’);

數據修改
UPDATE <表名>
SET <列名> = <值表達式> [,<列名> = <值表達式>…] | ROW = (<元組>)
[WHERE <條件表達式>];

例如
update SC
set SCORE = SCORE * 1.3
where C# = ‘C4’;

WHERE中可使用的運算符表

運算符類別 運算符
算數比較運算符 <, <=, >, >=, =, <> 或 !=
邏輯運算符 AND, OR, NOT
集合成員資格運算符 IN, NOT IN
謂詞 EXISTS(存在量詞), ALL, SOME, ANY, BETWEEN … AND …, UNIQUE, LIKE, IS
聚合函數 AVG(平均值), MIN(最小值), MAX(最大值), SUM(和), COUNT(計數)
算數比較運算符 <, <=, >, >=, =, <> 或 !=

注意:1.WHERE的條件部分也可以是內層查詢語句,即SELECT語句可嵌套。2.SELECT語句可以表達所有的關係代數表達式。3.SELECT語句的查詢結果之間還可以進行集合運算。

運算符類別 運算符
集合運算符 UNION(並), INTERSECT(交), EXCEPT(差)

嵌套查詢的例子

select S#, SNAME
from S
where ‘C2’ in (
select C#
from SC
where S# = S.S#
);

字符串匹配查詢

匹配表達式:

  • 百分號(%)表示與零個或多個字符組成的字符串匹配。
  • 下劃線(_)表示與單個字符串匹配。

例1
select SNAME
from S
where SNAME like ‘D%’;
查詢名字以字母D開頭的學生姓名。

例2 空字符串匹配用‘is’
select SNAME
from S
where AGE is null;

表的基本連接操作

連接類型 關鍵字
內連接 INNER JOIN
左外連接 LEFT OUTER JOIN
右外連接 RIGHT OUTER JOIN
完全外連接 FULL OUTER JOIN
連接條件(寫在連接類型的右邊) 關鍵字
自然連接 NATURAL
等值連接 ON
部分公共屬性連接 USING

例如
E1: R natural left outer join S;
E2: R left outer join S on R.B = S.B and R.C = S.C;
E3: R left outer join S using (B)

在這裏插入圖片描述

視圖

  • 創建
  • 撤銷
  • 更新

視圖創建
CREATE VIEW <視圖名> (<列名序列>)
AS <SELECT 查詢語句>;

例如
create view S_NAME
as select S#,SNAME,AGE
from S
where SEX = ‘M’;

視圖撤銷
DROP VIEW <視圖名>;

drop view S_NAME;

視圖更新
只有“行列子視圖”可以進行視圖更新操作。
行列子視圖:通過對一張表進行有限次的投影和選擇得到的包含了主鍵的視圖,稱爲行列子視圖。
對行列子視圖的更新會自動轉化爲對對應的表的更新。
但是,如果要允許用戶對一個視圖進行更新操作,必須在定義這個視圖時加上“WITH CHECK OPTION”語句,當然,這句話不寫的情況下默認就是寫了的,這相當於將檢查過程交給編譯器去做。

例如
create view S_NAME
as select S#,SNAME,AGE
from S
where SEX = ‘M’
[with check option];

insert into S_SNAME
values(‘S28’,‘WU’,18,‘M’);

這句插入語句會由系統自動轉換爲
insert into S
values(‘S28’,‘WU’,18,‘M’);

SQL進階

局部變量的定義和賦值

局部變量聲明
DECLARE{@ 變量名 數據類型 ....}
局部變量賦值SET 變量名=值或者用select語句進行賦值
SELECT @ 變量名 = expression [from ... where ...]

全局變量

@@ 變量名 數據類型

流程控制

使用BEGIN {...} END語句塊

條件語句

IF <條件表達式>
	{命令行|程序塊}
ELSE
	{命令行|程序塊}
或者
WHEN <條件表達式> THEN
	{命令行|程序塊}
ELSE
	{命令行|程序塊}

CASE語句(即SWITCH)

CASE <條件表達式>
	WHEN 布爾表達式 THEN {命令行|程序塊}
	...
END

循環語句

WHEN <條件表達式>
	{命令行|程序塊}
END

遊標

聲明遊標

DECLARE 遊標名 CURSOR
[LOCAL|GLOBAL]
[FORWARD_ONLY|SCROLL]
[STATIC|KEYSET|DYNAMIC|FAST_FORWARD]
[READ_ONLY|SCROLL_LOCKS|OPTIMISTIC]
[TYPE_WARNING]
FOR select語句
[FOR UPDATE[OF 列名[,...n]]]
關鍵字 含義
LOCAL 定義遊標的作用域僅限於批處理、存儲過程或觸發器中。當建立遊標在存儲過程執行結束後,遊標會被自動釋放。
GLOBAL $12
FORWARD_ONLY $1
SCROLL $1
STATIC $1
KEYSET $1
DYNAMIC $1
FAST_FORWARD $1
READ_ONLY $1
SCROLL_LOCKS $1
OPTIMISTIC $1
TYPE_WARNING $1

嵌入式SQL

動態SQL

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