數(shù)據(jù)庫SQL語言_第1頁
數(shù)據(jù)庫SQL語言_第2頁
數(shù)據(jù)庫SQL語言_第3頁
數(shù)據(jù)庫SQL語言_第4頁
數(shù)據(jù)庫SQL語言_第5頁
已閱讀5頁,還剩7頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、1、 技術標簽:(數(shù)據(jù)庫 使用實例)2、 技術細節(jié):(數(shù)據(jù)庫 的具體使用環(huán)境 MSSQL、mySQL、Oracle)1、數(shù)據(jù)庫簡介:數(shù)據(jù)庫是專門開發(fā)數(shù)據(jù)管理的軟件,或者說專門管理數(shù)據(jù)的軟件就是數(shù)據(jù)庫。數(shù)據(jù)庫存在的意義就是:減輕開發(fā)人員的負擔。數(shù)據(jù)庫是一個綜合的軟件,那么我們不需要隊要進行2進制保存數(shù)據(jù)進行處理了,但是卻是要與數(shù)據(jù)庫產生交互,那么命令式SQL,有技巧的 ,數(shù)據(jù)庫就是萬物皆關系(面向對象,萬物皆是對象)有所區(qū)別。2、數(shù)據(jù)庫的發(fā)展:一開始的是層次化的數(shù)據(jù)與網(wǎng)狀數(shù)據(jù)庫 ,后來也發(fā)現(xiàn)使用確實很麻煩。于是到了1970年EFCO公司開創(chuàng)了關系性的數(shù)據(jù)庫 ,技術難度大。后來,Oracle(甲骨

2、文)公司的創(chuàng)始人,拉里投入到關系型數(shù)據(jù)庫的研發(fā),并且得到了一個大客戶 美國國防部。隨即開始出現(xiàn)關系數(shù)據(jù)庫的旋風,隨后各個公司都紛紛推出自己的數(shù)據(jù)庫系統(tǒng)。比如:IBM的DB2 ,還有風靡一時的DBS3。但是隨即出現(xiàn)不兼容的問題,由于最早的時候都沒有進行沒規(guī)范。所以到最后各個數(shù)據(jù)庫巨頭統(tǒng)一了操縱數(shù)據(jù)庫的SQL(結構化數(shù)據(jù)查詢語言) 變成了標準語言,而關系型數(shù)據(jù)庫也儼然變成大家的寵兒,Oracle也從一個小公司,變成現(xiàn)在的數(shù)據(jù)的巨頭,而我們的微軟也推出了SQLserver。當然還有PHPer的最愛mySQL。但是mySQL被SUN,SUN被Oracle收購,現(xiàn)在有免費版與收費專業(yè)版了。所以我們學習S

3、QL語言的時候,先學共同點,再學特異性。各種數(shù)據(jù)庫軟件在使用上有一點區(qū)別。3、數(shù)據(jù)庫系統(tǒng)詳解:為適應數(shù)據(jù)處理的需要而發(fā)展起來的一種較為理想的數(shù)據(jù)處理的核心機構。計算機的高速處理能力和大容量存儲器提供了實現(xiàn)數(shù)據(jù)管理自動化的條件。 數(shù)據(jù)庫系統(tǒng)一般由4個部分組成:數(shù)據(jù)庫,即存儲在磁帶、磁盤、光盤或其他外存介質上、按一定結構組織在一起的相關數(shù)據(jù)的集合。(個體)數(shù)據(jù)庫管理系統(tǒng)(DBMS)。一組能完成描述、管理、維護子數(shù)據(jù)庫的程序系統(tǒng)。它按照一種公用的和可控制的方法完成插入新數(shù)據(jù)、修改和檢索原有數(shù)據(jù)的操作。數(shù)據(jù)庫管理員(DBA)。用戶和應用程序。(微軟的稱作SSMS)4、數(shù)據(jù)庫系統(tǒng)的基本要求是: 能夠保證

4、數(shù)據(jù)的獨立性。數(shù)據(jù)和程序相互獨立有利于加快軟件開發(fā)速度,節(jié)省開發(fā)費用。 冗余數(shù)據(jù)少,數(shù)據(jù)共享程度高。 系統(tǒng)的用戶接口簡單,用戶容易掌握,使用方便。 能夠確保系統(tǒng)運行可靠,出現(xiàn)故障時能迅速排除;能夠保護數(shù)據(jù)不受非受權者訪問或破壞;能夠防止錯誤數(shù)據(jù)的產生,一旦產生也能及時發(fā)現(xiàn)。 有重新組織數(shù)據(jù)的能力,能改變數(shù)據(jù)的存儲結構或數(shù)據(jù)存儲位置,以適應用戶操作特性的變化,改善由于頻繁插入、刪除操作造成的數(shù)據(jù)組織零亂和時空性能變壞的狀況。 具有可修改性和可擴充性、可維護性。 能夠充分描述數(shù)據(jù)間的內在聯(lián)系。 5、數(shù)據(jù)庫(Database):由眾多的數(shù)據(jù)、數(shù)據(jù)表、約束、存儲過程、函數(shù)、視圖、索引構成的一個數(shù)據(jù)存儲

