- 快速念咒:MySQL入門指南與進(jìn)階實(shí)戰(zhàn)
- 彭宇奇
- 4912字
- 2024-05-24 18:33:16
1.2 什么是數(shù)據(jù)庫
在1.1節(jié)中,瑟琳娜、奎妮和勞倫斯為大家介紹了3種關(guān)于SQL的理解,希望他們每個(gè)人的闡述都能為你提供多樣化的啟發(fā)。然而不得不說,SQL的主流定義依然是:一門用來與關(guān)系數(shù)據(jù)庫溝通的計(jì)算機(jī)語言。正因如此,另一些具有討論價(jià)值的問題也隨之而來:究竟該如何理解數(shù)據(jù)庫呢?除此以外,本書將著重介紹的MySQL扮演的又是什么角色呢?
對于如何理解數(shù)據(jù)庫,在討論這個(gè)問題之前,你們聯(lián)想到了哪些關(guān)鍵詞呢?
我能想到的關(guān)鍵詞是“關(guān)系數(shù)據(jù)庫”和“表”。
我聯(lián)想到的關(guān)鍵詞是“太平洋”、“捕撈”和“網(wǎng)”。
哦?“太平洋”、“捕撈”和“網(wǎng)”?這聽起來可真是有趣!說實(shí)在的,數(shù)據(jù)庫給我的印象就是一位頭發(fā)稀少的中年男子,他不茍言笑,做事一板一眼,缺少幽默感,日常穿著除了這一件就是另一件……
哦,拜托,請大家千萬不要把數(shù)據(jù)庫的肖像想象成某位數(shù)學(xué)教師,我們可能都不太擅長和數(shù)學(xué)打交道,畢竟那些晦澀的計(jì)算規(guī)則會令人感到頭大。可是你要知道,數(shù)據(jù)庫存儲的信息并不僅是用于加減乘除的數(shù)字。顧名思義,數(shù)據(jù)庫(Database,DB)就是存儲信息數(shù)據(jù)的集合。所以,從廣義上講,我認(rèn)為只要符合該描述的都可以被視作一個(gè)數(shù)據(jù)庫。
沒錯,比如一支清涼可口的炫彩冰激凌,它就可以被視為一個(gè)廣義上的數(shù)據(jù)庫。因?yàn)槟闼瓦M(jìn)嘴里的每一口都含有各種可食用成分,例如蜂蜜、奶油、果醬等。再比如一輛由各個(gè)零部件組成的小汽車,它為什么不可以被視為一個(gè)數(shù)據(jù)庫呢?從最初的工業(yè)設(shè)計(jì)到裝配流程和焊接工藝,再到耐久性測試,可以說它渾身上下都沾滿了信息數(shù)據(jù),只不過我們站在消費(fèi)者的角度察覺不到罷了。
那么按照這種思路來看,我想廣義上的數(shù)據(jù)庫在我們的日常生活中隨處可見:一只整裝待發(fā)的行李箱、一份糟糕透頂?shù)某煽儐危约耙诲亖y燉的黑暗料理。

沒錯,就連一根頭發(fā)絲里都含有數(shù)不清的信息數(shù)據(jù),我相信這正是勞倫斯的看法!不過話說回來,存在于生活中的廣義數(shù)據(jù)庫與大家將要接觸到的關(guān)系數(shù)據(jù)庫(Relational Database, RDB)之間的區(qū)別在哪里呢?我們不可能拿著鼠標(biāo)和鍵盤對著一根頭發(fā)絲進(jìn)行操作吧?
當(dāng)然不會。首先,關(guān)系數(shù)據(jù)庫中含有的信息全部源于我們的生活,這就像餐桌上的飯菜全都源于大自然一樣。然而沒有人胃口好到可以咽下大自然的一切產(chǎn)物,比如火山灰和花崗巖。同樣的道理,廣義上的數(shù)據(jù)庫含有的信息過于豐富,以至于超出了我們的需要。那么在這種情況下,我們就只會從中挑選有記錄價(jià)值的信息。舉例來講,如果一家貨運(yùn)公司想要了解送貨員的配送效率,那么時(shí)間和路線的選擇才是關(guān)鍵。至于送貨員在送貨途中打了多少個(gè)噴嚏,發(fā)了幾句牢騷,以及踩了多少腳油門和剎車,這些都是無關(guān)緊要的次要信息。這就好比漁民們只會在太平洋捕撈有經(jīng)濟(jì)價(jià)值的沙丁魚和紅鯛魚一樣。
除了選擇性記錄,記錄形式也是關(guān)系數(shù)據(jù)庫的一大特點(diǎn)。事實(shí)上,我們會對采集到的目標(biāo)信息數(shù)據(jù)進(jìn)行整理和分類,然后將它們“塞”進(jìn)表(Table)中。沒錯,從這個(gè)角度來看,在關(guān)系數(shù)據(jù)庫中,表才是信息數(shù)據(jù)最直接的載體。也就是說,關(guān)系數(shù)據(jù)庫是通過表來間接存儲信息數(shù)據(jù)的。
不好意思,我有一個(gè)疑問。有那么多種記錄信息的方式可以選擇,比如文本、圖片、視頻,甚至錄音,為什么關(guān)系數(shù)據(jù)庫偏偏要選用表來裝載信息呢?
對于這個(gè)問題,只要你從側(cè)面了解了表記錄信息的優(yōu)點(diǎn),自然就會清楚其中的原因。現(xiàn)在請大家來觀察這樣一張簡易表。

