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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

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

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

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

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

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

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

7、行一個(gè)查詢一般也是用視圖。視圖與索引都是為了優(yōu)化查詢的速度與語句。視圖是優(yōu)化語句,索引是優(yōu)化單查速度。一般是DBA來設(shè)定數(shù)據(jù)庫的視圖, 封裝內(nèi)部數(shù)據(jù)庫的數(shù)據(jù)關(guān)系,范式修改數(shù)據(jù)容易了,視圖讓我們查詢復(fù)雜關(guān)系的數(shù)據(jù)變得容易。12、命名規(guī)范:數(shù)據(jù)庫對象前綴舉例 Pascal命名法表(Table)字段(Column)視圖(View)存儲(chǔ)過程(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事務(wù)表命名:這個(gè)表的起名,建議的寫法是將兩個(gè)表的表名合并(如果表名比較長可做簡化),此處如 tbl_StudentCourse。比如給StudentCourse表中加AccessLevel字段,值域D

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

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

11、L(標(biāo)量表達(dá)式)。NULL與別的值進(jìn)行=、 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當(dāng)作False來處理)。比如:where column = value:表中column為NULL的

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

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

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

15、你的程序變得更加繁瑣,你不得不進(jìn)行一些無謂的空值處理,以避免程序出錯(cuò)。更糟的是,如果一些重要數(shù)據(jù),比如說訂單的某一項(xiàng)值為Null了,那么大家知道,任何值與Null相操作(比如加減乘除),結(jié)果都是Null,導(dǎo)致的結(jié)果就是訂單的總金額也為Null。你可以運(yùn)行下面的代碼嘗試一下:Select Null + 5 As Result 你可能會(huì)說,就算我將字段設(shè)置成Not Null,但是它依然可以接受空字符串,這樣一來在程序中還是要進(jìn)行空值處理。請別忘了,數(shù)據(jù)庫還賦予你一個(gè)強(qiáng)力武器,就是 Check 約束,當(dāng)你需要確保一個(gè)字段既不可以為Null,又不可以為空的時(shí)候,可以這么寫: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), 所以,合理的思維方式應(yīng)該是這樣的:默認(rèn)這個(gè)字段是 Not Null的,然后判斷這個(gè)字段是不是非Null不可,如果不是這樣,OK,這個(gè)字段是Not Null的,進(jìn)行下一個(gè)字段。16、MSSQL數(shù)據(jù)類型詳解數(shù)據(jù)類型 描述bit整型 bit 數(shù)據(jù)類型是整型,其值只能是0、1或空值(null)。這種數(shù)據(jù)類型用于存

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

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

19、用來表示錢和貨幣值。這種數(shù)據(jù)類型能存儲(chǔ)從-214748.3648 到214748.3647 之間的數(shù)據(jù),精確到貨幣單位的萬分之一float近似數(shù)值型float 數(shù)據(jù)類型是一種近似數(shù)值類型,供浮點(diǎn)數(shù)使用。說浮點(diǎn)數(shù)是近似的,是因?yàn)樵谄浞秶鷥?nèi)不是所有的數(shù)都能精確表示。浮點(diǎn)數(shù)可以是從-1.79E+308到1.79E+308 之間的任意數(shù)real近似數(shù)值型real 數(shù)據(jù)類型像浮點(diǎn)數(shù)一樣,是近似數(shù)值類型。它可以表示數(shù)值在-3.40E+38到3.40E+38之間的浮點(diǎn)數(shù)datetime日期時(shí)間型datetime數(shù)據(jù)類型用來表示日期和時(shí)間。這種數(shù)據(jù)類型存儲(chǔ)從1753年1月1日到9999年12月3 1日間所有的

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

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

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

23、來存儲(chǔ)定長統(tǒng)一編碼字符型數(shù)據(jù)。統(tǒng)一編碼用2個(gè)字節(jié)來存儲(chǔ)每個(gè)字符,而不是用單字節(jié)(普通文本中的情況)。它允許大量的擴(kuò)展字符。此數(shù)據(jù)類型能存儲(chǔ)4000種字符,使用的字節(jié)空間上增加了一倍??梢葬槍μ厥獾淖址?。就會(huì)使用Unicode的編碼來存儲(chǔ)。8000個(gè)字節(jié)。nvarchar統(tǒng)一編碼字符型nvarchar 數(shù)據(jù)類型用作變長的統(tǒng)一編碼字符型數(shù)據(jù)。此數(shù)據(jù)類型能存儲(chǔ)4000種字符,使用的字節(jié)空間增加了一倍。變長、特殊字符。這種Unicode編碼要比char、varchar存儲(chǔ)相同的數(shù)據(jù)耗用了ntext統(tǒng)一編碼字符型ntext 數(shù)據(jù)類型用來存儲(chǔ)大量的統(tǒng)一編碼字符型數(shù)據(jù)。這種數(shù)據(jù)類型能存儲(chǔ)230 -1或?qū)⒔?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

40、+-+-+-+-+| Field | Type | Null | Key | Default | Extra |+-+-+-+-+-+-+惡補(bǔ):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、模糊搜索,刪除對象,動(dòng)態(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添加默認(rèn)約束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添加默認(rèn)約束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)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論