5、與交互單元,是按照數(shù)據(jù)結構來組織、存儲和管理數(shù)據(jù)的倉庫。6、數(shù)據(jù)表(table):數(shù)據(jù)表,實際上是一個二維表。一般是圍繞一個事務動作記錄,或者是一個信息主題作為一個數(shù)據(jù)表。數(shù)據(jù)表由行與列構成。7、列(column、field):列,其實就是字段。也是決定了信息的基本單元。列,包含有數(shù)據(jù)類型的設定。8、行(row、record);行,實際上就是一條基本信息。一行包含了多列數(shù)據(jù)的存儲的信息。所以一行也有一條記錄之稱。9、行業(yè)(trade)每一個行業(yè)每一個需求,沒一個需求每一種數(shù)據(jù)庫的設計模式與思想。每個行業(yè)的數(shù)據(jù)設計的重點都是不同的。側重查詢還是操作就是自己選擇的問題了。10、索引(index)索

6、引其實就是一個B+樹,但是這個索引是Nn層數(shù)次方的。目的就是在數(shù)據(jù)庫中劃分出一定的區(qū)域優(yōu)化查詢??梢蕴嵘罅繑?shù)據(jù)的查詢速度。索引一般可以分為:基于字段優(yōu)化查詢速度的普通索引、唯一性索引、主鍵索引、全文索引、單列與多列索引?,F(xiàn)在由于數(shù)據(jù)庫系統(tǒng)的不斷升級,我們只要設定索引就可以了,不需要特殊的維護。而且數(shù)據(jù)在查詢的時候也會根據(jù)查詢適當?shù)剡x擇是利用索引查詢,還是僅僅是表查詢。由于數(shù)據(jù)庫系統(tǒng)的發(fā)展,系統(tǒng)內部已經自動幫我們完成對索引的維護。但是在設計的時候要考慮到索引的損耗問題。11、視圖(view)固化的子查詢,將一個子查詢起了一個固化的名字,保存在數(shù)據(jù)庫中,方便以后的使用。其實調用大量的Join來進

7、行一個查詢一般也是用視圖。視圖與索引都是為了優(yōu)化查詢的速度與語句。視圖是優(yōu)化語句,索引是優(yōu)化單查速度。一般是DBA來設定數(shù)據(jù)庫的視圖, 封裝內部數(shù)據(jù)庫的數(shù)據(jù)關系,范式修改數(shù)據(jù)容易了,視圖讓我們查詢復雜關系的數(shù)據(jù)變得容易。12、命名規(guī)范:數(shù)據(jù)庫對象前綴舉例 Pascal命名法表(Table)字段(Column)視圖(View)存儲過程(Stored procedure)觸發(fā)器(Trigger)索引(Index)主鍵(Primary key)外鍵(Foreign key)Check約束(Check Constraint)Unique約束用戶定義數(shù)據(jù)類型(User-defined data type

8、)用戶定義函數(shù)(User-defined function)tbl 無 v prtrix_pk_fk_ck_uq_udtfntbl_StudentTitle,studentIDvActivityprDelOrdertrOrder_Dix_CustomerIDpk_Adminfk_Order_OrderTypeck_TableColumnuq_TableColumnudtPhonefnDueDate事務表命名:這個表的起名,建議的寫法是將兩個表的表名合并(如果表名比較長可做簡化),此處如 tbl_StudentCourse。比如給StudentCourse表中加AccessLevel字段,值域D

9、只讀,完全,禁止,就可以實現(xiàn)訪問級別。 tbl_StudentCourse_ReadOnly字段命名:所有表示時間的字段,統(tǒng)一以 Date 來作為結尾。登陸時間 LogionDate 所有表示數(shù)目、次數(shù)的字段,都應該以Count作為結尾。登陸次數(shù) LoginCount所有代表鏈接的字段,均為Url結尾。廣告鏈接 LoginUrl按照微軟的建議,布爾類型的值均以 Is是否、Has有無 或者 Can 能否開頭。true都表示肯定。比如tbl_User中全部都是UserId,UserName?沒必要,只要我們堅持在他處使用tbl_User.UserId、tbl_User.Name所有的主鍵都是 信息

10、體Id參數(shù)命名:CurrentDate ActivityCountEquipmentType、存儲過程命名:prCalculateTotalPrice 估算總價pr CountTotalAmountOfMonthlyPayments 計算每月付費的總金額prGetParentOrganizationalUnitName 獲取上級單位名稱14、Null的三值關系 null為unknow,邏輯為假,關系忽略,當為不跳過斷言Null也是一個集合,但是僅僅表示的是一個空集,但是實際上是null=Unknow。1、 NULL與別的值進行+-*/等計算操作(包括在大多數(shù)函數(shù)中使用NULL)后,結果是NUL