這張表看起來就像一張結(jié)構(gòu)化的清單,它的顯示布局就如同一張網(wǎng):垂直分布的是列,水平分布的是行。
描述得非常貼切!用“表”這張網(wǎng)來捕撈數(shù)據(jù)的過程就是對廣義數(shù)據(jù)庫中的目標(biāo)信息做表格化處理的過程。正如大家所見,列在縱向體現(xiàn)一組數(shù)據(jù)的分類歸屬,行在橫向呈現(xiàn)一組數(shù)據(jù)的對應(yīng)關(guān)系。事實(shí)上,正是由于具有分門別類記錄信息的特點(diǎn)和優(yōu)點(diǎn),表才成了關(guān)系數(shù)據(jù)庫中信息載體的不二選擇。
正是這樣。一方面,表可以讓我們獲得整潔的顯示效果,另一方面,因?yàn)楸淼慕Y(jié)構(gòu)固定且單一,所以它為后續(xù)的數(shù)據(jù)調(diào)用和信息維護(hù)都提供了很大的便利。現(xiàn)在我們只需將這張表引入一個(gè)直角坐標(biāo)系,大家就能清楚地感受到這一點(diǎn)。

這樣一來,表中的每一項(xiàng)數(shù)據(jù)(單元格)都能通過橫、縱坐標(biāo)信息進(jìn)行定位。例如“楊曼楨”就是(姓名,101),“C班”就是(班級,103)。事實(shí)上,大家在日后的實(shí)際操作中,無論是想要調(diào)取表中的數(shù)據(jù),還是準(zhǔn)備對表中的數(shù)據(jù)進(jìn)行修改或者刪除,都能通過類似的方式實(shí)現(xiàn),也就是將目標(biāo)數(shù)據(jù)對應(yīng)的橫、縱坐標(biāo)當(dāng)作查詢條件,并將其嵌入固定的SQL語句。不妨舉幾個(gè)簡單的小例子進(jìn)行說明。
1.如果想要查看學(xué)生表中所有學(xué)生的姓名信息,那么對應(yīng)的SQL語句為:

2.如果想要查看學(xué)號為102的、名叫何世鈞的學(xué)生對應(yīng)的一整行信息,對應(yīng)的SQL語句可以是:

也可以是:

3.如果想要單獨(dú)查看何世鈞對應(yīng)的班級,那么班級就將成為一項(xiàng)追加條件被嵌入上述語句:

啊,原來就是這么簡單的事呀!將已知信息變成查詢條件,并將其嵌入SQL語句告知數(shù)據(jù)庫,我們就能得到想要的結(jié)果了。
對比來看,如果記錄信息的載體換成圖片或者文本,那么當(dāng)我們準(zhǔn)備從中調(diào)取數(shù)據(jù)時(shí),相應(yīng)的指令可能就不太容易用簡單且固定的語句進(jìn)行描述了。我發(fā)現(xiàn)了,表的結(jié)構(gòu)真的讓它很適合擔(dān)當(dāng)此位!不過話說回來,既然表是信息數(shù)據(jù)最直接的載體,各類信息數(shù)據(jù)都是存儲在表中的,那么為什么不直接稱“表”為“數(shù)據(jù)庫”呢?
這是一個(gè)好問題!我也有一個(gè)類似的問題要請教你。請問,詹姆士,既然地球才是我們?nèi)祟愘囈陨娴募覉@,那為什么不說我們處在地球系,而要說我們處在太陽系呢?
哦?這是因?yàn)榈厍蚴菍儆谔栂档难剑〕说厍颍栂抵羞€有其他7大行星在圍繞太陽運(yùn)轉(zhuǎn):水星、金星、火星、木星、土星、天王星和海王星,而冥王星在2006年被重新劃為矮行星,我想我應(yīng)該沒有記錯……
當(dāng)然正確!我們都知道,包括地球在內(nèi)的8大行星都擁有屬于自己的運(yùn)行軌道,這一方面是因?yàn)樗鼈兏髯远寂c太陽之間存在萬有引力(主要原因,太陽質(zhì)量占整個(gè)太陽系總質(zhì)量的98%),而另一方面也與它們彼此之間存在萬有引力有關(guān)。同樣的情況也適用于此。在日常操作中,為了用表來完整地記錄某一事件產(chǎn)生的信息數(shù)據(jù),我們可能要創(chuàng)建多張表才能滿足記錄需要。也就是說,如果我們將某一事件視為太陽,那么圍繞這個(gè)中心主題而運(yùn)轉(zhuǎn)的表往往不唯一。另一方面,也正是因?yàn)楦鲝埍碓诤狭τ涗涍@一事件產(chǎn)生的信息數(shù)據(jù),所以它們彼此之間存在關(guān)聯(lián),這就好比8大行星之間也存在萬有引力一樣。
我想我明白了,這是因?yàn)楦鲝埍硪残枰粋€(gè)共同的載體,這個(gè)載體就是關(guān)系數(shù)據(jù)庫。不過抱歉,我還想知道為什么勞倫斯表示,往往要創(chuàng)建多張表才能滿足記錄需要?難道這是因?yàn)閱螐埍淼拇鎯臻g不夠嗎?
同樣地,要想回答這個(gè)問題,我們還是先請大家來觀察一張表。

我們對學(xué)生表中的數(shù)據(jù)進(jìn)行了擴(kuò)充,進(jìn)而讓它顯示出了每位學(xué)生對應(yīng)的學(xué)科和成績。大家可以看到,由于每一位學(xué)生要學(xué)習(xí)的科目都不止一個(gè),所以就出現(xiàn)了一對多的情況,以至于表中出現(xiàn)了大量的重復(fù)數(shù)據(jù)。
大家可以看到,如果將某一事件產(chǎn)生的所有信息數(shù)據(jù)都硬塞進(jìn)一張表中,那么這張表在體積和呈現(xiàn)效果上都不會太理想。事實(shí)上,在日常操作中,如果我們想全面地記錄某一事件產(chǎn)生的信息數(shù)據(jù),往往需要創(chuàng)建多張表。原因是單張表一般難以處理好大量數(shù)據(jù)間的對應(yīng)關(guān)系,以至于影響我們的使用和查看。因此,我們就需要對數(shù)據(jù)進(jìn)行合理的拆分,將它們填充到不同的表中,就像這樣——

