MySQL入門,mysql入門經典
本章主要介紹MySQL關聯式資料庫管理系統(Relational Database Management System,RDBMS)和MySQL所使用的結構化查詢語言 (SQL)(Structured Query Language,SQL)。其中,列出了應該掌握的基本術語和概念,描述了樣本所要用到的樣本資料庫sampdb
,並且提供了一個用於展示如何使用`MySQL建立資料庫並與之進行互動操作的教程。
如果你對資料庫系統還不甚瞭解,或者還不是很肯定自己是否需要學習它,甚至還不肯定是否需要使用它,那麼請從本章開始。如果你對MySQL和SQL還一無所知,並且需要一個入門指南,那麼也請從本章開始。對MySQL或其他資料庫系統已有一定經驗的讀者,則可以略讀一下本章的內容。不過,為了你能對全書所用那個資料庫sampdb
的目的和內容更熟悉,希望可以閱讀一下1.2節。
1.1 MySQL的用途
本節描述的是MySQL資料庫系統的用途,具體描述了“MySQL可以幹什麼”,以及“它如何才能給你提供協助”。如果你已經明白資料庫的用途(也許你正在思考某個問題,到這裡來只是想要找出“如何使用MySQL來解決它”的答案),那麼可以直接翻閱到1.2節。
資料庫系統在本質上是一種高效的管理大量列表資訊的辦法。這些資訊的來源可能多種多樣。它可能是研究資料、業務記錄、客戶需求、體育統計、銷售報告、個人資訊、人事檔案、bug報告或者學產生績。發揮資料庫系統強大作用的時機在於:想要組織和管理的資訊非常龐大或複雜,以至於所有記錄採用手工處理會變得異常繁重。對於每天處理上百萬條事務的大公司來說,資料庫是必不可少的。不過,即使只有一個人的小公司,也可能會維護很多的資訊,甚至多到需要用一個資料庫來管理它。假設有下面這些情況。
- 你在牙科診所工作,在那裡需要管理好患者的追蹤記錄:何人何時到訪、做了些什麼、下次預約資訊、保險資訊等。
- 你收集了多年的研究資料,為了發表而需要對它們進行分析。你要從大量未經處理資料裡提煉出摘要性的資訊,並取出選中的觀察子集進行詳細的統計分析。
- 你是一名教師,需要跟蹤學生的成績和考勤。每次考試結束,你都需要記錄每一個學生的分數。雖然將成績記錄到成績冊上很簡單,但之後的成績分析卻很繁瑣。你很想避免為了確定分數曲線,而對每次考試的分數進行排序;也真的很不願意在期末時為了確定最終成績,而把每個學生的成績都加起來。統計每個學生的考勤也很無趣。
- 你在某個組織機構(可能是一個專業團體、一個俱樂部、一個交響樂團或者一個健身俱樂部)擔任秘書一職,具體負責維護機構成員名錄的工作。你每年都要為所有成員產生一份列印名錄,名錄是用文文書處理軟體管理的,每當成員資料有變化時你都得編輯更新。你非常厭倦這種維護名錄的方式,因為它限制了你的發揮,主要表現在:很難對名錄條目按不同方式進行排序;無法輕鬆地選到每一條目的指定部分,如列出人名和電話號碼;更不能輕鬆地找出一組的成員,如需要儘快更新成員資格的成員。如果有辦法,就可以省卻每月通過翻閱這些條目來找出那些需要更新成員資格的成員的工作。你聽說過“無紙化辦公”,知道它是電子化記錄發展的結果,但你還未見過它所帶來的任何好處。雖然成員資格記錄是電子化的,但具有諷刺意味的是,它們記錄的形式除了能將名錄列印成紙質的以外,很難用作他途!
上面這些情境所涉及的資訊量有大有小。但它們都有一個共同的特點,即這些工作都可以通過手工來完成,但使用資料庫系統來管理會更高效。
在使用像MySQL這樣的資料庫系統時,你希望從中獲得哪些具體好處呢?這取決於你的特殊需要和需求,並且,如同上面樣本所示,具體的好處都各不相同。不過,在一般情況下,適合於用資料庫管理系統來處理任務的人群是那些不使用資料庫管理系統就要使用檔案櫃的人。事實上,資料庫系統就像一個內建了複雜檔案系統的巨大檔案櫃。與手工管理記錄的方式相比,以電子化方式來管理記錄存在有許多優勢。下面來看看前面描述過的那個牙科診所的情境。在用於管理患者記錄的文檔系統能力方面,MySQL可以為你帶來下面這些協助。
(1)縮短記錄歸檔時間。你不用在檔案櫃裡挨個拉抽屜找存放新記錄的地方。你只需將它提交給MySQL,MySQL會為你找到正確的存放這條記錄地方。
(2)縮短記錄檢索時間。當進行記錄尋找時,不必為了想要找到的記錄而親自動手去逐個搜尋。為了給那些最近一段時間沒來做檢查的患者發個提醒資訊,你可以讓MySQL來幫你找出這些記錄。當然,這與讓你告訴另一個人“請幫忙確認一下最近6個月哪些患者沒來參加檢查”的情況有所不同。事實上,你“念出的”是一段奇怪的“咒語”:
SELECT last_name, first_name, last_visit FROM patient WHERE last_visit < DATE_SUB(CURDATE(), INTERVAL 6 MONTH);
如果你以前從沒見過類似的內容,那麼它初看起來可能會相當嚇人。不過,它的效果卻是相當吸引人:你不用再花費一小時來翻看你的記錄,只需一兩秒即可得到想要的結果。不管怎樣,無需多久你就會習慣這種奇形怪狀的表達。等閱讀完本章,你便會明白它真正的含義。
(3)靈活的檢索排序。不用嚴格按照記錄儲存的順序(如按患者的名字排序)來檢索它們。MySQL可以按任何你想要的順序來提取記錄,如按名字、保險公司名字、上次就診時間等。
(4)靈活的輸出格式。在找到感興趣的記錄之後,你無需手動複製這些資訊,MySQL會為你產生一個列表。有時,你可能只是想列印這些資訊;有時,你可能會想在另一個程式裡使用它們。例如,在產生了最近逾期未能複診的患者名單後,你便可以把這些資料輸送到某個文文書處理軟體,讓它列印出你想要發送給那些患者的通知單。或許,你只是對如同“選中記錄統計”這樣的匯總資訊比較感興趣。你不用親自來統計記錄,MySQL會替你產生匯總資訊。
(5)多使用者同時訪問記錄。對於紙質記錄,如果有兩個人同時想要查看某個記錄,那麼其中一個人就必須等待另一個人將這個記錄歸還之後才能查看。而MySQL則可以允許這兩個人同時訪問這個記錄。
(6)記錄的遠端存取與電子傳輸。想用紙質記錄,就得親自跑到存放它們的地方,或者讓人將它們複印之後再發送給你。電子記錄則為遠端存取記錄或者電子傳輸記錄提供了可能。如果你的牙科集團設有許多分公司,那麼這些機構裡的人員便可以在當地訪問到你的資料。你完全不用再通過快遞來傳送這些副本。如果有人需要記錄,但卻又沒有與你一樣的資料庫軟體,那麼你可以選擇那些所需的記錄,將其中的內容通過網路發送給他。
如果你曾經用過資料庫管理系統,那麼肯定對剛才描述的種種好處深有體會,而且可能也在思索如何才能超越常規“代替檔案櫃”應用程式的限制。有許多組織機構將資料庫與網站結合在一起使用,這就是一種很好的方式。假設貴公司有一個商品庫存資料庫,每當顧客打電話過來詢問倉庫裡是否有貨、其價格是多少時,服務台的員工便會用到它。這是一種比較傳統的資料庫使用方式。不過,如果貴公司搭建一個供顧客訪問的網站,那麼就可以提供一項新的服務:建立一個搜尋網頁面,讓顧客可以查看條目,從而確定價格、可用性以及商品的庫存情況。如果支援線上訂購,那麼顧客甚至不用離開家門便能購買到你的產品。這讓顧客獲得了他們想要的資訊,而資料庫卻是根據提問自動搜尋商品庫存資訊來提供這些內容的。顧客立即獲得了所關心的資訊,不用一邊聽著惱人的錄音,一邊傻等著;也不用受限於服務台的上下班時間。並且,每當有一位顧客使用貴公司網站,就意味著會少一個電話,而這是需要由一個在服務台拿工資的人來處理的事情。如此看來,該網站或許可以為自己買單。
不過,你還可以更進一步地發揮資料庫的作用。基於Web的庫存搜尋請求,不僅可以把資訊提供給顧客,也能提供給貴公司。這些查詢可以讓你瞭解到顧客正在尋找哪些商品,而查詢結果則會讓你知道是否能夠滿足他們的需求。在某種程度上,如果你沒有顧客想要的東西,那麼你可能會錯失這筆生意。因此,記錄下庫存搜尋資訊非常有意義,通過它可以瞭解到:顧客正在找尋什麼商品,而你是否還有存貨。接著,就可以根據這些資訊來調整庫存,並向顧客提供更好的服務。
說了半天,那麼MySQL是如何工作的呢?找到答案的最好方式就是自己動手體驗一下。為此,我們需要有一個可以操作的資料庫。
1.2 樣本資料庫
本節將描述本書所使用的樣本資料庫。在你學習使用MySQL的過程中,可以用這個資料庫提供的樣本進行嘗試,該資料庫是針對之前描述過的兩種情況設計的。
- “機構秘書”情境。該機構有一些特點:其成員對美國歷史高度興趣(因沒有一個更好的名字,所以姑且稱其為“美史聯盟”)。所有成員都要定期繳納一定的費用以維持其成員資格。繳納的費用會用於一些正常開支,如出版通訊——《Chronicles of U.S. Past 》(美國編年史)。該聯盟運營著一個小型網站,但還未被充分開發出來,而你很想要扭轉這一局面。
- “成績考評”情境。你是一名教師,要負責考評期間的各種考試與測驗,記錄分數和打分。之後,你要確定出最終成績,並把它們隨同考勤情況一同上交到學校辦公室。
下面,我們進一步分析一下這兩個情境的需求。
- 你必須決定資料庫裡的哪些內容是你所想要的——即那些你要實現的目標。
- 你必須決定需要將哪些內容放入資料庫——即你想要跟蹤的資料是什麼。
在考慮“將什麼放入資料庫”之前考慮“要從資料庫裡獲得什麼樣的內容”,這似乎有些本末倒置。畢竟,大家都是這麼認為的:要先輸入資料,然後才能檢索它。不過,你使用資料庫的方式取決於你的目標是什麼。而且,與想要放入資料庫的內容相比,想要從資料庫檢索的內容則與那些目標的關係更加密切。只有在計劃今後使用這些資訊之後,你才會想要花費時間和精力把它們放入資料庫。
1.2.1 美史聯盟項目
該項目的情境是:你是聯盟秘書,眼下正使用某個文文書處理文檔維護那份成員資格名單。對於像“產生列印名錄”這樣的事情,處理起來當然沒什麼問題。但是,當你想要獲得其他更多資訊時,就會受到限制。你還有幾個目標要實現。
- 你想要以不同格式輸出名錄,同時按照不同的應用程式來定製資訊。有一個目標是每年產生列印好的名錄——這是聯盟一直以來的一個需求,要繼續實施下去。你可能還會想到名錄資訊的其他用途,例如向出席聯盟年會的人員提供一份列印好的最新成員名單。這兩個應用程式涉及的資訊是不同的。列印名錄程式需要用到每個成員條目的所有內容。而年會程式則只需要提取出成員的姓名即可(使用文文書處理軟體無法輕鬆完成這項工作)。
- 你想要在名錄裡搜尋出滿足不同條件成員。例如,你想要知道近期有哪些成員需要更新成員資格。你還需要另一個搜尋相關的應用程式,用來維護每個成員各自的關鍵字列表。這些關鍵字描述了所有成員都特別感興趣的一些美國歷史時期,如南北戰爭(Civil War)、經濟大蕭條(Depression)、民權法案(civil right)、托馬斯·傑斐遜(Thomas Jefferson)總統的生平事迹。有時,有些成員會要求你為他們提供一份與其志趣相投的其他成員名單,而你也很願意滿足這些需求。
- 你想要將名錄發布到聯盟網站上去。這樣做能讓你和所有成員都受益。如果你能通過某些自動化的過程將名錄轉換為Web頁面,那麼名錄的線上版本將總能保持最新,而這是紙質形式無法做到的。如果線上名錄能支援搜尋功能,那麼成員們便能輕鬆地自行尋找資訊。例如,如果某成員想要知道其他還有誰對“南北戰爭”感興趣,那麼他便可以自行尋找,完全用不著等你幫他搜尋,而你也不用抽時間去處理這件事情。
資料庫不是世界上最令人興奮的工具,因此我不會鼓吹像“使用資料庫能激發人的創造性思維”這樣不切實際的話。不過,如果你不再把資訊看成是一種累贅(如同你在使用文文書處理文檔時所想的那樣),而是把它想成是可相對輕鬆處理的事情(如同你希望使用MySQL來處理一樣),那麼你自然會釋放出自己的潛能,找到更多新的使用這些資訊的方法。
- 如果資料庫中的資訊能夠以線上名錄的形式放到網站上去,那麼你也可以讓這些資訊以其他方式流轉。例如,讓成員能夠線上修改他們自己的資料,並更新到資料庫。這樣,你就不用自己負責所有的編輯工作,而且這也能讓名錄裡的資訊更加準確。
- 如果你把電子郵件地址也儲存到資料庫裡,那麼你就可以利用它們來給成員寄送電子郵件,提醒他們及時更新自己的資料。郵件內容可以顯示出成員的當前資料,請成員們進行檢查,並提示他們如何使用網站提供的功能完成必要的修改。
- 資料庫還可以在很多方面拓展聯盟網站的用途,而並不僅限於成員資格列表。聯盟通訊《Chronicles of U.S. Past》有一個兒童專欄,其中每一期都會包含一個曆史知識測驗。最近幾期的重點是美國總統的傳記。聯盟網站上也可以設定一個兒童專區,把那些測驗題目放在上面。或許這個專區還可以弄成互動的,比如將做過的測驗資訊放入資料庫,讓Web伺服器在資料庫裡查詢問題的答案,然後呈現給訪客。
好了!此時此刻,你所想到的資料庫應用數量可能讓你有些忘乎所以了。在稍息片刻之後,重新回到現實,你開始問一些比較實際的問題,例如:
當然,所有事情只想不做都會變得很容易,而這些想法對於具體實現根本不重要。不過,在讀完本書之後,你就能實現我們剛才羅列出來的所有需求。但是請記住,沒有必要一下子完成所有需求。要將整個工作分解成若干需求,一次只解決一個需求。
不,它不能,至少單靠它是不行。例如,MySQL沒有內建Web程式開發工具。不過,你可以將它與其他工具相結合,藉助它們來補充和擴充其功能。
我們將使用指令碼語言Perl和它的資料庫介面(Database Interface,DBI)模組來編寫訪問MySQL資料庫的指令碼程式。Perl語言有著強大的文本處理能力,它能以極其靈活的方式對資料庫的查詢結果進行處理,併產生各式各樣的輸出。例如,我們可以用Perl語言產生一份富文本格式(Rich Text Format,RTF)格式的成員名錄,該格式可供各種文文書處理軟體讀取;另外,還可以產生適用於Web瀏覽器的HTML格式的名錄。
我們還要用到另一種指令碼語言PHP。PHP語言特別適用於編寫Web應用程式,並且它也易與資料庫進行互動。有了它,你就能夠通過Web頁面來啟動MySQL查詢,然後產生新的包含資料庫查詢結果的頁面。有很多支援PHP語言的Web伺服器(其中包括世界上最流行的Web伺服器Apache),因此像“呈現一個搜尋表單,並顯示搜尋結果”這樣的事情,對它來說就是“小菜一碟”。
MySQL與這些工具可以很好地整合在一起,因此你可以自由地選擇組合方式,以便達到你心中設定的目標。別太相信那些一體化的套裝組件,它們通常都大肆鼓吹自己具有“整合”功能,但是它們只有彼此配合才能更好地發揮作用。
- 最後,還有一個很重要的問題:總計要花費多少錢?畢竟同盟預算是有限的。
答案可能令人難以置信,但實際上它可能不會有任何成本。如果你對資料庫系統有所瞭解,那麼你應該知道它們通常都很昂貴。相比之下,MySQL通常是可免費使用的。即便是在需要有支援人員和維護承諾保證的企業環境裡,將MySQL作為資料庫系統,其成本也是很低的。(想瞭解更多詳情,請訪問www.mysql.com。)我們將用到的其他工具(其中包括Perl、DBI、PHP和Apache)都是免費的。因此,綜合考慮一下,你完全能夠以相當低的成本組建一個有用的系統。
用於開發資料庫的作業系統則由你來選擇。幾乎所有我們將討論的軟體都能在UNIX(它指代了BSD UNIX、Linux、Mac OS X等)和Windows上運行。極少數的例外情況一般是UNIX或Windows特有的shell指令碼或批處理指令碼。
1.2.2 成績考評項目
現在一起來看另一個要使用樣本資料庫的情況。該項目的情境是:你是一名負責成績考評的教師。你想將成績處理工作,從使用成績冊的手工操作方式轉換成使用MySQL的電子錶示方式。在這種情況下,從資料庫擷取資訊的方式隱含在你目前使用成績冊的方式中。
- 對於每一次測驗或考試,你都要記錄分數。如果是考試,你還需要對分數進行排序,以便查看它們並確定每一個字母成績(包括A、B、C、D和F)所代表的界線。
- 在期末,你需要把計算出每一個學生的總分數,對這些總分數進行排序,並以此為基礎確定出成績。總分數可能需要加權計算,因為你可能需要讓考試比測驗的權重更大。
- 在期末,你還要向學校辦公室提供學生的考勤情況。
最終目標是要避免手動排序、避免手動匯總分數和考勤情況。換句話說,你希望MySQL可以對分數排序,並在期末完成所有與每個學生的總分和缺席次數相關的計算。為實現這些目標,你需要班裡學生的名單、每次考試和測驗的分數,以及全部學生的缺勤日期。
1.2.3 如何運用樣本資料庫
如果你對這裡的“美史聯盟”和“成績考評”兩個項目都不感興趣,那麼你可能會想“還有什麼情境一定適合你呢”。答案就是“無窮無盡”。其實,這兩個項目可以說明你用MySQL和與之相關的工具可以做什麼事情。稍微想象一下,你便能看到樣本資料庫查詢是如何應用於
你所要解決的那些特定問題的。假設你正好就在我前面提到的那個牙科診所裡工作。雖然在這本書裡不會看到很多與牙科學有關的查詢,但是會看到這裡所發現的很多查詢都可以應用到患者記錄維護、辦公記載等那些工作中。例如,“確定聯盟裡哪些成員需要更新他們的成員資格”與“確定最近哪些患者未來複診”這兩個任務便非常相似。它們都是基於日期的查詢,因此只要你學會了“成員資格更新”的查詢,那麼便可以將該技巧用於編寫“久未複診患者”的查詢,從而帶來更多的收穫。
1.3 基本資料庫術語
你可能已經注意到了,儘管這是一本關於資料庫的書籍,但到目前為止,你還未遇到過多少晦澀難懂的專業技術術語。事實上,儘管我們對如何使用樣本資料庫有過大致描述,但關於資料庫到底是什麼樣子,我卻隻字未提。可是,既然我們要設計資料庫,並實現它,那麼我們就不能再避而不談有關的術語了。這正是本節的主要內容。本節所描述的術語都是本書要用到的,因此希望大家能夠熟悉它們。慶幸的是,關聯式資料庫的許多概念都很簡單。人們之所以喜歡關聯式資料庫,很大程度上便是因為其基本概念都簡明易懂。
1.3.1 結構術語
在資料庫領域,MySQL被劃分為關聯式資料庫管理系統(RDBMS)。我們下面來拆解一下。
關聯式資料庫是如何把資料群組織到表裡的呢?又是如何把不同表的資訊關聯在一起的呢?下面來看一個例子。假設你在經營一個網站,它有一項橫幅廣告服務。你與多家想要刊登廣告的公司簽訂了合約,滿足它們想要在人們訪問你網站頁面時顯示其廣告的需要。每當有訪客點擊其中的某個頁面時,你就提供一個嵌有廣告的頁面發送給訪客瀏覽器,這樣你就能從刊登這條廣告的公司那裡獲得一點費用。這就是所謂的廣告“點擊”。為了表示這些資訊,你需要用到3個表(見圖1-1)。第1個company
表由這樣幾列構成:公司名稱、編號、地址和電話號碼。第2個ad
表的構成列有:廣告編號、擁有該廣告的那家公司的編號,以及每點擊一次的收費數目。第3個hit
表`需要記錄廣告點選量和廣告點選日期。
圖1-1 橫幅廣告的表
有些問題只用一個表便能回答。例如,想要知道與你簽訂了合約的公司有多少家,那麼你只需統計一下company
表共有多少行即可。同樣地,想要瞭解在某段指定的時間裡有多少點擊量,則只需檢查表hit
即可。其他有些問題則可能比較複雜,需要查詢多個表才能得到答案。例如,想要知道在7月14日那天Pickles公司(Pickles,Inc.)的每一條廣告分別被點擊了多少次,那麼就需要像下面那樣使用所有的3個表。
(1)在company
表裡尋找公司名稱(Pickles,Inc.),從而查出該公司的編號(14)。
(2)在ad
表裡,利用這個公司編號找出與之匹配的行,從而可以確定出所有相關廣告的編號。最後找到兩條廣告,即編號48和101。
(3)對於在ad
表裡匹配到的每一行,使用該行裡的廣告編號在hit
表裡找出日期介於給定日期範圍內的所有匹配行;然後,再統計這些匹配行的數量。最後查詢出的結果是:48號
廣告有3個匹配;101號
廣告有2個匹配。
這些聽起來好像很複雜!但這正是關聯式資料庫系統最擅長做的事情。這種複雜性只是表面現象,因為剛才描述的每一步驟都是一個簡單的匹配操作:將一個表的行值與另一個表的行值,通過匹配關聯起來。這種簡單的操作可以有多種變化,用於回答各式各樣的問題,如各家公司分別投放了多少個不同的廣告?哪家公司的廣告最受歡迎?每個廣告帶來的收益是多少?在當前結算期內,各家公司應該支付你多少廣告費?
有了之前講述的這些關聯式資料庫理論,你就能讀懂本書後續的內容了;我們不必瞭解“第三範式”(Third Normal Form)、“實體聯絡圖”(Entity-Relationship Diagram)等這些枯燥乏味的內容。(如果想瞭解它們,請閱讀C. J. Date或E. F. Codd的著作。)
1.3.2 查詢語言術語
為了與MySQL互動,需要使用一種名為SQL的語言。所有主流資料庫系統都支援SQL,但各個服務商的實現都各不相同。SQL支援許多不同的語句,可以讓你用非常有趣和實用的方式與資料庫進行互動。
與其他電腦語言一樣,初次接觸SQL的人往往會覺得它很奇怪。例如,在建立表時,你必須告訴MySQL該表的結構是什麼樣子的。很多人都會想到把表與圖表或圖片聯絡起來。但是MySQL不是這樣子的,因此在建立表時,你必須告知MySQL一些類似下面那樣的內容:
CREATE TABLE company ( company_name VARCHAR(30), company_num INT, address VARCHAR(30), phone VARCHAR(12) );
如果對SQL還不太熟悉,那麼可能會對這樣的語句心生畏懼。不過請放心,你不用成為程式員就能學會如何熟練地使用SQL。隨著對SQL的深入瞭解,你對CREATE TABLE
的看法也會悄然地發生變化——它不再是一組怪誕的表達,而是一種有助於資訊描述的強大工具。
1.3.3 MySQL的體繫結構術語
當使用MySQL的時候,你實際上至少會用到兩個程式,因為MySQL採用的是“用戶端/伺服器”體繫結構。有一個程式是MySQL伺服器,即mysqld。它運行在存放資料庫的那台機器上,主要負責監聽網路上的用戶端請求,並根據這些請求去訪問資料庫內容,然後向用戶端提供它們所查詢的資訊。另一個程式是MySQL用戶端,它主要負責串連到資料庫伺服器,並發起查詢,以便將自己想要的資訊告知伺服器。
MySQL的大部分發行版本都包括資料庫伺服器程式和用戶端程式。(在Linux下使用RPM包時,會有一個單獨的伺服器RPM包和用戶端RPM包,因此應該安裝兩種包。)請根據自己的實際情況使用合適的用戶端程式。最常用的用戶端程式是mysql,它是一個互動式用戶端程式,你可以用它來發起查詢並查看結果。另外還有兩個主要用於管理的用戶端程式,即mysqldump和mysqladmin。前者主要用來把表的內容匯出到檔案裡;後者主要用來檢查資料庫伺服器的工作狀態,以及執行一些資料庫管理相關的任務,如通知伺服器關閉。MySQL發行版本裡還包括一些其他的用戶端程式。此外,MySQL還提供了一個用戶端開發庫,如果它內建的標準用戶端程式無法滿足你的應用需求,你可以利用這個庫來編寫自己的程式。這個開發庫可以被C語言程式直接使用。如果你不習慣C語言,那麼也可以選擇適用於其他語言(如Perl、PHP、Python、Java和Ruby)的編程介面。
本書討論的用戶端程式都是基於命令列的。你也可以試試MySQL工作台(MySQL Workbench),這是一個基於圖形化使用者介面(Graphical User Interface,GUI)的工具,提供了即點即擊(point-
and-click)功能。關於此工具的更多資訊,請訪問http://www.mysql.com/products/
tools/。
MySQL的“用戶端/伺服器”體繫結構有以下幾個好處。
- 伺服器強制執行並發控制,可以防止兩個使用者同時修改同一條記錄。所有用戶端請求都要經過伺服器,因此伺服器會負責安排處理它們的先後順序。即使出現多個用戶端同時訪問同一個表的情況,它們也不用先找到對方進行協商。它們只需把自己的請求發往伺服器,然後由伺服器來決定執行這些請求的順序。
- 不是只有在資料庫所在的那台機器上才能登入。MySQL工作在網路環境裡,因此你可以在任意地方運行MySQL用戶端程式,它都能夠通過網路連接到伺服器。距離不是問題!你可以在世界的任何地方訪問伺服器。例如,你的伺服器位於澳大利亞,那麼就算你帶著膝上型電腦旅行到了冰島,你也仍然可以訪問自己的資料庫。這是否意味著任何人都能夠通過互連網看到你的資料呢?答案是“不能”。MySQL有一套靈活的安全機制,你可以設定只有得到授權的人才能訪問。此外,你還可以進一步限制這些人的操作。例如,財務部的Sally應該有查看和更新(修改)記錄的許可權;而服務台的Phil卻只應該有查看記錄的許可權。總之,你可以把這種存取權限控制細化到每一個人。如果你只想運行一個自屬的系統,那麼你完全可以把存取權限設定為只允許伺服器上的用戶端程式進行串連。
MySQL與mysql之間的差異
為避免混淆,我們使用MySQL指代完整的MySQL RDBMS,而mysql
指代特定用戶端程式的名字。雖然它們的發音相同,但我們通過字母大小寫和字型差異對它們進行了區分。
說到發音,MySQL被讀作“my-ess-queue-ell”。具體細節可以在MySQL參考手冊(MySQL Reference Manual)裡查閱到。此外,SQL的讀法有“sequel”和“ess-queue-ell”兩種,具體是哪種由讀它的人決定。本書假定SQL的發音為“ess-queue-ell”。
1.4 MySQL教程
現在你已具備了所有的預備知識。下面來實際操作一下MySQL。
本節提供了一個帶有多個樣本的教程,其目的在於協助你熟悉MySQL。主要內容包括建立一個樣本資料庫和多個表,通過對這些表裡的資訊執行插入、檢索、刪除和修改操作,練習與樣本資料庫的互動。在此過程中,你將學會以下內容。
- 瞭解MySQL所能理解的SQL基礎知識。(MySQL與其他RDBMS所使用的SQL有所不同,因此你最好也能快速探索一下本節的內容,從而確認一下MySQL的SQL實現與你熟悉的版本是否存在差異。)
- 瞭解MySQL內建的標準用戶端程式是如何與MySQL伺服器進行通訊的。前一節講過,MySQL採用的是“用戶端/伺服器”體繫結構。其中,伺服器運行在資料庫所在的機器上;而用戶端則是通過網路連接到伺服器。本教程主要依賴於用戶端程式
mysql
,它首先讀取你輸入的SQL查詢語句,把它們發送到伺服器執行,然後把執行結果顯示在你面前。用戶端mysql
可以在MySQL所支援的所有平台上運行,並且提供了與伺服器進行互動的最直接的方式。不過根據需要,有些樣本會使用mysqlimport
或者mysqlshow
來代替。
本書將樣本資料庫命名為sampdb
。如果在你的系統上已經有人佔用了這個名字,或者你的MySQL管理員為你分配了另一個名字,那麼你需要換一個名字。不管是何種情況,你都需要把本書樣本中的sampdb
替換為你實際使用的資料庫名稱。
即使你的系統裡有多個使用者,且他們都各自擁有自己的樣本資料庫,本節所有樣本裡的表名也都可以直接使用。在MySQL裡,只要每個人都用自己的資料庫,那麼大家完全可以使用相同的表名,不會有任何問題。MySQL將表限制在各自的資料庫裡,防止了相互幹擾。
1.4.1 擷取樣本資料庫發行包
本教程在好幾個地方都要用到“樣本資料庫發行包”( 也稱作“sampdb
資料庫的發行版”)。該發行包裡包含了許多用來安裝樣本資料庫的查詢語句和資料。發行包的擷取辦法和安裝步驟可以在附錄A裡查到。在發行包解壓之後,它會自動建立一個名為sampdb的子目錄,其中包含了你所需要的許多檔案。順便提個建議:每次你操作資料庫裡的樣本時,最好都能切換到一個新的目錄。
如果想要在任何目錄裡都可以方便地運行MySQL程式,那麼你最好能把位於MySQL目錄下包含著這些程式的bin
目錄,添加到命令直譯器的搜尋路徑裡。具體操作方法是,參考本書A.3.3節,把該目錄的路徑名稱添加到環境變數PATH裡
。
1.4.2 基本配置要求
為練習本教程裡的各個樣本,除獲得樣本資料庫發行包外,還必須滿足以下幾項基本要求。
- 必須安裝MySQL軟體。
- 要有一個能夠串連資料庫伺服器的MySQL帳號。
- 要有一個用來操作的資料庫。
所需的軟體包括MySQL用戶端和MySQL伺服器。用戶端程式必須安裝在你自己要用的機器裡。伺服器可以選擇安裝在你的機器上,這點不強求。只要你有許可權串連它,那麼伺服器可以位於任何地方。如果你的網際網路服務提供者(Internet Service Provider,ISP)提供了MySQL服務,那麼也可以申請使用它。想要自己獲得和安裝MySQL,請參考附錄A。
除了MySQL軟體,還必須要有一個MySQL賬戶,這樣才能串連到伺服器,並建立樣本資料庫及其表。(如果你已有MySQL賬戶,則可以直接用它。不過,建議你另外建立一個專用於本書學習的賬戶。)
此時此刻,我們遇到了一個“是先有雞,還是先有蛋”的難題:為了建立一個用於串連伺服器的MySQL賬戶,你必須要先串連到該伺服器。通常情況下,你需要在運行MySQL伺服器的主機上,以root
使用者身份登入,然後執行CREATE USER語句
和GRANT
語句來建立新的MySQL賬戶,並為其分配資料庫許可權。如果你是在自己的機器上安裝了MySQL伺服器,並且正在運行,那麼你可以像下面那樣用root
身份串連伺服器,然後建立一個新的樣本資料庫管理員賬戶,其使用者名稱為sampadm
,密碼為secret
。你也可以把其中的名字和密碼更改成自己想用的,但在本書後面用到它們的地方也要做相應的修改。
% **mysql -p -u root **Enter password: ****** mysql> **CREATE USER 'sampadm'@'localhost' IDENTIFIED BY 'secret'; **Query OK, 0 rows affected (0.04 sec) mysql> **GRANT ALL ON sampdb.* TO 'sampadm'@'localhost'; **Query OK, 0 rows affected (0.01 sec)
命令mysql
有一個選項-p
,它能讓mysql
提示輸入root
使用者的MySQL密碼。如上例所示,輸入的密碼會被顯示為一串星號,即**。這裡假設你已經為MySQL的root
使用者佈建了密碼。如果你還未設定,則請在Enter Password
:提示出現後直接按斷行符號(Enter)鍵。不過,如果root
使用者無密碼,那麼這是個很大的安全性漏洞,你應該儘快給它設定一個。想要瞭解