11、L(標量表達式)。NULL與別的值進行=、 Unknown Unknown AND/OR Unknown - Unknown Unknown OR TRUE - TRUE Unknown AND TRUE - Unknown Unknown OR FALSE - Unknown Unknown AND FALSE - FALSE /code具體可查三值邏輯的真值表。2. 在where/on/having和if/case when中,只有true(1=1)才使條件成立(即在判斷語句中Unknown當作False來處理)。比如:where column = value:表中column為NULL的

12、行永遠不會返回,即使value是NULL;case value when NULL then XXX when . end:XXX永遠不會執(zhí)行,即使value是NULL;if XXX else YYY end或case when then XXX else YYY end:這兩種情況下,,即是null會執(zhí)行。3. 包含外鍵約束和Check約束的字段允許NULL(即約束只當條件為False時出錯,Unknown是不管的)。4. 包含唯一約束(unique index)的字段只允許一個NULL的行,再插入或更新該字段為NULL的行會報字段重復的錯誤。5. GROUP BY時,所有NULL被視為一組

13、。6. ORDER BY時,所有NULL排在一起,但NULL排在非空值的前面(最前面)(如SQL Server)還是后面(如Oracle),SQL標準未規(guī)定。7. 聚集函數(shù)(SUM/AVG/MAX/MIN/COUNT)忽略NULL的行,即是不返回此行數(shù)據(jù)。8. declare的變量,在未賦值之前為NULL。9. 與NULL處理相關的運算符和函數(shù):- IS NULL/IS NOT NULL:用這兩個運算符來判斷一個值是否為NULL,而不是=或。- ISNULL/COALESCE:取第一個非空值(注意兩個函數(shù)的數(shù)據(jù)類型轉換規(guī)則不同)。- NULLIF(a,b):等價于CASE WHEN a = b

14、 THEN NULL ELSE a END。15、Not Null的建表由于三值關系的存在,我們很難辨認出null的時候,我發(fā)現(xiàn)很多開發(fā)人員在建表的時候,如果要新建一個字段,他的思路是這樣的:默認這個字段是可以為Null的,然后去判斷是不是非要Not Null不可,如果不是這樣,OK,這個字段可以為Null,接著繼續(xù)進行下一個字段。結果往往是一張表除了主鍵以外所有的字段都可以為Null。之所以會有這樣的思路,是因為Null好啊,程序不容易出錯啊,你插入記錄的時候如果不小心忘輸了一個字段,程序依然可以Run,而不會出現(xiàn) “XX字段不能為Null”的錯誤消息。但是,這樣做的結果卻是很嚴重的,也會使

15、你的程序變得更加繁瑣,你不得不進行一些無謂的空值處理,以避免程序出錯。更糟的是,如果一些重要數(shù)據(jù),比如說訂單的某一項值為Null了,那么大家知道,任何值與Null相操作(比如加減乘除),結果都是Null,導致的結果就是訂單的總金額也為Null。你可以運行下面的代碼嘗試一下:Select Null + 5 As Result 你可能會說,就算我將字段設置成Not Null,但是它依然可以接受空字符串,這樣一來在程序中還是要進行空值處理。請別忘了,數(shù)據(jù)庫還賦予你一個強力武器,就是 Check 約束,當你需要確保一個字段既不可以為Null,又不可以為空的時候,可以這么寫:Abstract Varch