啊,我瞧見了。這里又單獨(dú)創(chuàng)建了一張表,它專門用來容納學(xué)生們的考試成績。我想我可以理解其中的奧妙——不要把所有的雞蛋都放進(jìn)同一個(gè)籃子。
因?yàn)閿?shù)據(jù)的記錄往往會隨著事件的發(fā)展而不斷增加,這不僅包括對已有信息的擴(kuò)充,還包括增加新的信息類別。想象一下,學(xué)校的急性子校監(jiān)在一開始認(rèn)為學(xué)生表中只需要體現(xiàn)姓名、性別及班級等基礎(chǔ)信息就可以,然而當(dāng)他將學(xué)生表制作完成以后,校長卻表示還要額外記錄學(xué)生們的學(xué)習(xí)科目和考試成績。沒錯,在這種情況下,如果校監(jiān)想將這些信息填充進(jìn)原有的學(xué)生表中,那么他的工作量將會很大,因?yàn)檎麖埍淼慕Y(jié)構(gòu)會發(fā)生變化,而且他還得將新信息一一錄入其中,并附帶著讓舊信息重復(fù)出現(xiàn)。可如果他另起一張表來單獨(dú)記錄學(xué)科和成績的話,那就是另外一回事了。毫無疑問,由于原學(xué)生表的結(jié)構(gòu)和數(shù)據(jù)不會發(fā)生變化,所以校監(jiān)的工作量也會大大降低。在實(shí)際操作中,我們也會遇到類似的情況。
正是如此,理解得非常到位。要知道,學(xué)習(xí)與實(shí)際運(yùn)用是兩碼事。在學(xué)習(xí)階段,由于大家操作的對象都是編排完善的表,而且這些表中的數(shù)據(jù)是為了掌握技能而設(shè)計(jì)的,因此同學(xué)們會認(rèn)為這一切都是理所當(dāng)然的。然而,在實(shí)際操作中并非如此,因?yàn)楸砗蛿?shù)據(jù)要客觀體現(xiàn)事件的真實(shí)發(fā)展與變化,所以對表的設(shè)計(jì)及對數(shù)據(jù)的編排要盡可能地方便日常使用和維護(hù)。
通過以上的討論,相信大家就會知道:在有些情況下,會創(chuàng)建多張表來共同記錄數(shù)據(jù)信息,它們各司其職但又彼此關(guān)聯(lián),因此它們又被稱為關(guān)聯(lián)表。如果我們把一個(gè)數(shù)據(jù)庫比作一家公司,那么關(guān)聯(lián)表就是這家公司的各個(gè)部門。雖然具體分工不同,但它們都是為了公司的發(fā)展和壯大而存在的。
事實(shí)上,理解關(guān)系數(shù)據(jù)庫的重點(diǎn)在于理解“關(guān)系”一詞。這種關(guān)系主要是指對應(yīng)關(guān)系。例如,獅子屬于貓科,斑馬屬于馬科,而海豚屬于海豚科,但它們都屬于哺乳綱。如果我們要把這些信息用表記錄下來,那么在橫向(行)上就需要對應(yīng)準(zhǔn)確。

除此以外,如果動物考察專家準(zhǔn)備另起一張表,用來單獨(dú)記錄這3種動物的飲食習(xí)慣。毫無疑問,兩張表含有的數(shù)據(jù)之間同樣要遵循準(zhǔn)確的對應(yīng)關(guān)系。

不錯,否則就可能出現(xiàn)張冠李戴的情況——獅子莫名其妙地在用鋒利的牙齒啃食青草;斑馬憋足了氣潛入水中圍捕沙丁魚;而海豚卻奔向草原追著瞪羚到處亂竄。
其實(shí)關(guān)系數(shù)據(jù)庫就類似于一個(gè)社交平臺,如果A表和B表是在合力記錄同一個(gè)事件,且它們彼此關(guān)聯(lián),那么A、B兩張表就能實(shí)現(xiàn)數(shù)據(jù)共享,從而提高信息的訪問效率。事實(shí)上,大家在日后的學(xué)習(xí)中會逐漸發(fā)現(xiàn),雖然表面上我們是在對表進(jìn)行操作,但歸根結(jié)底,我們操作的是表中的數(shù)據(jù)。
正是這樣!表中的數(shù)據(jù)信息就像我們手中的面團(tuán),它們可以被任意揉捏并進(jìn)行組合、拆分及變換,前提是遵循準(zhǔn)確的對應(yīng)關(guān)系。

