為什麼需要資料庫?
因為應用程式需要儲存使用者的資料,比如word需要把使用者文件儲存起來,以便下次繼續編輯或者拷貝到另一台電腦。
要儲存使用者的資料,乙個最簡單的方法是把使用者資料寫入檔案。例如,要儲存乙個班級所有學生的資訊,可以向檔案中寫入乙個csv檔案:
id,name,gender,score
1,小明,m,90
2,小紅,f,95
3,小軍,m,88
4,小麗,f,88
如果要儲存學校所有班級的資訊,可以寫入另乙個csv檔案。
但是,隨著應用程式的功能越來越複雜,資料量越來越大,如何管理這些資料就成了大問題:
讀寫檔案並解析出資料需要大量重複**;
從成千上萬的資料中快速查詢出指定資料需要複雜的邏輯。
如果每個應用程式都各自寫自己的讀寫資料的**,一方面效率低,容易出錯,另一方面,每個應用程式訪問資料的介面都不相同,資料難以復用。
所以,資料庫作為一種專門管理資料的軟體就出現了。應用程式不需要自己管理資料,而是通過資料庫軟體提供的介面來讀寫資料。至於資料本身如何儲存到檔案,那是資料庫軟體的事情,應用程式自己並不關心:
read││write
│ database │
這樣一來,編寫應用程式的時候,資料讀寫的功能就被大大地簡化了。
資料模型
資料庫按照資料結構來組織、儲存和管理資料,實際上,資料庫一共有三種模型:
層次模型
網狀模型
關係模型
層次模型就是以「上下級」的層次關係來組織資料的一種方式,層次模型的資料結構看起來就像一顆樹:
網狀模型把每個資料節點和其他很多節點都連線起來,它的資料結構看起來就像很多城市之間的路網:
關係模型把資料看作是乙個二維**,任何資料都可以通過行號+列號來唯一確定,它的資料模型看起來就是乙個excel表:
隨著時間的推移和市場競爭,最終,基於關係模型的關聯式資料庫獲得了絕對市場份額。
為什麼關聯式資料庫獲得了最廣泛的應用?
因為相比層次模型和網狀模型,關係模型理解和使用起來最簡單。
關聯式資料庫的關係模型是基於數學理論建立的。我們把域(domain)定義為一組具有相同資料型別的值的集合,給定一組域d1,d2,...,dn,它們的笛卡爾集定義為d1×d2×……×dn=,
而d1×d2×……×dn的子集叫作在域d1,d2,...,dn上的關係,表示為r(d1,d2,...,dn),這裡的r表示$#%&^@!&$#;!~%¥%:(……算了,根本講不明白,大家也不用理解。
基於數學理論的關係模型雖然講起來挺複雜,但是,基於日常生活的關係模型卻十分容易理解。我們以學校班級為例,乙個班級的學生就可以用乙個**存起來,並且定義如下:
id姓名班級id性別年齡
1小明201m9
2小紅202f8
3小軍202m8
4小白201f9
其中,班級id對應著另乙個班級表:
id名稱班主任
201二年級一班王老師
202二年級二班***
通過給定乙個班級名稱,可以查到一條班級記錄,根據班級id,又可以查到多條學生記錄,這樣,二維表之間就通過id對映建立了「一對多」關係。
資料型別
對於乙個關係表,除了定義每一列的名稱外,還需要定義每一列的資料型別。關聯式資料庫支援的標準資料型別包括數值、字串、時間等:
名稱型別說明
int整型4位元組整數型別,範圍約+/-21億
bigint長整型8位元組整數型別,範圍約+/-922億億
real浮點型4位元組浮點數,範圍約+/-1038
double浮點型8位元組浮點數,範圍約+/-10308
decimal(m,n)高精度小數由使用者指定精度的小數,例如,decimal(20,10)表示一共20位,其中小數10位,通常用於財務計算
char(n)定長字串儲存指定長度的字串,例如,char(100)總是儲存100個字元的字串
varchar(n)變長字串儲存可變長度的字串,例如,varchar(100)可以儲存0~100個字元的字串
boolean布林型別儲存true或者false
date日期型別儲存日期,例如,2018-06-22
time時間型別儲存時間,例如,12:20:59
datetime日期和時間型別儲存日期+時間,例如,2018-06-22 12:20:59
上面的表中列舉了最常用的資料型別。很多資料型別還有別名,例如,real又可以寫成float(24)。還有一些不常用的資料型別,例如,tinyint(範圍在0~255)。各資料庫廠商還會支援特定的資料型別,例如json。
選擇資料型別的時候,要根據業務規則選擇合適的型別。通常來說,bigint能滿足整數儲存的需求,varchar(n)能滿足字串儲存的需求,這兩種型別是使用最廣泛的。
主流關聯式資料庫
目前,主流的關聯式資料庫主要分為以下幾類:
桌面資料庫,以微軟access為代表,適合桌面應用程式使用;
嵌入式資料庫,以sqlite為代表,適合手機應用和桌面程式。
sql什麼是sql?sql是結構化查詢語言的縮寫,用來訪問和運算元據庫系統。sql語句既可以查詢資料庫中的資料,也可以新增、更新和刪除資料庫中的資料,還可以對資料庫進行管理和維護操作。不同的資料庫,都支援sql,這樣,我們通過學習sql這一種語言,就可以操作各種不同的資料庫。
雖然sql已經被ansi組織定義為標準,不幸地是,各個不同的資料庫對標準的sql支援不太一致。並且,大部分資料庫都在標準的sql上做了擴充套件。也就是說,如果只使用標準sql,理論上所有資料庫都可以支援,但如果使用某個特定資料庫的擴充套件sql,換乙個資料庫就不能執行了。例如,oracle把自己擴充套件的sql稱為pl/sql,microsoft把自己擴充套件的sql稱為t-sql。
現實情況是,如果我們只使用標準sql的核心功能,那麼所有資料庫通常都可以執行。不常用的sql功能,不同的資料庫支援的程度都不一樣。而各個資料庫支援的各自擴充套件的功能,通常我們把它們稱之為「方言」。
總的來說,sql語言定義了這麼幾種運算元據庫的能力:
ddl:data definition language
ddl允許使用者定義資料,也就是建立表、刪除表、修改表結構這些操作。通常,ddl由資料庫管理員執行。
dml:data manipulation language
dml為使用者提供新增、刪除、更新資料的能力,這些是應用程式對資料庫的日常操作。
dql:data query language
dql允許使用者查詢資料,這也是通常最頻繁的資料庫日常操作。
語法特點
sql語言關鍵字不區分大小寫!!!但是,針對不同的資料庫,對於表名和列名,有的資料庫區分大小寫,有的資料庫不區分大小寫。同乙個資料庫,有的在linux上區分大小寫,有的在windows上不區分大小寫。
所以,本教程約定:sql關鍵字總是大寫,以示突出,表名和列名均使用小寫。
sql的全稱是:
strange question language
structured question language
(x) structured query language
關聯式資料庫與非關聯式資料庫
關係型資料庫,是指採用了關係模型來組織資料的資料庫。關係模型是在1970年由ibm的研究員e.f.codd博士首先提出的,在之後的幾十年中,關係模型的概念得到了充分的發展並逐漸成為主流資料庫結構的主流模型。簡單來說,關係模型指的就是二維 模型,而乙個關係型資料庫就是由二維表及其之間的聯絡所組成的乙個...
關聯式資料庫與非關聯式資料庫
關係型資料庫,是指採用了關係模型來組織資料的資料庫。關係模型是在1970年由ibm的研究員e.f.codd博士首先提出的,在之後的幾十年中,關係模型的概念得到了充分的發展並逐漸成為主流資料庫結構的主流模型。簡單來說,關係模型指的就是二維 模型,而乙個關係型資料庫就是由二維表及其之間的聯絡所組成的乙個...
關聯式資料庫與非關聯式資料庫
關聯式資料庫,也就是以關係為核心來組織資料的資料庫,資料被看作關係的集合。它的理念是把資料盡可能拆分成多個二維 不同的表之間通過某種關係來連線起來。這樣的好處有 如果資料的某一部分需要變動,只需要變動該資料所處的表就行,而不需要重新設計整個資料庫。前提是最開始就把關係模型設計得足夠好。可以進行複雜的...