數據庫基礎---數據庫系統概論個人總結版

-----------------------------------------------------------------共複習使用,參考王珊薩師煊版-----------------------------------------------------------------------

一:基本知識

1,表的創建:

建立一個“學生選課”表SC,它由學號Sno、課程號Cno,修課成績Grade課程名Cname組成,其中(Sno, Cno)爲主碼。

  1. CREATE TABLE  
  2. SC(  
  3.          SnoCHAR(7),  
  4.          CnoCHAR(4),  
  5.          Gradeint,  
  6.          CnameCHAR(10), NOT NULL UNIQUE  
  7.          Primarykey (Sno,Cno)  
  8.          Foreignkey (Sno) References student(Sno).  
  9.          Foreignkey (Cno) References Course (Cno)  
  10. );  

基本表的創建-說明

1、建表的同時可以定義與該表有關的完整性約束,這些約束條件被存入系統的數據字典中,當用戶操作表時,DBMS會自動檢查該操作是否有違背完整約束條件.

2、建立約束的考慮:如果完整性約束條件涉及到該表的多個屬性列,則必須定義在表級上;否則既可以定義在列級上也可以定義在表級上。

3、表名、列名是不區分大小寫的。

4、對一個用戶而言,表名必須唯一;一個表中,列名必須唯一。

5、表名、列名必須以字母開頭,長度不超過30個字符。

常用完整性約束

1、主碼約束:    PRIMARY KEY

2、唯一性約束:UNIQUE

3、非空值約束:NOTNULL

4、參照完整性約束:FOREIGNKEY

常用數據類型:(不同DBMS數據類型不完全相同)

T-SQL數據類型:(SQL 程式設計語言的增強版,它是用來讓應用程式與SQL Server 溝通的主要語言。T-SQL提供標準 SQL的DDL 和 DML 功能,加上延伸的函數、系統預存程序以及程式設計結構(例如 IF 和 WHILE)讓程式設計更有彈性。)

2,刪除基本表:

  1. DROP TABLE table_name  

3,修改基本表——添加列:

  1. ALTER TABLE table_name  
  2. ADD new_column_name datatype  
  3. [constraints]  

例:向Student表增加“入學時間”(SCome),數據類型爲日期型。

  1. ALTER TABLE student  
  2. ADD Scome DATE  

4,修改基本表——改變列的數據類型:

  1. ALTER TABLE table_name  
  2. ALTER COLUMN column_name new_datatype  

例:將年齡的數據類型改爲半字長整數。

  1. ALTER TABLE Student  
  2. ALTER COLUMN Sage SMALLINT  

5,修改基本表——刪除完整性約束

  1. ALTER TABLE table_name  
  2. DROP constraint  

例:刪除學生姓名必須取唯一值的約束。

  1. ALTER TABLE student  
  2. DROP unique(sname)  

6,建立索引:

  1. CREATE INDEX index_name ON table_name(column_name)  

7,將某個字段設爲主鍵:

  1. ALTER TABLE table_name ADD PRIMARY KEY(column_name)  

8,將某個字段的主鍵定義取消:

  1. ALTER TABLE table_name DROP PRIMARY KEY(column_name)  

約束是爲了數據的完整性而存在的,而數據的完整性是指數據的可靠性和準確性。

根據數據完整性大致可以分爲四種:

1.實體完整性

就是說每個表代表一個實體,每個表與他所代表的實體一致,特定表的唯一實體。

    實現實體完整性的的方法:索引(index),唯一約束(unique),主鍵約束(primarykey),標識列屬性

2.域完整性

給每個列定義輸入的有效性

實現域完整性的的方法: 限制數據類型,格式,外鍵約束(foreign key references),檢查約束(check(  between  and )),默認值定義(default ' '),非空(not null)約束。

3.引用完整性 

在輸入或刪除記錄時,表與表之間已定義的關係

實現域完整性的的方法: 通過外鍵與主鍵的關係,外鍵與唯一鍵之間的關係,外鍵與檢查約束

4.用戶自定義完整性

所有的完整性都支持用戶自定義完整性

注意:

1.在SQL中有個自動增長的自動編號列identity

2. mySQL不支持檢查約束

