-----------------------------------------------------------------共複習使用,參考王珊薩師煊版-----------------------------------------------------------------------
一:基本知識
1,表的創建:
建立一個“學生選課”表SC,它由學號Sno、課程號Cno,修課成績Grade課程名Cname組成,其中(Sno, Cno)爲主碼。
- CREATE TABLE
- SC(
- SnoCHAR(7),
- CnoCHAR(4),
- Gradeint,
- CnameCHAR(10), NOT NULL UNIQUE
- Primarykey (Sno,Cno)
- Foreignkey (Sno) References student(Sno).
- Foreignkey (Cno) References Course (Cno)
- );
基本表的創建-說明
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,刪除基本表:
- DROP TABLE table_name
3,修改基本表——添加列:
- ALTER TABLE table_name
- ADD new_column_name datatype
- [constraints]
例:向Student表增加“入學時間”(SCome),數據類型爲日期型。
- ALTER TABLE student
- ADD Scome DATE
4,修改基本表——改變列的數據類型:
- ALTER TABLE table_name
- ALTER COLUMN column_name new_datatype
例:將年齡的數據類型改爲半字長整數。
- ALTER TABLE Student
- ALTER COLUMN Sage SMALLINT
5,修改基本表——刪除完整性約束
- ALTER TABLE table_name
- DROP constraint
例:刪除學生姓名必須取唯一值的約束。
- ALTER TABLE student
- DROP unique(sname)
6,建立索引:
- CREATE INDEX index_name ON table_name(column_name)
7,將某個字段設爲主鍵:
- ALTER TABLE table_name ADD PRIMARY KEY(column_name)
8,將某個字段的主鍵定義取消:
- 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.第三範式(確保每列都和主鍵列直接相關,而不是間接相關)
第三範式需要確保數據表中的每一列數據都和主鍵直接相關,而不能間接相關。
比如在設計一個訂單數據表的時候,可以將客戶編號作爲一個外鍵和訂單表建立相應的關係。而不可以在訂單表中添加關於客戶其它信息(比如姓名、所屬公司等)的字段。如下面這兩個表所示的設計就是一個滿足第三範式的數據庫表。
這樣在查詢訂單信息的時候,就可以使用客戶編號來引用客戶信息表中的記錄,也不必在訂單信息表中多次輸入客戶信息的內容,減小了數據冗餘。