這其實(shí)正是學(xué)習(xí)SQL的樂趣所在!因?yàn)槲覀兛梢愿鶕?jù)實(shí)際需要,對表(一張或多張)中的數(shù)據(jù)進(jìn)行重新編排,并組合出新的數(shù)據(jù)集。如果我們把一張表視為一幅畫卷,那么我們不僅可以將這幅畫卷分割,只展現(xiàn)出它的局部畫面,還可以將這幅畫卷與其他景色相宜的畫卷合并。沒錯,關(guān)聯(lián)表就是多張景色相宜的畫卷,因?yàn)樗鼈兪窃诤狭γ枥L一幅美景。
除了用表記錄信息數(shù)據(jù)這一大特點(diǎn),關(guān)系數(shù)據(jù)庫還有另一個(gè)特點(diǎn),那就是記錄的內(nèi)容大多為結(jié)構(gòu)化數(shù)據(jù),例如時(shí)間、姓名、地點(diǎn)等。而非結(jié)構(gòu)化數(shù)據(jù)就類似于一篇文章、一段錄音,或者一段影像。
糟糕!聊到這里我才意識到,我們之前的討論可能會給讀者們造成一種錯覺,讓他們誤以為SQL是直接與數(shù)據(jù)庫進(jìn)行交流的。關(guān)于這個(gè)問題,我們請MagicSQL來解釋一下吧!
MagicSQL:當(dāng)然不是這樣,親愛的一年級新生。簡單來講,其實(shí)在你們和數(shù)據(jù)庫之間,還存在一個(gè)類似于數(shù)據(jù)庫管理員的角色,這個(gè)角色就是關(guān)系數(shù)據(jù)庫管理系統(tǒng),簡稱RDBMS(Relational Database Management System)。RDBMS會接收并閱讀你們輸入的SQL語句,然后負(fù)責(zé)對數(shù)據(jù)庫執(zhí)行相應(yīng)的操作。
常用的RDBMS包括MySQL、SQL Server和Oracle Database等。不過在本書中,大家將要學(xué)習(xí)的是MySQL。它是一種開源的數(shù)據(jù)庫管理系統(tǒng),不僅易于安裝和使用,而且免費(fèi)。MySQL的Logo是一只可愛的藍(lán)色海豚,相信它會隔著太平洋給我們帶來好心情!
MagicSQL:沒錯,而我很高興在本書中扮演MySQL的角色來對你們這群一年級新生“指指點(diǎn)點(diǎn)”!
到目前為止,相信同學(xué)們對相關(guān)術(shù)語已經(jīng)有了一定的了解。概括來講,SQL是一門用來與RDB(關(guān)系數(shù)據(jù)庫)溝通的計(jì)算機(jī)語言,或者說是一個(gè)工具、一套書寫系統(tǒng)。可是SQL并不直接與RDB取得聯(lián)系,而是間接地通過RDBMS來完成訪問。RDBMS是關(guān)系數(shù)據(jù)庫管理系統(tǒng),它就像數(shù)據(jù)庫的小管家,會根據(jù)我們輸入的SQL語句對數(shù)據(jù)庫進(jìn)行相應(yīng)的操作,MySQL就是主流RDBMS中的一個(gè)。除此以外,由于RDB是通過裝載表來間接容納數(shù)據(jù)的,因此表才是數(shù)據(jù)最直接的載體,也是我們使用SQL的主要操作對象。
在本章中,我們感謝詹姆士、瑟琳娜、奎妮和勞倫斯的陪伴,他們將在后續(xù)的學(xué)習(xí)中一直陪伴在我們左右,為同學(xué)們解答疑惑和剖析原理。除此以外,可愛的湯姆和貝基也會加入這一隊(duì)伍。

湯姆

貝基
當(dāng)然,還有其他將會出現(xiàn)在故事情節(jié)里的伙伴們正等待著和大家見面。相信大家都能通過本書有所收獲,下面就讓我們開啟一段精彩紛呈的數(shù)據(jù)庫之旅吧!
- 程序員面試筆試寶典(第3版)
- Python機(jī)器學(xué)習(xí):數(shù)據(jù)分析與評分卡建模(微課版)
- 小程序?qū)崙?zhàn)視頻課:微信小程序開發(fā)全案精講
- Building a Game with Unity and Blender
- 架構(gòu)不再難(全5冊)
- Python程序設(shè)計(jì)(第3版)
- Visual Basic程序設(shè)計(jì)教程
- 64位匯編語言的編程藝術(shù)
- R的極客理想:工具篇
- Swift細(xì)致入門與最佳實(shí)踐
- Creating Mobile Apps with jQuery Mobile(Second Edition)
- SSM開發(fā)實(shí)戰(zhàn)教程(Spring+Spring MVC+MyBatis)
- Python爬蟲、數(shù)據(jù)分析與可視化:工具詳解與案例實(shí)戰(zhàn)
- OpenCV 3計(jì)算機(jī)視覺:Python語言實(shí)現(xiàn)(原書第2版)
- 大數(shù)據(jù)時(shí)代的企業(yè)升級之道(全3冊)