16、ar(500) Not Null Constraint ck_ColumnName Check(Len(ColumnName)0),Type TinyInt Not Null Default 0 Constraint ck_ArticleType Check(Type in (0,1,2), 所以,合理的思維方式應該是這樣的:默認這個字段是 Not Null的,然后判斷這個字段是不是非Null不可,如果不是這樣,OK,這個字段是Not Null的,進行下一個字段。16、MSSQL數(shù)據(jù)類型詳解數(shù)據(jù)類型 描述bit整型 bit 數(shù)據(jù)類型是整型,其值只能是0、1或空值(null)。這種數(shù)據(jù)類型用于存

17、儲只有兩種可能值的數(shù)據(jù),如Yes 或No、True 或Fa lse 、On 或Off 。int整型int 數(shù)據(jù)類型可以存儲從- 231(-2147483648)到231 (2147483 647)之間的整數(shù)。存儲到數(shù)據(jù)庫的幾乎所有數(shù)值型的數(shù)據(jù)都可以用這種數(shù)據(jù)類型。這種數(shù)據(jù)類型在數(shù)據(jù)庫里占用4個字節(jié)smallint整型smallint 數(shù)據(jù)類型可以存儲從- 215(-32768)到215(32767)之間的整數(shù)。這種數(shù)據(jù)類型對存儲一些常限定在特定范圍內的數(shù)值型數(shù)據(jù)非常有用。這種數(shù)據(jù)類型在數(shù)據(jù)庫里占用2個字節(jié)空間tinyint整型tinyint 數(shù)據(jù)類型能存儲從0到255 之間的整數(shù)。它在你只打算

18、存儲有限數(shù)目的數(shù)值時很有用。 這種數(shù)據(jù)類型在數(shù)據(jù)庫中占用1 個字節(jié)numeric精確數(shù)字型numeric數(shù)據(jù)類型與decimal 型相同decimal精確數(shù)值型decimal 數(shù)據(jù)類型能用來存儲從-1038-1到1038-1的固定精度和范圍的數(shù)值型數(shù)據(jù)。使用這種數(shù)據(jù)類型時,必須指定范圍和精度。 范圍是小數(shù)點左右所能存儲的數(shù)字的總位數(shù)。精度是小數(shù)點右邊存儲的數(shù)字的位數(shù)。左邊是總數(shù)位,右邊是小數(shù)點后的數(shù)位。money貨幣型money 數(shù)據(jù)類型用來表示錢和貨幣值。這種數(shù)據(jù)類型能存儲從-9220億到9220 億之間的數(shù)據(jù),精確到貨幣單位的萬分之一smallmoney貨幣型smallmoney 數(shù)據(jù)類型

19、用來表示錢和貨幣值。這種數(shù)據(jù)類型能存儲從-214748.3648 到214748.3647 之間的數(shù)據(jù),精確到貨幣單位的萬分之一float近似數(shù)值型float 數(shù)據(jù)類型是一種近似數(shù)值類型,供浮點數(shù)使用。說浮點數(shù)是近似的,是因為在其范圍內不是所有的數(shù)都能精確表示。浮點數(shù)可以是從-1.79E+308到1.79E+308 之間的任意數(shù)real近似數(shù)值型real 數(shù)據(jù)類型像浮點數(shù)一樣,是近似數(shù)值類型。它可以表示數(shù)值在-3.40E+38到3.40E+38之間的浮點數(shù)datetime日期時間型datetime數(shù)據(jù)類型用來表示日期和時間。這種數(shù)據(jù)類型存儲從1753年1月1日到9999年12月3 1日間所有的

20、日期和時間數(shù)據(jù), 精確到三百分之一秒或3.33毫秒Smalldatetime日期時間型smalldatetime 數(shù)據(jù)類型用來表示從1900年1月1日到2079年6月6日間的日期和時間,精確到一分鐘cursor特殊數(shù)據(jù)型cursor 數(shù)據(jù)類型是一種特殊的數(shù)據(jù)類型,它包含一個對游標的引用。這種數(shù)據(jù)類型用在存儲過程中,而且創(chuàng)建表時不能用timestamp特殊數(shù)據(jù)型timestamp 數(shù)據(jù)類型是一種特殊的數(shù)據(jù)類型,用來創(chuàng)建一個數(shù)據(jù)庫范圍內的唯一數(shù)碼。 一個表中只能有一個timestamp列。每次插入或修改一行時,timestamp列的值都會改變。盡管它的名字中有“time”, 但timestamp列

21、不是人們可識別的日期。在一個數(shù)據(jù)庫里,timestamp值是唯一的Uniqueidentifier特殊數(shù)據(jù)型Uniqueidentifier數(shù)據(jù)類型用來存儲一個全局唯一標識符,即GUID。GUID確實是全局唯一的。這個數(shù)幾乎沒有機會在另一個系統(tǒng)中被重建。可以使用NEWID 函數(shù)或轉換一個字符串為唯一標識符來初始化具有唯一標識符的列char字符型char數(shù)據(jù)類型用來存儲指定長度的定長非統(tǒng)一編碼型的數(shù)據(jù)。當定義一列為此類型時,你必須指定列長。當你總能知道要存儲的數(shù)據(jù)的長度時,此數(shù)據(jù)類型很有用。例如,當你按郵政編碼加4個字符格式來存儲數(shù)據(jù)時,你知道總要用到10個字符。此數(shù)據(jù)類型的列寬最大為8000

22、個字符varchar字符型varchar數(shù)據(jù)類型,同char類型一樣,用來存儲非統(tǒng)一編碼型字符數(shù)據(jù)。與char 型不一樣,此數(shù)據(jù)類型為變長。當定義一列為該數(shù)據(jù)類型時,你要指定該列的最大長度。 它與char數(shù)據(jù)類型最大的區(qū)別是,存儲的長度不是列長,而是數(shù)據(jù)的長度。其實就是可變長的char類型。text字符型text 數(shù)據(jù)類型用來存儲大量的非統(tǒng)一編碼型字符數(shù)據(jù)。這種數(shù)據(jù)類型最多可以有231-1或20億個字符。有點像BLOB、CLOB,只保留16個字節(jié)的地址,速度會變慢。它不是char所以字符串的函數(shù)對其無效ntext字符型也是用Unicode的text。nchar統(tǒng)一編碼字符nchar 數(shù)據(jù)類型用

23、來存儲定長統(tǒng)一編碼字符型數(shù)據(jù)。統(tǒng)一編碼用2個字節(jié)來存儲每個字符,而不是用單字節(jié)(普通文本中的情況)。它允許大量的擴展字符。此數(shù)據(jù)類型能存儲4000種字符,使用的字節(jié)空間上增加了一倍。可以針對特殊的字符。就會使用Unicode的編碼來存儲。8000個字節(jié)。nvarchar統(tǒng)一編碼字符型nvarchar 數(shù)據(jù)類型用作變長的統(tǒng)一編碼字符型數(shù)據(jù)。此數(shù)據(jù)類型能存儲4000種字符,使用的字節(jié)空間增加了一倍。變長、特殊字符。這種Unicode編碼要比char、varchar存儲相同的數(shù)據(jù)耗用了ntext統(tǒng)一編碼字符型ntext 數(shù)據(jù)類型用來存儲大量的統(tǒng)一編碼字符型數(shù)據(jù)。這種數(shù)據(jù)類型能存儲230 -1或將近1

24、0億個字符,且使用的字節(jié)空間增加了一倍binary二進制數(shù)據(jù)類型binary數(shù)據(jù)類型用來存儲可達8000 字節(jié)長的定長的二進制數(shù)據(jù)。當輸入表的內容接近相同的長度時,你應該使用這種數(shù)據(jù)類型varbinary二進制數(shù)據(jù)類型varbinary 數(shù)據(jù)類型用來存儲可達8000 字節(jié)長的變長的二進制數(shù)據(jù)。當輸入表的內容大小可變時,你應該使用這種數(shù)據(jù)類型image二進制數(shù)據(jù)類型image 數(shù)據(jù)類型用來存儲變長的二進制數(shù)據(jù),最大可達231-1或大約20億字節(jié)BLOB、CLOB統(tǒng)一編碼字符型記錄大量的文字,適合記錄博文。Max的突破限制,可以存特別長的數(shù)據(jù)。這樣就可以突破原本的數(shù)據(jù)類型的長度限制。17、結合信息

25、對象與業(yè)務設計數(shù)據(jù)庫設計1、數(shù)據(jù)庫的設計師根據(jù)信息要素、關系來設計的;2、數(shù)據(jù)庫的信息查找依賴于信息的使用方式的;3、對于可有可無的東西,我們需要花點時間去好好斟酌;4、簡短的查詢,比囧長的業(yè)務查詢更加需要思考;5、使用數(shù)據(jù)的方式將會與我們占用系統(tǒng)內存與硬盤息息相關,影響著服務器的整體表現(xiàn),所以我們的設計會有所倚重與側重;現(xiàn)在基本是雙數(shù)據(jù)庫,外層是方便查詢,內層是方便修改。SQL換一句話其實就是關系數(shù)據(jù)庫管理系統(tǒng) Realtional Database Management System ,RDBMS表的設計的方法:1、挑出事物對象(對象信息濃縮法)2、圍繞事物對象的信息收集(信息擴散聚攏法)

26、3、信息拆分成塊(字段原子性)4、事務需求拆分法(關系設計)5、數(shù)據(jù)的發(fā)散與聚合程度的分析(表設計的檢驗)18、數(shù)據(jù)庫的原子性1、你的表是描述什么事物,明確表的信息對象主體2、你的表是為了適合什么操作語句的設計的,面向操作設計3、列的內容要不要原子性的切塊,讓查詢直逼要害,列的設計的小塊的程度要拿捏好4、表必須是二維表,而且要根據(jù)不同的需求進行設計,表的設計與列的設計一樣都要依賴與操作與需求原子性的存在是為了切分適合的信息塊 ,從而達到信息的最大化、最優(yōu)化的使用,并不是無限切分就好,要看實際的應用。但是由于原子性數(shù)據(jù)的表容易設計,而且運行的所需時間較短(查詢信息的指向性比較強,同時也便于維護喝

27、更新操作,但是卻是在海量數(shù)據(jù)搜索面前有點乏力),所以對大量的數(shù)據(jù)處理的時候要加分效果。1、 同一列中不能存在多個類型相同的值,一列不能多值(除非是)2、 同一個表中也不能存在有多個存儲相同類型數(shù)據(jù)的列3、 無重復的行,每列只存儲一份同類型下的一份數(shù)據(jù)(列是單值的),無重復列名4、19、規(guī)范化建表讓數(shù)據(jù)具有原子性是設計出規(guī)范化數(shù)據(jù)表的第一步(同時也是為了提高數(shù)據(jù)庫的可讀性),但是到后期你可能會因為數(shù)據(jù)量以及性能的問題打破這種規(guī)范化。因為你的數(shù)據(jù)庫投入使用后數(shù)據(jù)庫的大小日益增大,設計規(guī)范化的表可以時刻保持你應對以后各種復雜的組合查詢 (主要是應對數(shù)據(jù)庫過分膨脹后的,查詢緩慢的問題)規(guī)范化建表的優(yōu)點

28、:1、可以減少表中重復數(shù)據(jù)的存儲,減少數(shù)據(jù)庫的大??;2、因為數(shù)據(jù)庫的切割使得你的查詢的指向性更強,查找的數(shù)據(jù)少,查找得更加快速;3、但是最后歸根到底還是 避免存儲重復的數(shù)據(jù)節(jié)省我們的硬盤空間。20、范式 1NF 2NF 3NF 4NF 1NF,主要是解決表中字段設計、信息與業(yè)務之間的關系的問題1、 數(shù)據(jù)庫表的每一列都是不可分割的基本數(shù)據(jù)項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重復的屬性。在第一范式(1NF)中表的每一行只包含一個實例的信息。簡而言之,第一范式就是無重復的列,而且單列無重復的值。2、 所有屬性都必須是原子的每個屬性一個值。一個實體的所有實例都必須包含同等

29、數(shù)量的值。一個實體的所有實例必須兩兩不相同。2NF,主要是設定主鍵,解決數(shù)據(jù)庫的數(shù)據(jù)冗余、更新、插入、更新的指向性的問題1、 要求數(shù)據(jù)庫表中的每個實例或行必須可以被唯一地區(qū)分。為實現(xiàn)區(qū)分通常需要為表加上一個列,以存儲各個實例的唯一標識。這個唯一屬性列被稱為主關鍵字或主鍵、主碼、唯一關聯(lián)。引入主鍵約束primary key,Constraint pk_Article Primary Key(Id)。主鍵的設定也是有要求的。主鍵默認不能為空,保持唯一性。插入、更新刪、除記錄的時候必須指定主鍵的值。要求主鍵必須簡潔,主鍵值不能被修改。2、 實體必須滿足第一范式。所有屬性描述的事實都必須與整個鍵相關,

30、而不能只描述鍵的一個子集。3NF,主要是解決排除部分列之間的依賴關系,利用了表與表的主外鍵關系解決。1、 要求實體數(shù)據(jù)記錄(record)相對于外部完全依賴于主關鍵ID。所謂完全依賴,是指在除主鍵外其他的屬性列之間不存在對應依賴。如果存在,那么這一依賴部分應該分離出來形成一個表(關聯(lián)),一般抽離出這一部分的主依賴項的ID,把這一部分作為一個新的表記錄,同時原表也存儲此次依賴項ID,然后利用建立主外鍵關系,將一表分成兩表,解決原表因為主次依賴項存在而造成的數(shù)據(jù)冗余等一系列問題(但是對于以查詢操作為主、記錄大量數(shù)據(jù)的表此范式就需要斟酌了)。第二范式就是建立主鍵,與排除其他列對其屬性列的依賴(消除部

31、分列的依賴)。2、 實體必須滿足第二范式。如果每個非鍵屬性描述的事實都與一個鍵屬性相關,則實體滿足第三范式所有屬性描述的都必須是關于鍵的事實,除此之外別無其他。4NF,主要是解決根據(jù)屬性列的相似(不同的從屬對象)與共同(相同的從屬對象)信息的建表問題,即是表中所有列對外的一對多關系不受限制1、 因為比較抽象,即是A表中含有a1,a2兩個屬性列,B表中記錄a1的信息(包含b1),C表中包含a2的信息(包含c1),但是b1,c1實際上是相同類型的信息,但是從對象不同。此處就是要我們明確建表的時候,要仔細區(qū)分共有與相似(決定建表)的關系,從屬對象與屬性列之間關系與一對多關系的搭設與否的問題。2、 在

32、實體中,不會出現(xiàn)多于一個的多值依賴。5NF,主要是解決將信息切割得更細,清除所有冗余,但是在4NF設計會出現(xiàn)聯(lián)接不當而產生的錯誤record1、在4NF下,一般我們僅僅是區(qū)分了屬性列的相似與共有信息,但是這個時候就會因為新建的b、c而產生誤解數(shù)據(jù)或者是錯誤記錄。因此可以從第五范式(實際上是所有范式)中得到的啟示是,當你覺得可以將表分解為帶著不同自然鍵的更多、更小的表時,這么干很可能就是最好的方式。如果你想要把各個部分聯(lián)結到一起,表示最初的、分解得更少的數(shù)據(jù)形式,數(shù)據(jù)庫干這事比你干得強多了。很明顯,如果你不能通過聯(lián)結來重新構建分解前的表,那就最好不要進行分解。即是有一個道理,更少得冗余,更多的錯

33、誤。唯有靠聯(lián)接來解決了?;蛘卟捎脴錉罘謱釉O計法,同層合并,也可以單獨建立一個事務記錄表。2、當分解是信息無損的時候,所有關系都被分解成了二元關系。但是面對日益變態(tài)的信息幾何級的增長,為了令到數(shù)據(jù)庫從焦油坑變成金礦我們會加入數(shù)據(jù)挖掘的思想,但是這個時候就需要無損的信息與高度分塊的。所以在物理建表之前,我們還是需要遵循規(guī)范化建表的原則。20、不規(guī)范化建表規(guī)范化主要用來改善性能,過度規(guī)范化的結構會造成查詢處理器和SQL Server中其他進程的開銷過大(不適用在查詢表的設計),或者,有時需要降低復雜性來使得實現(xiàn)更容易些,非規(guī)范化在這些時候就會發(fā)揮作用。正如我在這章中一直試圖闡明的那樣,雖然人們大都認

34、為非規(guī)范化到第三范式就可以了(靠著減少所需聯(lián)結的數(shù)量,查詢過程已經被簡化了)然而,這樣做冒著引入數(shù)據(jù)異常的風險。每個使用數(shù)據(jù)庫的應用程序都要復制任何額外寫的,用來處理這些異常代碼,因此就增加了人為錯誤的可能性。在這種情況下必須作出的判斷是:是一個稍微慢點(但是100正確)的應用更好呢,還是一個更快但正確性稍差的應用更好些。在邏輯建模階段,絕不應該從我們規(guī)范化的結構倒退,對應用程序過早過激地進行性能調優(yōu)工作。OLTP數(shù)據(jù)庫結構上,所以設計中最重要的部分就是:保證我們的邏輯模型體現(xiàn)了最終的數(shù)據(jù)庫含有的所有實體和屬性。一旦開始物理建模過程(這與性能調優(yōu)應該是同義語),那就有足夠充足的理由來對結構進行

35、非規(guī)范化操作,要么是出于性能的考慮,要么是出于減少復雜性的考慮,但是,這兩種考慮都不適合用在邏輯模型上。當我們物理上的實現(xiàn)在邏輯上也正確的時候,碰到的問題幾乎總是會更少些。對幾乎所有情況來說,我都建議等到物理建模階段才對解決方案進行實現(xiàn),或者,至少等到有某種非做不可的原因時(比如,系統(tǒng)中某些部分失敗了)才進行非規(guī)范化工作??偨Y:一般,我們是采用兩層數(shù)據(jù)庫的,一層是外層,用于直接的查詢。一層是內層數(shù)據(jù)庫,用于記錄與維護更新的。維護更新資料的時候,對內層數(shù)據(jù)庫進行操作,當操作完成的時候就會馬上更新外層數(shù)據(jù)庫。所以外層數(shù)據(jù)庫(以查詢?yōu)橹鳎┰O計的范式要求比較低,但是內層數(shù)據(jù)庫(維護更新為主)的要求就比

36、較高了。13、數(shù)據(jù)庫設計建議:數(shù)據(jù)庫不僅是用來保存數(shù)據(jù),還應負責維護數(shù)據(jù)的完整性和一致性我看過很多的開發(fā)人員設計出來的數(shù)據(jù)庫,給我的感覺就是:在他們眼里,數(shù)據(jù)庫的作用就如同它的名稱一樣不僅僅是用來存放數(shù)據(jù)的,除了不得不建的主鍵以外,什么都沒有.沒有 Check約束,沒有索引,沒有外鍵約束,沒有視圖,甚至沒有存儲過程。 一個很好的數(shù)據(jù)庫該有的還是有的。什么都沒有的數(shù)據(jù)庫插入操作是很好,但是多了這點東西的數(shù)據(jù)庫還是很快的。如果要寫代碼來確保表中的行都是唯一的,就為表添加一個主鍵,即是distinct的使用頻率應該是比價少的。 如果要寫代碼來確保表中的一個單獨的列是唯一的,就為表添加一個約束,一般是

37、事務狀態(tài)記錄表。 如果要寫代碼確定表中的列的取值只能屬于某個范圍,就添加一個Check約束。 如果要寫代碼來連接 父子 表,就創(chuàng)建一個關系,上下其實都是依據(jù)主外鍵的。 如果要寫代碼來維護“一旦父表中的一行發(fā)生變化,連帶變更子表中的相關行”,就啟用級聯(lián)刪除和更新。 如果要調用大量的Join來進行一個查詢,就創(chuàng)建一個視圖。 如果要逐條的寫數(shù)據(jù)庫操作的語句來完成一個業(yè)務規(guī)則,就使用存儲過程。 沒有提到觸發(fā)器,實踐證明觸發(fā)器會使數(shù)據(jù)庫迅速變得過于復雜,更重要的是觸發(fā)器難以調試,如果不小心建了個連環(huán)觸發(fā)器,就更讓人頭疼了,所以我更傾向于根本就不使用觸發(fā)器trigger。3、技術實例:(數(shù)據(jù)庫)1、 加載

38、數(shù)據(jù)庫腳本source C:UsersAdministratorDesktopscript-1.sql ;mySQLsource (.) Execute an SQL script file. Takes a file name as an argument.2、 保存為數(shù)據(jù)庫腳本Tee C:UsersAdministratorDesktopscript-1.sql ;tee (T) Set outfile to_outfile. Append everything into given outfile.notee 輸入的時候就會把tee與notee進行保存為sql腳本。3、 查詢當前實例的數(shù)

39、據(jù)庫集合Show databases ; mySQLmysql show databases;+-+| Database |+-+| information_schema | drinks | mysql | performance_schema | test |+-+4、使用某個數(shù)據(jù)庫mysql use drinks;Database changed5、查詢當前數(shù)據(jù)庫的表集mysql show tables;+-+| Tables_in_drinks |+-+| easy_drinks | my_contacts |+-+6、查詢表的結構mysql desc my_contacts;+-+-

40、+-+-+-+-+| Field | Type | Null | Key | Default | Extra |+-+-+-+-+-+-+惡補:1、判斷存在-利用系統(tǒng)視圖判斷數(shù)據(jù)表是否存在,而且是先判斷是否存在dbo.tb對象,在判斷是否是NIsUserTable-利用系統(tǒng)視圖判斷對象是否存在,而且是先判斷是否存在dbo.對象名對象,在判斷是否是N類型Sysobjects是Master系統(tǒng)視圖object_id是抓取對象在視圖中的IDOBJECTPROPERTY是根據(jù)對象判斷類型函數(shù),返回的是boolif exists (select * from dbo.sysobjects where i

41、d = object_id(Ndbo.tb) and OBJECTPROPERTY(id, NIsUserTable) = 1)drop table dbo.tb;2、模糊搜索,刪除對象,動態(tài)SQL語句declare a varchar(2000) MSSQL 刪除約束set a=(select name from sysobjects where name like ConstraintName) set a= ALTER TABLE dbo.TableName DROP CONSTRAINT +a exec (a)7、數(shù)據(jù)庫的新建、刪、改:新建數(shù)據(jù)庫mysql create databas

42、e myDB; mySQLQuery OK, 1 row affected (0.00 sec)create database mmc; MSSQL:數(shù)據(jù)庫修改exec sp_rename , Name , database MSSQL:刪除數(shù)據(jù)庫mysql drop database drinks;mySQLQuery OK, 2 rows affected (0.34 sec)drop database mySQL;MSSQL8、數(shù)據(jù)表的新建、刪、改 :新建數(shù)據(jù)表mysql show create table servers;mySQL顯示表的創(chuàng)建方式| servers |

43、 CREATE TABLE servers ( Server_name char(64) NOT NULL DEFAULT , Host char(64) NOT NULL DEFAULT , Db char(64) NOT NULL DEFAULT , Username char(64) NOT NULL DEFAULT , Password char(64) NOT NULL DEFAULT , Port int(4) NOT NULL DEFAULT 0, Socket char(64) NOT NULL DEFAULT , Wrapper char(64) NOT NULL DEFAU

44、LT , Owner char(64) NOT NULL DEFAULT , PRIMARY KEY (Server_name) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT=MySQL Foreign Servers table |mysql create table my_contacts( mySQL - last_name int not null Auto_increment, - first_name varchar(20) not null , - email varchar(50) not null, - birthday date, -

45、 profession varchar(50), - location varchar(50), - status varchar(20), - interests varchar(20),- seeking varchar(100) ,Parmary kry (名 ) );Create Table Article MSSQL( IdInt Identity(1,1)Not Null,自增 Title Varchar(50)Not Null Constraint uq_ArticleTitle Unique,1、唯一約束 KeywordsVarchar(50)Not Null Constrai

46、nt ck_KeywordsLength Check (len(Keywords) alter table 舊表名 rename to 新表名; mySQL use databasename; EXEC sp_rename 舊表名, 新表名;MSSQL:刪除數(shù)據(jù)表mysql drop table mytables;mySQLdrop table a1;MSSQL 9、字段、約束(數(shù)據(jù)表成員)的增加、刪、改:增加字段mysql alter table mytablemySQL 添加字段- add column mycolumn2 int first , 其中還有 after column 排在指

47、定的列之后- add primary key (mycolumn2); mySQL 添加主鍵alter table test1 add nob int identity(1,1) not null MSSQL 添加字段alter table test1 add primary key (nob); MSSQL 添加主鍵alter table dbo.Article2 add DEFAULT (1) FOR IsOnIndex MSSQL添加默認約束ALTER TABLE dbo.Article2 WITH CHECK ADD CONSTRAINT ck_KeywordsLength2 CHEC

48、K (len(Keywords) alter table mytables - change column firstname firstName varchar(30) ,mySQL 改變名字、類型- add primary key ( lastname );mysql alter table mytablemySQL 不改變名字,改類型- modify mycolumn2 varchar(20);exec sp_rename , Name , column MSSQL 只改變名字alter table test1 alter column ID varchar(200) n

49、ull MSSQL 不改變名字,改類型alter table test1 drop Constraint constraintname; MSSQL 刪除約束alter table test1 add primary key (nob); MSSQL 添加主鍵約束alter table Articles2 add constraint fk_job_id foreign key (Id) references Article3(Id); MSSQL添加外鍵約束alter table dbo.Article2 add constraint uk_Id unique nonclustered (I

50、d); MSSQL添加唯一約束alter table dbo.Article2 add constraint uk_Id default (1) for IsOnIndex MSSQL添加默認約束alter table dbo.Article2 with check add constraint ck_KeywordsLength2 CHECK (len(Keywords)(10) 新建checkalter table dbo.Article2 chenk constraint ck_KeywordsLength2 MSSQL把ck_KeywordsLength2添加check約束集合alter table dbo.Article2 with check add constra

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論