3.索引就像字典的目錄,把索引加在頻繁的以某個字符段查詢的的上面,在表上創建索引雖然會提高select語句的速度,但也會降低delete,update,insert語句執行的速度,如果一個表中太多的索引會降低數據庫的整體性能

4.primary key = unique+not null(加primary key 要比加unique和not null效率膏,因爲加primarykey時會自動加索引,加快了效率)

5.在SQL server中正在實用的數據庫不能被刪除(除非切換數據庫才能被刪除),mySQl中可以刪除正在實用的數據庫



SELECT Sno AS NO1234,Sname FROM student;
SELECT * FROM student;
SELECT Sname,'Age',2015-Sage FROM student;
SELECT DISTINCT Sno FROM SC; 
SELECT Sno,Sname FROM student WHERE Sno = '200215121'; 
SELECT * FROM student WHERE Sage<20; 
SELECT * FROM student WHERE Sage BETWEEN 20 AND 23; 
SELECT * FROM student WHERE Sage NOT BETWEEN 20 AND 23;
SELECT * FROM student WHERE Sdept IN ('CS');
SELECT * FROM student WHERE Sno LIKE '20021512_';
SELECT * FROM student WHERE Sno LIKE '20021512%';
SELECT * FROM student WHERE Sname NOT LIKE '李%'; 
SELECT * FROM student WHERE Sname NOT LIKE '李%' AND Sage = 19; 
SELECT * FROM student ORDER BY Sage ASC,Sno DESC;
SELECT * FROM student ORDER BY Sage DESC;
SELECT COUNT(*) FROM student;
SELECT COUNT(DISTINCT Sage) FROM student;
SELECT AVG(Grade) FROM SC WHERE Cno='1';
SELECT Cno,COUNT(Sno) FROM SC GROUP BY Cno; 
SELECT student.*,SC.* FROM student,SC WHERE student.Sno=SC.Sno;

INSERT INTO SC (Sno,Cno,Grade)VALUES('200215130','5','86');

UPDATE student SET Sage = '22' WHERE Sno = '200215121';

DELETE FROM SC WHERE  Sno = '200215130';

DELETE FROM SC;
 


二:範式

http://blog.csdn.net/m13666368773/article/details/8102074

其實就是設計數據庫的基本規則。

第一範式

存在非主屬性對碼的部分依賴關係 R(A,B,C) AB是碼 C是非主屬性 B-->C B決定C C部分依賴於B

第一範式

定義:如果關係R 中所有屬性的值域都是單純域,那麼關係模式R是第一範式的

那麼符合第一模式的特點就有

1)有主關鍵字

2)主鍵不能爲空,

3)主鍵不能重複,

4)字段不可以再分

例如:

 StudyNo   |   Name   |   Sex   |   Contact

20040901      john         Male      Email:[email protected],phone:222456

20040901      mary         famale    email:[email protected] phone:123455

以上的表就不符合,第一範式:主鍵重複(實際中數據庫不允許重複的),而且Contact字段可以再分

所以變更爲正確的是

 StudyNo   |   Name   |   Sex   |      Email         |      Phone

20040901      john         Male       [email protected]       222456

20040902     mary          famale      [email protected]      123455

 

第二範式

存在非主屬性對碼的傳遞性依賴 R(A,B,C) A是碼 A -->B ,B-->C

定義:如果關係模式R是第一範式的,而且關係中每一個非主屬性不部分依賴於主鍵,稱R是第二範式的。

所以第二範式的主要任務就是

滿足第一範式的前提下,消除部分函數依賴。

StudyNo   |   Name   |   Sex   |         Email         |      Phone    |   ClassNo  | ClassAddress

01                  john        Male       [email protected]     222456      200401            A樓2

01                   mary       famale    [email protected]       123455      200402            A樓3

這個表完全滿足於第一範式,

主鍵由StudyNo和ClassNo組成,這樣才能定位到指定行

但是,ClassAddress部分依賴於關鍵字(ClassNo-〉ClassAddress),

所以要變爲兩個表

表一

StudyNo   |   Name   |   Sex   |      Email         |      Phone |   ClassNo

      01            john         Male       [email protected]  222456   200401     

      01           mary         famale    [email protected]    123455      200402    

