《數據庫系統概念》第1-3章知識點總結
數據庫:由一個互相關聯的數據的集合和一組用以訪問這些數據的程序組成。
元組:指代行
屬性:指代列
在文件處理系統中存儲組織信息的主要弊端:
(1)數據的冗餘和不一致
(2)數據訪問困難
(3)數據孤立
(4)完整性問題
所以我們要有數據庫
數據結構的基礎是數據模型
數據模型是一個描述數據、數據聯繫、數據語義以及一致性約束的概念工具集合。主要模型有以下四種:
(1)關係模型,relational model
(2)實體-聯繫模型,entity-relationship model
(3)基於對象的數據模型,object-based data model
(4)單結構化數據模型,semistructured data model;例如可擴展標記語言(XML)被廣泛地用來表示半結構化數據
實體-聯繫模型
實體集:用矩形框表示,實體名在頭部,屬性名列在下面
聯繫集:用連接一對相關的實體集的菱形表示,聯繫名放在菱形內部
下面是一個例子:
row:行
column:列
record/taple:元組
attributes:屬性(就是每一列)
domain:域,For each attribute of a relation ,there is a set of permitted values ,called the domain of that attribute.
atomic:原子性,For all relations r ,the domains of all attributes of r be atomic.
null:空,The null value is a special value that signifies that the value is unknown or does not exist.
database schema:數據庫模式,is the logical design of the database.
database instance:數據庫示例,is a snapshot of the data in the database at a given instant in time.
superkey:超碼,is a set of one or more attributes that ,taken collectively ,allow us to identify uniquely a tuple in the relation.
candidate keys:候選碼,the minimal superkeys are called candidate keys.
primary key:主碼,one of the candidate keys is selected to be the primary key
foreign key:外碼,a relation ,say r1 ,may include among its attributes the primary key of another relation ,say r2 .This attribute is called a foreign key form r1 ,referencing r2 .
referencing relation:外碼依賴的參照關係,the relation r1 is called the referencing relation of the foreign key dependency
referenced relation:外碼的被參照關係,r2 is called the referenced relation of the foreign key
超碼:一個或多個屬性的集合,這些屬性的組合可以使我們在一個關係中唯一地表示一個元 組
候選碼:最小超碼。因爲超碼中可能包含無關緊要的屬性,候選碼中不存在無關緊要的屬性。
主碼:用來在一個關係中區分不同元組的候選碼,應該選擇那些值從不或極少變化的屬性。 主碼屬性一般列在其他屬性前面,且有下劃線
外碼:一個關係模式(如r1)可能在它的屬性中包括另一個關係模式(如r2)的主碼。這 個屬性在r1上稱作參照r2的外碼。關係r1也稱爲外碼依賴的參照關係,r2叫做外碼 的被參照關係。
數據庫中的常用的關係代數
初級SQL
The SQL language has several parts:
(1)Data_definition language(DDL,數據定義語言)
①defining relation schemas(定義關係模式)
②deleting relations(刪除關係)
③modifying relation schemas(修改關係模式)
(2)Data_manipulation language(DML,數據操縱語言)
①query information from the database(查詢信息)
②insert tuples into(插入元組)
③delete tuples from(刪除元組)
④modify tuples(修改元組)(3)Integrity(完整性)
(4)View definition(視圖定義)
(5)Transaction control(事務控制)
(6)Embedded SQL and dynamic SQL(嵌入式SQL和動態SQL)
(7)Authorization(授權)
SQL的基本類型:
(1)char(n):固定長度的字符串,全稱character,輸入字符數不足n時,追加空格
(2)varchar(n):可變長度的字符串,全稱character varying
(3)int:整數類型,全稱integer
(4)smallint:小整數類型
(5)numeric(p,d):定點數,這個數有p位數字,其中d位數字在小數點右邊。
(6)real,double precision:浮點數與雙精度浮點數
(7)float(n):精度至少爲n位的浮點數
以下是幾個後面會用到的表
創建、定義關係
通用形式是:
create table r
(A1 D1,
A2 D2,
...,
An Dn,
<integrity-constraint1>,
...,
<integrity-constraintk>);
r is the name of the relation
each Ai is the name of an attribute in the schema of relation r
each Di is the domain of attribute Ai
下面是一個具體的例子
primary key(A1,A2....):聲明屬性A1,A2....爲關係的主碼
foreign key(A1,A2....) references:聲明表示關係中任意元組在屬性(A1,A2....)上的取 值必須對應於關係s中某元組在主碼屬性上的取值
not null:不允許空值
單關係查詢
(1)
(2)刪除重複:distinct
(3)不去除重複:all,不過一般這是默認的,不需要寫出來
where:用於選出那些在from子句的結果關係中滿足特定謂詞的元組
where中可以使用邏輯連詞and or not。
多關係查詢
自然連接
運算作用於兩個關係,併產生一個關係作爲結果。只考慮那些在兩個關係模式中都出現的屬性上取值相同的元組對
from子句中的“instructor natural join teaches”表達式可以替換成執行該自然連接後所得到的關係
====
連接
join...using(A1,A2) 在t1.A1=t2.A1且t1.A2=t2.A2成立的前提下,來自r1的元組t1和來自r2的元組t2就能匹配
更名運算
old-name as new-name as子句既可出現在select子句中,也可以出現在from子句中
此處重新命名的標識符被稱作相關名稱、表別名、相關變量、元組變量
字符串運算
用like操作符來實現模式匹配,以下是兩個特殊的字符
百分號(%):匹配任意子串
下劃線(_):匹配任意一個字符
轉義字符:用escape來定義,放在特殊字符前面使特殊字符得以顯示
例:like ‘ab \% cd %’ escape‘\’ 匹配所有以ab % cd開頭的字符串
select子句中的屬性說明
星號‘*’可以用在select子句中表示“所有的屬性”
元組的排序
order by xxx 表示按照xxx排序
desc表示降序
asc表示升序,沒有說則默認爲升序
where子句謂詞
用between來表示一個區間,也可用not between
where子句謂詞2
可以用記號(V1,V2,...,Vn)來表示一個分量值分別爲V1,V2,...,Vn的n維元組
以下2段相等:
集合運算:並運算(union)、交運算(intersect)、差運算(except)
並運算
union運算自動去除重複,如果想保留所有重複,則用union all
交運算
intersect運算自動去除重複,如果想保留所有重複,則用intersect all
差運算
except運算自動去除重複,如果想保留所有重複,則用except all
空值null
算術運算:如果算術表達式的任一輸入爲空,則該算術表達式(+ - * /)結果爲空。
比較運算:涉及空值的任何比較運算的結果視爲unknown。unknown是除true和false之外的第三個邏輯值
集合運算:
and:true and unknown = unknown
false and unknown = false
unknown and unknown = unknown
or:true or unknown = true
false or unknown = unknown
unknown or unknown = unknown
not:not unknown = unknown
如果where子句謂詞對一個元組計算出false和unknown,那麼該元組不能被加入到結果中。
聚集函數
聚集函數是以值的一個集合(集或多重集)爲輸入,返回單個值的函數。
平均值:avg
最小值:min
最大值:max
總和:sum
計數:count
sum和avg的輸入必須是數字集
基本聚集
找出Computer Science系教師的平均工資
找出在2010年春季學期講授一門課程的教師總數(去除了重複)
找出course關係中的元組數
分組聚集
group by子句中的所有屬性上取值相同的元組被分在一個組中
注意:任何沒有出現在group by子句中的屬性如果出現在select子句中的話,它只能出現在聚集函數的內部,否則錯誤。例如,下述查詢是錯誤的,因爲ID沒有出現在group by子句中,但它出現在了select子句中,而且沒有被聚集
having子句
having子句中的謂詞在形成分組後才起作用,也就是針對group by子句構成的分組
找出教室平均工資超過42000美元的系
注意:任何出現在having子句中,但沒有被聚集的屬性必須出現在group by子句中,否則錯誤。
SQL語句的執行順序
from語句——where語句——group by語句——having語句——select語句
對空值和布爾值的聚集
除了count(*)外所有聚集函數都忽略輸入集合中的空集,空集的count運算值爲0。
嵌套子查詢
集合成員資格
連接詞in測試元組是否是集合中的成員
找出在2009年秋季和2010年春季學期同時開課的所有課程
括號中爲子查詢
集合的比較
some(至少):至少比某一個大—— >some
<some <=some >=some >some =some <>some
=some 等價於in
≠some 不等價於not in
找出滿足下面條件的所有教師的姓名,她們的工資至少比Biology系某一個教師的工資要高
all(所有):比所有的都大—— >all
<all <=all >=all >all =all <>all
=all 不等價於in
≠all 等價於not in
找出滿足下面條件的所有教師的姓名,她們的工資比Biology系每個教師的工資都高
空關係測試
exists結構可測試一個子查詢的結果中是否存在元組,非空時返回true值。
not exists結構測試子查詢結果中集中是否不存在元組
可以使用not exists結構模擬集合的【包含】操作:我們可以將“關係A包含關係B”寫成not exists(B except A)
請看下面例子:
找出選修了Biology系開設的所有課程的學生
重複元組存在性測試
unique結構,測試在一個子查詢的結果中是否存在重複元組,如果作爲參數的子查詢結果中沒有重複的元組,則返回true值
找出所有在2009年最多開設一次的課程
lateral關鍵詞
在from子句嵌套的子查詢中並不能使用來自from子句其他關係的相關變量,而from子句其他關係的相關變量可以使用嵌套的子查詢中的變量。
在from子句中的子查詢添加關鍵詞lateral作爲前綴,就可以訪問from子句中在它前面的表或子查詢中的屬性,例如
打印每位教師的姓名,以及他們的工資和所在系的平均工資
with子句
with子句提供定義臨時關係的方法,這個定義只對包含with子句的查詢有效
找出具有最大預算值的系
with子句定義了臨時關係max_budget,此關係在隨後的查詢馬上被使用了
數據庫的修改
刪除:只能刪除整個元組,而不能只刪除某些屬性上的值
插入:待插入元組的屬性值必須在相應屬性的域中,並且分量數必須是正確的,且元組屬性值的排列順序和關係模式中屬性排列的順序一致。
更新:在不改變整個元組的情況下改變其部分屬性的值
case結構
注:圖片均來自《數據庫系統概念》第6版——機械工業出版社