表二

 ClassNo  | ClassAddress

 200401      A樓2

 200402      A樓3


第三範式

不存在非主屬性對碼的傳遞性依賴以及部分性依賴 ,
StudyNo   |   Name   |   Sex   |      Email         |      bounsLevel   |   bouns

20040901      john         Male       [email protected]   優秀                    $1000

20040902     mary         famale    [email protected]       良                         $600

這個完全滿足了第二範式,但是bounsLevel和bouns存在傳遞依賴

更改爲:

StudyNo   |   Name   |   Sex   |      Email         |      bouunsNo

20040901      john         Male       [email protected]   1

20040902     mary         famale    [email protected]       2

bounsNo   |   bounsLevel   |   bouns

1                   優秀                $1000

 2                 良                   $600

這裏我比較喜歡用bounsNo作爲主鍵,

基於兩個原因

1)不要用字符作爲主鍵。可能有人說:如果我的等級一開始就用數值就代替呢?

2)但是如果等級名稱更改了,不叫 1,2 ,3或優、良,這樣就可以方便更改,所以我一般優先使用與業務無關的字段作爲關鍵字。

 

一般滿足前三個範式就可以避免數據冗餘。


三:數據庫設計三大範式(轉載)

爲了建立冗餘較小、結構合理的數據庫,設計數據庫時必須遵循一定的規則。在關係型數據庫中這種規則就稱爲範式。範式是符合某一種設計要求的總結。要想設計一個結構合理的關係型數據庫,必須滿足一定的範式。

                 

在實際開發中最爲常見的設計範式有三個:

1.第一範式(確保每列保持原子性)

第一範式是最基本的範式。如果數據庫表中的所有字段值都是不可分解的原子值,就說明該數據庫表滿足了第一範式。

第一範式的合理遵循需要根據系統的實際需求來定。比如某些數據庫系統中需要用到“地址”這個屬性,本來直接將“地址”屬性設計成一個數據庫表的字段就行。但是如果系統經常會訪問“地址”屬性中的“城市”部分,那麼就非要將“地址”這個屬性重新拆分爲省份、城市、詳細地址等多個部分進行存儲,這樣在對地址中某一部分操作的時候將非常方便。這樣設計纔算滿足了數據庫的第一範式,如下表所示。

上表所示的用戶信息遵循了第一範式的要求,這樣在對用戶使用城市進行分類的時候就非常方便,也提高了數據庫的性能。

                

2.第二範式(確保表中的每列都和主鍵相關)

第二範式在第一範式的基礎之上更進一層。第二範式需要確保數據庫表中的每一列都和主鍵相關,而不能只與主鍵的某一部分相關(主要針對聯合主鍵而言)。也就是說在一個數據庫表中,一個表中只能保存一種數據,不可以把多種數據保存在同一張數據庫表中。

比如要設計一個訂單信息表,因爲訂單中可能會有多種商品,所以要將訂單編號和商品編號作爲數據庫表的聯合主鍵,如下表所示。

 訂單信息表

這樣就產生一個問題:這個表中是以訂單編號和商品編號作爲聯合主鍵。這樣在該表中商品名稱、單位、商品價格等信息不與該表的主鍵相關,而僅僅是與商品編號相關。所以在這裏違反了第二範式的設計原則。

而如果把這個訂單信息表進行拆分,把商品信息分離到另一個表中,把訂單項目表也分離到另一個表中,就非常完美了。如下所示。

這樣設計,在很大程度上減小了數據庫的冗餘。如果要獲取訂單的商品信息,使用商品編號到商品信息表中查詢即可。

                 

3.第三範式(確保每列都和主鍵列直接相關,而不是間接相關)

第三範式需要確保數據表中的每一列數據都和主鍵直接相關,而不能間接相關

比如在設計一個訂單數據表的時候,可以將客戶編號作爲一個外鍵和訂單表建立相應的關係。而不可以在訂單表中添加關於客戶其它信息(比如姓名、所屬公司等)的字段。如下面這兩個表所示的設計就是一個滿足第三範式的數據庫表。

這樣在查詢訂單信息的時候,就可以使用客戶編號來引用客戶信息表中的記錄,也不必在訂單信息表中多次輸入客戶信息的內容,減小了數據冗餘。






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