網(wǎng)絡(luò)數(shù)據(jù)庫教案_第1頁
網(wǎng)絡(luò)數(shù)據(jù)庫教案_第2頁
網(wǎng)絡(luò)數(shù)據(jù)庫教案_第3頁
網(wǎng)絡(luò)數(shù)據(jù)庫教案_第4頁
網(wǎng)絡(luò)數(shù)據(jù)庫教案_第5頁
已閱讀5頁,還剩81頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

PAGEPAGE14第一講:MySQL數(shù)據(jù)庫管理系統(tǒng)概述MySQL是最流行的開放源碼SQL數(shù)據(jù)庫管理系統(tǒng),它是由MySQLAB公司開發(fā)、發(fā)布并支持的。MySQLAB是由多名MySQL開發(fā)人創(chuàng)辦的一家商業(yè)公司。它是一家第二代開放源碼公司,結(jié)合了開放源碼價值取向、方法和成功的商業(yè)模型。在MySQL的網(wǎng)站(/)上,給出了關(guān)于MySQL和MySQL的最新信息。MySQL是一種數(shù)據(jù)庫管理系統(tǒng)。數(shù)據(jù)庫是數(shù)據(jù)的結(jié)構(gòu)化集合。它可以是任何東西,從簡單的購物清單到畫展,或企業(yè)網(wǎng)絡(luò)中的海量信息。要想將數(shù)據(jù)添加到數(shù)據(jù)庫,或訪問、處理計(jì)算機(jī)數(shù)據(jù)庫中保存的數(shù)據(jù),需要使用數(shù)據(jù)庫管理系統(tǒng),如MySQL服務(wù)器。計(jì)算機(jī)是處理大量數(shù)據(jù)的理想工具,因此,數(shù)據(jù)庫管理系統(tǒng)在計(jì)算方面扮演著關(guān)鍵的中心角色,或是作為獨(dú)立的實(shí)用工具,或是作為其他應(yīng)用程序的組成部分。MySQL是一種關(guān)聯(lián)數(shù)據(jù)庫管理系統(tǒng)。關(guān)聯(lián)數(shù)據(jù)庫將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個大的倉庫內(nèi)。這樣就增加了速度并提高了靈活性。MySQL的SQL指得是“結(jié)構(gòu)化查詢語言”。SQL是用于訪問數(shù)據(jù)庫的最常用標(biāo)準(zhǔn)化語言,它是由ANSI/ISOSQL標(biāo)準(zhǔn)定義的。SQL標(biāo)準(zhǔn)自1986年以來不斷演化發(fā)展,有數(shù)種版本。在本手冊中,“SQL-92”指得是1992年發(fā)布的標(biāo)準(zhǔn),“SQL:1999”指得是1999年發(fā)布的標(biāo)準(zhǔn),“SQL:2003”指得是標(biāo)準(zhǔn)的當(dāng)前版本。我們采用術(shù)語“SQL標(biāo)準(zhǔn)”標(biāo)示SQL標(biāo)準(zhǔn)的當(dāng)前版本。MySQL軟件是一種開放源碼軟件?!伴_放源碼”意味著任何人都能使用和改變軟件。任何人都能從Internet下載MySQL軟件,而無需支付任何費(fèi)用。如果愿意,你可以研究源碼并進(jìn)行恰當(dāng)?shù)母?,以滿足你自己的需求。MySQL軟件采用了GPL(GNU通用公共許可證),/company/legal/licensing/)。MySQL數(shù)據(jù)庫服務(wù)器具有快速、可靠和易于使用的特點(diǎn)。如果它正是你所尋找的,不妨一試。MySQL服務(wù)器還有一套實(shí)用的特性集合,這些特性是通過與我們用戶的密切合作而開發(fā)的。在我們的基準(zhǔn)測試主頁上,給出了MySQL服務(wù)器和其他數(shù)據(jù)庫管理器的比較結(jié)果。MySQL服務(wù)器最初是為處理大型數(shù)據(jù)庫而開發(fā)的,與已有的解決方案相比,它的速度更快,多年以來,它已成功用于眾多要求很高的生產(chǎn)環(huán)境。盡管MySQL始終在不斷發(fā)展,但目前MySQL服務(wù)器已能提供豐富和有用的功能。它具有良好的連通性、速度和安全性,這使的MySQL十分適合于訪問Internet上的數(shù)據(jù)庫。MySQL服務(wù)器工作在客戶端/服務(wù)器模式下,或嵌入式系統(tǒng)中。MySQL數(shù)據(jù)庫軟件是一種客戶端/服務(wù)器系統(tǒng),由支持不同后端的1個多線程SQL服務(wù)器,數(shù)種不同的客戶端程序和庫,眾多管理工具和廣泛的應(yīng)用編程接口API組成。我們還能以嵌入式多線程庫的形式提供MySQL服務(wù)器,你可以將其鏈接到你的應(yīng)用程序,從而獲得更小、更快、和更易管理的產(chǎn)品。有大量可用的共享MySQL軟件。你所喜歡的應(yīng)用程序和語言均支持MySQL數(shù)據(jù)庫服務(wù)器,這種情況十分可能?!癕ySQL”的正式發(fā)音是“MyEssQueEll”(而不是“mysequel”),但我們并不介意你的發(fā)音方式是“mysequel”或其他當(dāng)?shù)胤绞健R籑ySQL的主要特征o

使用C和C++編寫o

用眾多不同的編譯器進(jìn)行了測試o

能夠工作在眾多不同的平臺上。。o

使用GNUAutomake、Autoconf和Libtool進(jìn)行移植。o

提供了用于C、C++、Eiffel、Java、Perl、PHP、Python、Ruby和Tcl的API。o

采用核心線程的完全多線程如果有多個CPU,它能方便地使用這些CPU。o

提供了事務(wù)性和非事務(wù)性存儲引擎。o

使用了極快的“B樹”磁盤表(MyISAM)和索引壓縮。o

添加另一個存儲引擎相對簡單。如果打算為內(nèi)部數(shù)據(jù)庫添加一個SQL接口,該特性十分有用。o

極快的基于線程的內(nèi)存分配系統(tǒng)。o

通過使用優(yōu)化的“單掃描多連接”,能實(shí)現(xiàn)極快的連接。o

存儲器中的哈希表用作臨時表。o

SQL函數(shù)是使用高度優(yōu)化的類庫實(shí)現(xiàn)的,運(yùn)行很快。通常,在完成查詢初始化后,不存在存儲器分配。o

采用Purify(商業(yè)內(nèi)存溢出檢測器)以及GPL工具Valgrind(/~sewardj/)測試了MySQL代碼。o

服務(wù)器可作為單獨(dú)程序運(yùn)行在客戶端/服務(wù)器聯(lián)網(wǎng)環(huán)境下。它也可作為庫提供,可嵌入(鏈接)到獨(dú)立的應(yīng)用程序中。這類應(yīng)用程序可單獨(dú)使用,也能在網(wǎng)絡(luò)環(huán)境下使用。二MySQL與標(biāo)準(zhǔn)SQL的差別(1)在某些情況下,定義表或更改其結(jié)構(gòu)時,將CHAR列轉(zhuǎn)換為VARCHAR列。(2)刪除表時,不自動取消關(guān)于表的權(quán)限。必須明確發(fā)出REVOKE語句,以撤銷針對表的權(quán)限。(3)CAST()函數(shù)不支持對REAL或BIGINT的拋棄。(4)標(biāo)準(zhǔn)SQL要求,SELECT語句中的HAVING子句能夠引用GROUPBY子句中的列。在MySQL5.0.2之前,不能完成該功能?!璏ySQL4.1支持子查詢和導(dǎo)出表?!白硬樵儭敝傅氖乔短自诹硪徽Z句中的SELECT語句?!皩?dǎo)出表”(未命名視圖)是另一語句的FROM子句中的子查詢。三安裝MySQL在安裝MySQL前,你應(yīng)該:(1)確定是否MySQL將運(yùn)行在你的平臺上。(2)選擇安裝的分發(fā)版。(3)下載分發(fā)版并驗(yàn)證其完整性。1選擇要安裝的版本首先要作出決策,你是否想要使用最新的開發(fā)版本或最終的穩(wěn)定版本。在MySQL開發(fā)過程中,同時存在多個發(fā)布系列,每個發(fā)布處在成熟度的不同階段:(1)MySQL5.2是最新開發(fā)的發(fā)布系列,是將執(zhí)行新功能的系列。不久的將來可以使用Alpha發(fā)行,以便感興趣的用戶進(jìn)行廣泛的測試。(2)MySQL5.1是當(dāng)前穩(wěn)定(產(chǎn)品質(zhì)量)發(fā)布系列。只針對漏洞修復(fù)重新發(fā)布;沒有增加會影響穩(wěn)定性的新功能。(3)MySQL5.0是前一穩(wěn)定(產(chǎn)品質(zhì)量)發(fā)布系列。只針對嚴(yán)重漏洞修復(fù)和安全修復(fù)重新發(fā)布;沒有增加會影響該系列的重要功能。(4)MySQL4.0和3.23是舊的穩(wěn)定(產(chǎn)品質(zhì)量)發(fā)布系列。該版本不再使用,新的發(fā)布只用來修復(fù)特別嚴(yán)重的漏洞(以前的安全問題)。要想在Windows中運(yùn)行MySQL,你需要:(1)32位Windows操作系統(tǒng),例如9x、Me、NT、2000、XP或WindowsServer2003。(2)基于WindowsNT的操作系統(tǒng)(NT,2000,XP,2003),將MySQL服務(wù)器做為服務(wù)來運(yùn)行。強(qiáng)烈建議使用基于WindowsNT的操作系統(tǒng)。Windows版本MySQL二進(jìn)制分發(fā)版,可以從http:///下載/下載。在Windows中安裝MySQL時,有3種MySQL5.1安裝軟件包可供選擇:(1)基本安裝:該安裝軟件包的文件名類似于mysql-essential-5.1.2-alpha-win32.msi,包含在Windows中安裝MySQL所需要的最少的文件,包括配置向?qū)?。該安裝軟件包不包括可選組件,例如嵌入式服務(wù)器和基準(zhǔn)套件。(2)完全安裝:該安裝軟件包的文件名類似于mysql-5.1.2-alpha-win32.zip,包含在Windows中安裝MySQL所需要的全部文件,包括配置向?qū)АT摪惭b軟件包包括可選組件,例如嵌入式服務(wù)器和基準(zhǔn)套件。(3)非自動安裝文件:該安裝軟件包的文件名類似于mysql-noinstall-5.1.2-alpha-win32.zip,包含完整安裝包中的全部文件,只是不包括配置向?qū)АT摪惭b軟件包不包括自動安裝器,必須手動安裝和配置。對于大多數(shù)用戶,建議選擇基本安裝。2配置服務(wù)器可以選擇兩種配置類型:DetailedConfiguration(詳細(xì)配置)和StandardConfiguration(標(biāo)準(zhǔn)配置)。StandardConfiguration(標(biāo)準(zhǔn)配置)選項(xiàng)適合想要快速啟動MySQL而不必考慮服務(wù)器配置的新用戶。詳細(xì)配置選項(xiàng)適合想要更加細(xì)粒度控制服務(wù)器配置的高級用戶。如果你是MySQL的新手,需要配置為單用戶開發(fā)機(jī)的服務(wù)器,StandardConfiguration(標(biāo)準(zhǔn)配置)應(yīng)當(dāng)適合你的需求。選擇StandardConfiguration(標(biāo)準(zhǔn)配置)選項(xiàng),則MySQLConfigurationWizard(配置向?qū)В┳詣釉O(shè)置所有配置選項(xiàng),但不包括服務(wù)選項(xiàng)和安全選項(xiàng)。StandardConfiguration(標(biāo)準(zhǔn)配置)設(shè)置選項(xiàng)可能與安裝MySQL的系統(tǒng)不兼容。如果系統(tǒng)上已經(jīng)安裝了MySQL和你想要配置的安裝,建議選擇詳細(xì)配置??梢赃x擇3種服務(wù)器類型,選擇哪種服務(wù)器將影響到MySQLConfigurationWizard(配置向?qū)В?nèi)存、硬盤和過程或使用的決策。(1)DeveloperMachine(開發(fā)機(jī)器):該選項(xiàng)代表典型個人用桌面工作站。假定機(jī)器上運(yùn)行著多個桌面應(yīng)用程序。將MySQL服務(wù)器配置成使用最少的系統(tǒng)資源。(2)ServerMachine(服務(wù)器):該選項(xiàng)代表服務(wù)器,MySQL服務(wù)器可以同其它應(yīng)用程序一起運(yùn)行,例如FTP、email和web服務(wù)器。MySQL服務(wù)器配置成使用適當(dāng)比例的系統(tǒng)資源。(3)DedicatedMySQLServerMachine(專用MySQL服務(wù)器):該選項(xiàng)代表只運(yùn)行MySQL服務(wù)的服務(wù)器。假定運(yùn)行沒有運(yùn)行其它應(yīng)用程序。MySQL服務(wù)器配置成使用所有可用系統(tǒng)資源。數(shù)據(jù)庫使用情況對話框通過DatabaseUsage(數(shù)據(jù)庫使用)對話框,你可以指出創(chuàng)建MySQL表時使用的表處理器。通過該選項(xiàng),你可以選擇是否使用InnoDB儲存引擎,以及InnoDB占用多大比例的服務(wù)器資源。(1)MultifunctionalDatabase(多功能數(shù)據(jù)庫):選擇該選項(xiàng),則同時使用InnoDB和MyISAM儲存引擎,并在兩個引擎之間平均分配資源。建議經(jīng)常使用兩個儲存引擎的用戶選擇該選項(xiàng)。(2)TransactionalDatabaseOnly(只是事務(wù)處理數(shù)據(jù)庫):該選項(xiàng)同時使用InnoDB和MyISAM儲存引擎,但是將大多數(shù)服務(wù)器資源指派給InnoDB儲存引擎。建議主要使用InnoDB只偶爾使用MyISAM的用戶選擇該選項(xiàng)。(3)Non-TransactionalDatabaseOnly(只是非事務(wù)處理數(shù)據(jù)庫):該選項(xiàng)完全禁用InnoDB儲存引擎,將所有服務(wù)器資源指派給MyISAM儲存引擎。建議不使用InnoDB的用戶選擇該選項(xiàng)。安全選項(xiàng)對話框強(qiáng)烈建議為你的MySQL服務(wù)器設(shè)置一個root密碼,默認(rèn)情況MySQLConfigurationWizard(配置向?qū)В┮竽阍O(shè)置一個root密碼。如果你不想設(shè)置root密碼,不選中ModifySecuritySettings(修改安全設(shè)定值)選項(xiàng)旁邊的選擇框。要想設(shè)置root密碼,在Newrootpassword(輸入新密碼)和Confirm(確認(rèn))兩個框內(nèi)輸入期望的密碼。如果重新配置已有的服務(wù)器,你還需要Currentrootpassword(當(dāng)前root密碼)框內(nèi)輸入已有的root密碼。要想防止通過網(wǎng)絡(luò)以root登錄,選中Rootmayonlyconnectfromlocalhost(只允許從本機(jī)登陸連接root)選項(xiàng)旁邊的框。這樣可以提高root賬戶的安全。要想創(chuàng)建一個匿名用戶賬戶,選中CreateAnAnonymousAccount(創(chuàng)建匿名賬戶)選項(xiàng)旁邊的框。創(chuàng)建匿名賬戶會降低服務(wù)器的安全,并造成登錄和許可困難。因此不建議。3首次啟動服務(wù)器在控制臺窗口(或“DOSwindow”)中,最好根據(jù)命令提示進(jìn)行測試。這樣可以讓服務(wù)器在window中容易看見的地方顯示狀態(tài)消息。如果配置出現(xiàn)錯誤,通過這些消息,可以更容易地識別并修復(fù)問題。要想啟動服務(wù)器,輸入命令:C:\>C:\ProgramFiles\MySQL\MySQLServer5.1\bin\mysqld要想掛起服務(wù)器,輸入命令:C:\>C:\ProgramFiles\MySQL\MySQLServer5.0\bin\mysqladmin-urootshutdown注釋:如果MySQLroot用戶賬戶有密碼,你需要調(diào)用命令C:\ProgramFiles\MySQL\MySQLServer5.1\bin\mysqladmin-uroot-pshutdown并根據(jù)提示輸入密碼。該命令調(diào)用MySQL管理工具mysqladmin,連接服務(wù)器并告知它關(guān)閉服務(wù)。該命令使用MySQLroot用戶連接,這是MySQL權(quán)限系統(tǒng)中的默認(rèn)管理賬戶。請注意MySQL權(quán)限系統(tǒng)中的用戶完全獨(dú)立于Windows下的登錄用戶。例如,在此外,我就可以輸入:Mysqladmin–uroot–pshutdown它會提示輸入密碼,則我輸入:666666。使用該命令安裝服務(wù)器C:\>mysqld--install如果只使用服務(wù)器名安裝mysqld時有問題,嘗試使用全路徑名來安裝。例如:C:\>C:\ProgramFiles\MySQL\MySQLServer5.1\bin\mysqld--install你還可以將MySQLbin目錄的路徑加到Windows系統(tǒng)PATH環(huán)境變量中(另外,在配置過程中,如果選中了“createanananymousaccount”選項(xiàng),則可能在開啟服務(wù)器的時候出現(xiàn)錯誤,因此不要選中它。“要想創(chuàng)建一個匿名用戶賬戶,選中CreateAnAnonymousAccount(創(chuàng)建匿名賬戶)選項(xiàng)旁邊的框。創(chuàng)建匿名賬戶會降低服務(wù)器的安全,并造成登錄和許可困難。因此不建議。”)完整的登錄方法是:(1)打開控制臺(2)進(jìn)入mySQL的bin目錄(3)輸入mysqld(4)輸入mysqlshow–uroot–pmysql:注意,如果一直使用CMD,則后面的命令都需要輸入權(quán)限,即在命令后面加上:–uroot–p,再輸入相應(yīng)的密碼才行。也可以這樣進(jìn)入:接著再輸入相應(yīng)的命令:你可以試查尋下面兩個信息:Current_date和version()或:一個命令通常由SQL語句組成,隨后跟著一個分號。(有一些例外不需要分號。早先提到的QUIT是一個例子。后面我們將看到其它的例子。)(1)當(dāng)發(fā)出一個命令時,mysql將它發(fā)送給服務(wù)器并顯示執(zhí)行結(jié)果,然后顯示另一個mysql>顯示它準(zhǔn)備好接受其它命令。(2)mysql用表格(行和列)方式顯示查詢輸出。第一行包含列的標(biāo)簽,隨后的行是查詢結(jié)果。通常,列標(biāo)簽是你取自數(shù)據(jù)庫表的列的名字。如果你正在檢索一個表達(dá)式而非表列的值(如剛才的例子),mysql用表達(dá)式本身標(biāo)記列。(3)mysql顯示返回了多少行,以及查詢花了多長時間,它給你提供服務(wù)器性能的一個大致概念。因?yàn)樗麄儽硎緯r鐘時間(不是CPU或機(jī)器時間),并且因?yàn)樗麄兪艿街T如服務(wù)器負(fù)載和網(wǎng)絡(luò)延時的影響,因此這些值是不精確的。(為了簡潔,在本章其它例子中不再顯示“集合中的行”。)能夠以大小寫輸入關(guān)鍵詞。例如,可以做個計(jì)算器:mysql>SELECTSIN(PI()/4),(4+1)*5;結(jié)果如下:mysql>SELECTVERSION();SELECTNOW();結(jié)果如下:不必全在一個行內(nèi)給出一個命令,較長命令可以輸入到多個行中。mysql通過尋找終止分號而不是輸入行的結(jié)束來決定語句在哪兒結(jié)束。(換句話說,mysql接受自由格式的輸入:它收集輸入行但直到看見分號才執(zhí)行。)在這個例子中,在輸入多行查詢的第一行后,要注意提示符如何從mysql>變?yōu)?>,這正是mysql如何指出它沒見到完整的語句并且正在等待剩余的部分。提示符是你的朋友,因?yàn)樗峁┯袃r值的反饋,如果使用該反饋,將總是知道m(xù)ysql正在等待什么。如果你決定不想執(zhí)行正在輸入過程中的一個命令,輸入\c取消它:mysql>SELECT->USER()->\cmysql>這里也要注意提示符,在你輸入\c以后,它切換回到mysql>,提供反饋以表明mysql準(zhǔn)備接受一個新命令啟動與停止mysql服務(wù)器的方式很多,下面的也行:一、查看并啟動MySQL服務(wù)。在WindowsXP下安裝完MySQL后,它就已經(jīng)自動啟動服務(wù)了,并且在開始菜單中有其客戶端的快捷方式連接,如圖:可以通過Windows的服務(wù)管理器查看?!伴_始”-“運(yùn)行”,輸入“services.msc”,回車。彈出Windows的服務(wù)管理器,然后就可以看見服務(wù)名為“mysql”的服務(wù)項(xiàng)了,其右邊標(biāo)明“已啟動”,如圖:如果沒有“已啟動”字樣,說明MySQL服務(wù)未啟動,不能連接,會出現(xiàn)10061錯誤。啟動方法為:“開始”-“運(yùn)行”,輸入“cmd”,回車彈出XP命令提示符界面(類似DOS命令行,以后簡稱命令行)。然后輸入“netstartmysql”就啟動mysql服務(wù)了,停止mysql服務(wù)“netstopmysql”(注意,這里是輸入的MySQL服務(wù)的名字。如果你的MySQL服務(wù)的名字是DB或其它名字,你應(yīng)該輸入“netstartDB”或其它名),見圖:二、連接MySQL服務(wù)器。如果已經(jīng)開啟了服務(wù)器,則現(xiàn)在開始連接MySQL服務(wù)器,連接MySQL的命令格式為:mysql–h主機(jī)名–u用戶名–p用戶密碼“-h主機(jī)名”還可以這樣寫:“-h主機(jī)名”(中間不要空格)、“--host=主機(jī)名”“-u用戶名”還可以寫成:“-u用戶名”、“--user=用戶名”“-p用戶密碼”還可以寫出:“--password=用戶密碼”。但是,出于安全的考慮,最好不要這樣做。選擇-p不跟口令告訴mysql在啟動時提示您鍵入口令。例如:mysql>mysql–hlocalhost–uroot-p補(bǔ)充:my.ini文件,是配置好mysql服務(wù)器后自動生成的配置文件,可以更改。在服務(wù)器已經(jīng)啟動的情況下輸入:mysql-hlocalhost-uroot-p本機(jī)登錄可以省略-h參數(shù)。如果登錄遠(yuǎn)程的,-h后面要加上對方的IP地址(如)。有的指令是在操作系統(tǒng)的提示符下運(yùn)行的,有的是在mysql提示符下運(yùn)行的。shell提示符是操作系統(tǒng)提示符。shell>mysqladmin-uuser_name-h-p原密碼host_namepasswordnewpwderror1045指的就是密碼不對。

第二講創(chuàng)建并使用數(shù)據(jù)庫使用SHOW語句找出服務(wù)器上當(dāng)前存在什么數(shù)據(jù)庫:可能你的機(jī)器上的數(shù)據(jù)庫列表是不同的,但是很可能有mysql和test數(shù)據(jù)庫。mysql是必需的,因?yàn)樗枋鲇脩粼L問權(quán)限,test數(shù)據(jù)庫經(jīng)常作為用戶試身手的工作區(qū)。如果test數(shù)據(jù)庫存在,嘗試訪問它:mysql>USEtestDatabasechanged注意,USE,類似QUIT,不需要一個分號。(如果你喜歡,你可以用一個分號終止這樣的語句;這無礙)USE語句在使用上也有另外一個特殊的地方:它必須在一個單行上給出。你可列在后面的例子中使用test數(shù)據(jù)庫(如果你能訪問它),但是你在該數(shù)據(jù)庫創(chuàng)建的任何東西可以被訪問它的其它人刪除,因此,你應(yīng)該詢問MySQL管理員許可你使用自己的一個數(shù)據(jù)庫。假定你想要調(diào)用你的menagerie,管理員需要執(zhí)行這樣一條命令:mysql>GRANTALLONmenagerie.*TO'your_mysql_name'@'your_client_host';這里your_mysql_name是分配給你的MySQL用戶名,your_client_host是所連接的服務(wù)器所在的主機(jī)。一創(chuàng)建并選擇數(shù)據(jù)庫Mysql>createdatabasemenagerie;創(chuàng)建數(shù)據(jù)庫并不表示選定并使用它,你必須明確地操作。為了使menagerie成為當(dāng)前的數(shù)據(jù)庫,使用這個命令:mysql>USEmenagerieDatabasechanged數(shù)據(jù)庫只需要創(chuàng)建一次,但是必須在每次啟動mysql會話時在使用前先選擇它。你可以根據(jù)上面的例子執(zhí)行一個USE語句來實(shí)現(xiàn)。還可以在調(diào)用mysql時,通過命令行選擇數(shù)據(jù)庫,只需要在提供連接參數(shù)之后指定數(shù)據(jù)庫名稱。例如:shell>mysql-hhost-uuser-pmenagerieEnterpassword:********注意,剛才顯示的命令行中的menagerie不是你的密碼。如果你想要在命令行上在-p選項(xiàng)后提供密碼,則不能插入空格(例如,如-pmypassword,不是-pmypassword)。但是,不建議在命令行輸入密碼,因?yàn)檫@樣會暴露密碼,能被在機(jī)器上登錄的其它用戶窺探到。二創(chuàng)建表創(chuàng)建數(shù)據(jù)庫是很容易的部分,但是在這時它是空的,正如SHOWTABLES將告訴你的:mysql>SHOWTABLES;Emptyset(0.00sec)較難的部分是決定你的數(shù)據(jù)庫結(jié)構(gòu)應(yīng)該是什么:你需要什么數(shù)據(jù)庫表,各數(shù)據(jù)庫表中有什么樣的列。你將需要一個包含你每個寵物的記錄的表。它可稱為pet表,并且它應(yīng)該包含,最少,每個動物的名字。因?yàn)槊直旧聿皇呛苡腥?,表?yīng)該包含另外的信息。例如,如果在你豢養(yǎng)寵物的家庭有超過一個人,你可能想要列出每個動物的主人。你可能也想要記錄例如種類和性別的一些基本的描述信息。年齡呢?那可能有趣,但是存儲到一個數(shù)據(jù)庫中不是一件好事情。年齡隨著時間流逝而變化,這意味著你將要不斷地更新你的記錄。相反,存儲一個固定值例如生日比較好,那么,無論何時你需要年齡,可以以當(dāng)前日期和出生日期之間的差來計(jì)算它。MySQL提供了日期運(yùn)算函數(shù),因此這并不困難。存儲出生日期而非年齡還有其它優(yōu)點(diǎn):(1)你可以使用數(shù)據(jù)庫完成這樣的任務(wù),例如生成即將到來的寵物生日的提示。(如果你認(rèn)為這類查詢有點(diǎn)蠢,注意,這與從商務(wù)數(shù)據(jù)庫來識別出不久要發(fā)給生日祝賀的客戶是同一個問題,因?yàn)橛?jì)算機(jī)幫助私人聯(lián)絡(luò)。)(2)你可以相對于日期而不止是當(dāng)前日期來計(jì)算年齡。例如,如果你在數(shù)據(jù)庫存儲死亡日期,你能很容易地計(jì)算出一只寵物死時有多大。你可能想到pet表中其它有用的其它類型信息,但是到目前為止這些已經(jīng)足夠了:名字、主人、種類,性別、出生和死亡日期。使用一個CREATETABLE語句指定你的數(shù)據(jù)庫表的布局:mysql>CREATETABLEpet(nameVARCHAR(20),ownerVARCHAR(20),->speciesVARCHAR(20),sexCHAR(1),birthDATE,deathDATE);VARCHAR適合于name、owner和species列,因?yàn)榱兄凳亲冮L的。這些列的長度不必都相同,而且不必是20。你可以挑選從1到65535的任何長度,從中選擇一個最合理的值。(如果選擇得不合適,后來證明你需要一個更長的字段,MySQL提供一個ALTERTABLE語句。)可以用多種類型的值來表示動物記錄中的性別,例如,"m"和"f",或"male"和"female"。使用單字符"m"和"f"是最簡單的方法。很顯然,birth和death列應(yīng)選用DATE數(shù)據(jù)類。創(chuàng)建了數(shù)據(jù)庫表后,SHOWTABLES應(yīng)該產(chǎn)生一些輸出:為了驗(yàn)證你的表是按你期望的方式創(chuàng)建,使用一個DESCRIBE語句:mysql>DESCRIBEpet;你可以隨時使用DESCRIBE,例如,如果你忘記表中的列的名稱或類型時。三將數(shù)據(jù)裝入表中(1)可以利用load命令將數(shù)據(jù)從一個文本文件導(dǎo)入到表中,在此圖中我們看到,loaddatalocalinfile‘path/pet.txt’intotablepet;是一個能將文本數(shù)據(jù)導(dǎo)入到新表中的命令。這對于初始化一個新表時非常有用。注:因?yàn)槟闶菑囊粋€空表開始的,填充它的一個簡易方法是創(chuàng)建一個文本文件,每個動物各一行,然后用一個語句將文件的內(nèi)容裝載到表中。你可以創(chuàng)建一個文本文件“pet.txt”,每行包含一個記錄,用定位符(tab)把值分開,并且以CREATETABLE語句中列出的列次序給出。對于丟失的值(例如未知的性別,或仍然活著的動物的死亡日期),你可以使用NULL值。為了在你的文本文件中表示這些內(nèi)容,使用\N(反斜線,字母N)。例如,Whistler鳥的記錄應(yīng)為(這里值之間的空白是一個定位符)。如果想要一次增加一個新記錄,可以使用INSERT語句。最簡單的形式是,提供每一列的值,其順序與CREATETABLE語句中列的順序相同。假定Diane把一只新倉鼠命名為Puffball,你可以使用下面的INSERT語句添加一條新記錄:mysql>INSERTINTOpet->VALUES('Puffball','Diane','hamster','f','1999-03-30',NULL);注意,這里字符串和日期值均為引號擴(kuò)起來的字符串。另外,可以直接用INSERT語句插入NULL代表不存在的值。不能使用LOADDATA中所示的的\N。從這個例子,你應(yīng)該能看到涉及很多的鍵入用多個INSERT語句而非單個LOADDATA語句裝載你的初始記錄。四從表檢索信息SELECT語句用來從數(shù)據(jù)表中檢索信息。其格式為:selectwhat_to_selectfromwhich_tablewhereconditions_to_satisfy;注:what_to_select指出你想要看到的內(nèi)容,可以是列的一個表,或*表示“所有的列”。which_table指出你想要從其檢索數(shù)據(jù)的表。WHERE子句是可選項(xiàng),如果選擇該項(xiàng),conditions_to_satisfy指定行必須滿足的檢索條件。1選擇所有數(shù)據(jù)SELECT最簡單的形式是從一個表中檢索所有記錄:mysql>SELECT*FROMpet;如果你想要瀏覽整個表,可以使用這種形式的SELECT,例如,剛剛裝載了初始數(shù)據(jù)集以后。也有可能你想到Bowser的生日看起來不很對。查閱你原來的家譜,你發(fā)現(xiàn)正確的出生年是1989,而不是1979。至少有兩種修正方法:(1)編輯文件“pet.txt”改正錯誤,然后使用DELETE和LOADDATA清空并重新裝載表:mysql>DELETEFROMpet;mysql>LOADDATALOCALINFILE'pet.txt'INTOTABLEpet;然而,如果這樣操做,必須重新輸入Puffball記錄。(2)用一個UPDATE語句僅修正錯誤記錄:mysql>UPDATEpetSETbirth='1989-08-31'WHEREname='Bowser';UPDATE只更改有問題的記錄,不需要重新裝載數(shù)據(jù)庫表。2選擇特殊行如上所示,檢索整個表是容易的。只需要從SELECT語句中刪掉WHERE子句。但是一般你不想看到整個表,特別地當(dāng)表變得很大時。相反,你通常對回答一個具體的問題更感興趣,在這種情況下在你想要的信息上進(jìn)行一些限制。讓我們看一些他們回答的有關(guān)你寵物的問題的選擇查詢。可以從表中只選擇特定的行。例如,如果你想要驗(yàn)證你對Bowser的生日所做的更改,按下述方法選擇Bowser的記錄:mysql>SELECT*FROMpetWHEREname='Bowser';上面的查詢使用AND邏輯操作符,也有一個OR操作符:mysql>SELECT*FROMpetWHEREspecies='snake'ORspecies='bird';AND和OR可以混用,但AND比OR具有更高的優(yōu)先級。如果你使用兩個操作符,使用圓括號指明如何對條件進(jìn)行分組是一個好主意:mysql>SELECT*FROMpetWHERE(species='cat'ANDsex='m')->OR(species='dog'ANDsex='f');3選擇特殊列如果你不想看到表中的所有行,就命名你感興趣的列,用逗號分開。例如,如果你想要知道你的動物什么時候出生的,選擇name和birth列:mysql>SELECTname,birthFROMpet;請注意該查詢只是簡單地檢索每個記錄的owner列,并且他們中的一些出現(xiàn)多次。為了使輸出減到最少,增加關(guān)鍵字DISTINCT檢索出每個唯一的輸出記錄:mysql>SELECTDISTINCTownerFROMpet;4分類行你可能已經(jīng)注意到前面的例子中結(jié)果行沒有以特定的順序顯示。然而,當(dāng)行按某種方式排序時,檢查查詢輸出通常更容易。為了排序結(jié)果,使用ORDERBY子句。這里是動物生日,按日期排序:mysql>SELECTname,birthFROMpetORDERBYbirth;在字符類型列上,與所有其他比較操作類似,分類功能正常情況下是以區(qū)分大小寫的方式執(zhí)行的。這意味著,對于等同但大小寫不同的列,并未定義其順序。對于某一列,可以使用BINARY強(qiáng)制執(zhí)行區(qū)分大小寫的分類功能,如:ORDERBYBINARYcol_name.默認(rèn)排序是升序,最小的值在第一。要想以降序排序,在你正在排序的列名上增加DESC(降序)關(guān)鍵字:mysql>SELECTname,birthFROMpetORDERBYbirthDESC;可以對多個列進(jìn)行排序,并且可以按不同的方向?qū)Σ煌牧羞M(jìn)行排序。例如,按升序?qū)游锏姆N類進(jìn)行排序,然后按降序根據(jù)生日對各動物種類進(jìn)行排序(最年輕的動物在最前面),使用下列查詢:mysql>SELECTname,species,birthFROMpet->ORDERBYspecies,birthDESC;5日期計(jì)算MySQL提供了幾個函數(shù),可以用來計(jì)算日期,例如,計(jì)算年齡或提取日期部分。要想確定每個寵物有多大,可以計(jì)算當(dāng)前日期的年和出生日期之間的差。如果當(dāng)前日期的日歷年比出生日期早,則減去一年。以下查詢顯示了每個寵物的出生日期、當(dāng)前日期和年齡數(shù)值的年數(shù)字。mysql>SELECTname,birth,CURDATE(),->(YEAR(CURDATE())-YEAR(birth))->-(RIGHT(CURDATE(),5)<RIGHT(birth,5))->ASage->FROMpet;此處,YEAR()提取日期的年部分,RIGHT()提取日期的MM-DD(日歷年)部分的最右面5個字符。比較MM-DD值的表達(dá)式部分的值一般為1或0,如果CURDATE()的年比birth的年早,則年份應(yīng)減去1。整個表達(dá)式有些難懂,使用alias(age)來使輸出的列標(biāo)記更有意義??梢允褂靡粋€類似的查詢來確定已經(jīng)死亡動物的死亡年齡。你通過檢查death值是否是NULL來確定是哪些動物,然后,對于那些非NULL值的動物,需要計(jì)算出death和birth值之間的差:mysql>SELECTname,birth,death,->(YEAR(death)-YEAR(birth))-(RIGHT(death,5)<RIGHT(birth,5))->ASage->FROMpetWHEREdeathISNOTNULLORDERBYage;查詢使用deathISNOTNULL而非death!=NULL,因?yàn)镹ULL是特殊的值,不能使用普通比較符來比較,以后會給出解釋。如果你想要知道哪個動物下個月過生日,怎么辦?對于這類計(jì)算,年和天是無關(guān)的,你只需要提取birth列的月份部分。MySQL提供幾個日期部分的提取函數(shù),例如YEAR()、MONTH()和DAYOFMONTH()。在這里MONTH()是適合的函數(shù)。為了看它怎樣工作,運(yùn)行一個簡單的查詢,顯示birth和MONTH(birth)的值:mysql>SELECTname,birth,MONTH(birth)FROMpet;找出下個月生日的動物也是容易的。假定當(dāng)前月是4月,那么月值是4,你可以找在5月出生的動物(5月),方法是:mysql>SELECTname,birthFROMpetWHEREMONTH(birth)=5;如果當(dāng)前月份是12月,就有點(diǎn)復(fù)雜了。你不能只把1加到月份數(shù)(12)上并尋找在13月出生的動物,因?yàn)闆]有這樣的月份。相反,你應(yīng)尋找在1月出生的動物(1月)。你甚至可以編寫查詢,不管當(dāng)前月份是什么它都能工作。采用這種方法不必在查詢中使用一個特定的月份,DATE_ADD()允許在一個給定的日期上加上時間間隔。如果在NOW()值上加上一個月,然后用MONTH()提取月份,結(jié)果產(chǎn)生生日所在月份:mysql>SELECTname,birthFROMpet->WHEREMONTH(birth)=MONTH(DATE_ADD(CURDATE(),INTERVAL1MONTH));完成該任務(wù)的另一個方法是加1以得出當(dāng)前月份的下一個月(在使用取模函數(shù)(MOD)后,如果月份當(dāng)前值是12,則“回滾”到值0):mysql>SELECTname,birthFROMpet->WHEREMONTH(birth)=MOD(MONTH(CURDATE()),12)+1;注意,MONTH返回在1和12之間的一個數(shù)字,且MOD(something,12)返回在0和11之間的一個數(shù)字,因此必須在MOD()以后加1,否則我們將從11月(11)跳到1月(1)。6NULL值操作NULL值可能令人感到奇怪直到你習(xí)慣它。概念上,NULL意味著“沒有值”或“未知值”,且它被看作與眾不同的值。為了測試NULL,你不能使用算術(shù)比較操作符例如=、<或!=。為了說明它,試試下列查詢:mysql>SELECT1=NULL,1<>NULL,1<NULL,1>NULL;很顯然你不能通過這些比較得到有意義的結(jié)果。相反使用ISNULL和ISNOTNULL操作符:mysql>SELECT1ISNULL,1ISNOTNULL;請注意在MySQL中,0或NULL意味著假而其它值意味著真。布爾運(yùn)算的默認(rèn)真值是1。對NULL的特殊處理即是在前面的章節(jié)中,為了決定哪個動物不再是活著的,使用deathISNOTNULL而不使用death!=NULL的原因。在GROUPBY中,兩個NULL值視為相同。執(zhí)行ORDERBY時,如果運(yùn)行ORDERBY...ASC,則NULL值出現(xiàn)在最前面,若運(yùn)行ORDERBY...DESC,則NULL值出現(xiàn)在最后面。NULL操作的常見錯誤是不能在定義為NOTNULL的列內(nèi)插入0或空字符串,但事實(shí)并非如此。在NULL表示"沒有數(shù)值"的地方有數(shù)值。7模式匹配MySQL提供標(biāo)準(zhǔn)的SQL模式匹配。SQL模式匹配允許你使用“_”匹配任何單個字符,而“%”匹配任意數(shù)目字符(包括零字符)。在MySQL中,SQL的模式默認(rèn)是忽略大小寫的。下面給出一些例子。注意使用SQL模式時,不能使用=或!=;而應(yīng)使用LIKE或NOTLIKE比較操作符。要想找出以“b”開頭的名字:mysql>SELECT*FROMpetWHEREnameLIKE'b%';要想找出以“fy”結(jié)尾的名字:mysql>SELECT*FROMpetWHEREnameLIKE'%fy';要想找出正好包含5個字符的名字,使用“_”模式字符:mysql>SELECT*FROMpetWHEREnameLIKE'_____';8計(jì)數(shù)行數(shù)據(jù)庫經(jīng)常用于回答這個問題,“某個類型的數(shù)據(jù)在表中出現(xiàn)的頻度?”例如,你可能想要知道你有多少寵物,或每位主人有多少寵物,或你可能想要對你的動物進(jìn)行各種類型的普查。計(jì)算你擁有動物的總數(shù)目與“在pet表中有多少行?”是同樣的問題,因?yàn)槊總€寵物有一個記錄。COUNT(*)函數(shù)計(jì)算行數(shù),所以計(jì)算動物數(shù)目的查詢應(yīng)為:mysql>SELECTCOUNT(*)FROMpet;在前面,你檢索了擁有寵物的人的名字。如果你想要知道每個主人有多少寵物,你可以使用COUNT()函數(shù):mysql>SELECTowner,COUNT(*)FROMpetGROUPBYowner;注意,使用GROUPBY對每個owner的所有記錄分組,沒有它,你會得到錯誤消息:mysql>SELECTowner,COUNT(*)FROMpet;每種動物的數(shù)量:mysql>SELECTspecies,COUNT(*)FROMpetGROUPBYspecies;每種性別的動物數(shù)量:mysql>SELECTsex,COUNT(*)FROMpetGROUPBYsex;按種類和性別組合的動物數(shù)量:mysql>SELECTspecies,sex,COUNT(*)FROMpetGROUPBYspecies,sex;若使用COUNT(),你不必檢索整個表。例如,前面的查詢,當(dāng)只對狗和貓進(jìn)行時,應(yīng)為:mysql>SELECTspecies,sex,COUNT(*)FROMpet->WHEREspecies='dog'ORspecies='cat'->GROUPBYspecies,sex;或,如果你僅需要知道已知性別的按性別的動物數(shù)目:mysql>SELECTspecies,sex,COUNT(*)FROMpet->WHEREsexISNOTNULL->GROUPBYspecies,sex;9使用1個以上的表pet表追蹤你有哪個寵物。如果你想要記錄其它相關(guān)信息,例如在他們一生中看獸醫(yī)或何時后代出生,你需要另外的表。這張表應(yīng)該像什么呢?需要:(1)它需要包含寵物名字以便你知道每個事件屬于哪個動物。(2)需要一個日期以便你知道事件是什么時候發(fā)生的。(3)需要一個描述事件的字段。(4)如果你想要對事件進(jìn)行分類,則需要一個事件類型字段。綜合上述因素,event表的CREATETABLE語句應(yīng)為:mysql>CREATETABLEevent(nameVARCHAR(20),dateDATE,->typeVARCHAR(15),remarkVARCHAR(255));對于pet表,最容易的方法是創(chuàng)建包含信息的用定位符分隔的文本文件來裝載初始記錄:采用如下方式裝載記錄:mysql>LOADDATALOCALINFILE'event.txt'INTOTABLEevent;瀏覽表可看到:根據(jù)你從已經(jīng)運(yùn)行在pet表上的查詢中學(xué)到的,你應(yīng)該能執(zhí)行對event表中記錄的檢索;原理是一樣的。但是什么時候event表本身不能回答你可能問的問題呢?當(dāng)他們有了一窩小動物時,假定你想要找出每只寵物的年齡。我們前面看到了如何通過兩個日期計(jì)算年齡。event表中有母親的生產(chǎn)日期,但是為了計(jì)算母親的年齡,你需要她的出生日期,存儲在pet表中。說明查詢需要兩個表:mysql>SELECT,->(YEAR(date)-YEAR(birth))-(RIGHT(date,5)<RIGHT(birth,5))ASage,->remark->FROMpet,event->WHERE=ANDevent.type='litter';關(guān)于該查詢要注意的幾件事情:(1)FROM子句列出兩個表,因?yàn)椴樵冃枰獜膬蓚€表提取信息。(2)當(dāng)從多個表組合(聯(lián)結(jié))信息時,你需要指定一個表中的記錄怎樣能匹配其它表的記錄。這很簡單,因?yàn)樗鼈兌加幸粋€name列。查詢使用WHERE子句基于name值來匹配2個表中的記錄。(3)因?yàn)閚ame列出現(xiàn)在兩個表中,當(dāng)引用列時,你一定要指定哪個表。把表名附在列名前即可以實(shí)現(xiàn)。(3)你不必有2個不同的表來進(jìn)行聯(lián)結(jié)。如果你想要將一個表的記錄與同一個表的其它記錄進(jìn)行比較,可以將一個表聯(lián)結(jié)到自身。例如,為了在你的寵物之中繁殖配偶,你可以用pet聯(lián)結(jié)自身來進(jìn)行相似種類的雄雌配對:mysql>SELECT,p1.sex,,p2.sex,p1.species->FROMpetASp1,petASp2->WHEREp1.species=p2.speciesANDp1.sex='f'ANDp2.sex='m';在這個查詢中,我們?yōu)楸砻付▌e名以便能引用列并且使得每一個列引用與哪個表實(shí)例相關(guān)聯(lián)更直觀。五獲得數(shù)據(jù)庫和表的信息如果你忘記數(shù)據(jù)庫或表的名字,或給定的表的結(jié)構(gòu)是什么(例如,它的列叫什么),怎么辦?MySQL通過提供數(shù)據(jù)庫及其支持的表的信息的幾個語句解決這個問題。你已經(jīng)見到了SHOWDATABASES,它列出由服務(wù)器管理的數(shù)據(jù)庫。為了找出當(dāng)前選擇了哪個數(shù)據(jù)庫,使用DATABASE()函數(shù):mysql>SELECTDATABASE();如果你還沒選擇任何數(shù)據(jù)庫,結(jié)果是NULL。為了找出當(dāng)前的數(shù)據(jù)庫包含什么表(例如,當(dāng)你不能確定一個表的名字),使用這個命令:mysql>SHOWTABLES;如果你想要知道一個表的結(jié)構(gòu),可以使用DESCRIBE命令;它顯示表中每個列的信息:mysql>DESCRIBEpet;如果表有索引,SHOWINDEXFROMtbl_name生成有關(guān)索引的信息。六常用查詢的例子下面是一些學(xué)習(xí)如何用MySQL解決一些常見問題的例子。在一些例子中,使用數(shù)據(jù)庫表“shop”來儲存某個商人(經(jīng)銷商)的每件物品(物品號)的價格。假定每個商人對每項(xiàng)物品有一個固定價格,那么(物品,商人)即為該記錄的主關(guān)鍵字。啟動命令行工具mysql并選擇數(shù)據(jù)庫:shell>mysqlyour-database-name(在大多數(shù)MySQL中,你可以使用test數(shù)據(jù)庫)。你可以使用以下語句創(chuàng)建示例表:mysql>CREATETABLEshop(->articleINT(4)UNSIGNEDZEROFILLDEFAULT'0000'NOTNULL,->dealerCHAR(20)DEFAULT''NOTNULL,->priceDOUBLE(16,2)DEFAULT'0.00'NOTNULL,->PRIMARYKEY(article,dealer));mysql>INSERTINTOshopVALUES->(1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45),->(3,'C',1.69),(3,'D',1.25),(4,'D',19.95);執(zhí)行語句后,表應(yīng)包含以下內(nèi)容:mysql>SELECT*FROMshop;1列的最大值“最大的物品號是什么?”SELECTMAX(article)ASarticleFROMshop;2擁有某個列最大值的行Selectarticle,dealer,priceFromshopwhereprice=(selectmax(price)fromshop);另一個解決方案是按價格降序排序所有行并用MySQL特定LIMIT子句只得到第一行:SELECTarticle,dealer,priceFROMshopORDERBYpriceDESCLIMIT1;注:如果有多項(xiàng)最貴的物品(例如每個的價格為19.95),LIMIT解決方案僅僅顯示其中一個!3列的最大值:按組每項(xiàng)物品的最高價格是多少?SELECTarticle,MAX(price)ASpriceFROMshopGROUPBYarticle4擁有某個字段的組間最大值的行任務(wù):對每項(xiàng)物品,找出最貴價格的物品的經(jīng)銷商??梢杂眠@樣一個子查詢解決該問題:SELECTarticle,dealer,priceFROMshops1WHEREprice=(SELECTMAX(s2.price)FROMshops2WHEREs1.article=s2.article);5使用用戶變量你可以清空MySQL用戶變量以記錄結(jié)果,不必將它們保存到客戶端的臨時變量中。例如,要找出價格最高或最低的物品的,其方法是:mysql>SELECT@min_price:=MIN(price),@max_price:=MAX(price)FROMshop;mysql>SELECT*FROMshopWHEREprice=@min_priceORprice=@max_price;6使用外鍵CREATETABLEperson(idSMALLINTUNSIGNEDNOTNULLAUTO_INCREMENT,nameCHAR(60)NOTNULL,PRIMARYKEY(id));CREATETABLEshirt(idSMALLINTUNSIGNEDNOTNULLAUTO_INCREMENT,styleENUM('t-shirt','polo','dress')NOTNULL,colorENUM('red','blue','orange','white','black')NOTNULL,ownerSMALLINTUNSIGNEDNOTNULLREFERENCESperson(id),PRIMARYKEY(id));INSERTINTOpersonVALUES(NULL,'AntonioPaz');SELECT@last:=LAST_INSERT_ID();我們再看看person表中的記錄情況:可以看出auto_increment的作用了嗎?INSERTINTOshirtVALUES(NULL,'polo','blue',@last),(NULL,'dress','white',@last),(NULL,'t-shirt','blue',@last);INSERTINTOpersonVALUES(NULL,'LillianaAngelovska');SELECT@last:=LAST_INSERT_ID();INSERTINTOshirtVALUES(NULL,'dress','orange',@last),(NULL,'polo','red',@last),(NULL,'dress','blue',@last),(NULL,'t-shirt','white',@last);SELECTs.*FROMpersonp,shirtsWHERELIKE'Liliana%'ANDs.owner=p.idANDs.color<>'white';7根據(jù)兩個鍵搜索可以充分利用使用單關(guān)鍵字的OR子句,如同AND的處理。一個比較靈活的例子是尋找兩個通過OR組合到一起的關(guān)鍵字:SELECTfield1_index,field2_indexFROMtest_tableWHEREfield1_index='1'ORfield2_index='1'每個SELECT只搜索一個關(guān)鍵字,可以進(jìn)行優(yōu)化:SELECTfield1_index,field2_indexFROMtest_tableWHEREfield1_index='1'UNIONSELECTfield1_index,field2_indexFROMtest_tableWHEREfield2_index='1';8根據(jù)天計(jì)算訪問量下面的例子顯示了如何使用位組函數(shù)來計(jì)算每個月中用戶訪問網(wǎng)頁的天數(shù)。CREATETABLEt1(yearYEAR(4),monthINT(2)UNSIGNEDZEROFILL,dayINT(2)UNSIGNEDZEROFILL);INSERTINTOt1VALUES(2000,1,1),(2000,1,20),(2000,1,30),(2000,2,2),(2000,2,23),(2000,2,23);示例表中含有代表用戶訪問網(wǎng)頁的年-月-日值??梢允褂靡韵虏樵儊泶_定每個月的訪問天數(shù):SELECTyear,month,BIT_COUNT(BIT_OR(1<<day))ASdaysFROMt1GROUPBYyear,month;該查詢計(jì)算了在表中按年/月組合的不同天數(shù),可以自動去除重復(fù)的詢問。9使用AUTO_INCREMENT可以通過AUTO_INCREMENT屬性為新的行產(chǎn)生唯一的標(biāo)識:CREATETABLEanimals(idMEDIUMINTNOTNULLAUTO_INCREMENT,nameCHAR(30)NOTNULL,PRIMARYKEY(id));INSERTINTOanimals(name)VALUES('dog'),('cat'),('penguin'),('lax'),('whale'),('ostrich');SELECT*FROManimals;你可以使用LAST_INSERT_ID()SQL函數(shù)或mysql_insert_id()CAPI函數(shù)來查詢最新的AUTO_INCREMENT值。這些函數(shù)與具體連接有關(guān),因此其返回值不會被其它執(zhí)行插入功能的連接影響。對于多行插入,LAST_INSERT_ID()和mysql_insert_id()從插入的第一行實(shí)際返回AUTO_INCREMENT關(guān)鍵字。在復(fù)制設(shè)置中,通過該函數(shù)可以在其它服務(wù)器上正確復(fù)制多行插入。

第三講MySQL數(shù)據(jù)庫管理一增加用戶一個是創(chuàng)建用戶并設(shè)置密碼;二是為用戶分配權(quán)限。沒有權(quán)限的用戶沒有意義。grant指令是mysql中的指令,不是shell指令。假如我們要創(chuàng)建一個chenney用戶,密碼也是chenney,權(quán)限是select。對應(yīng)的命令如下:先以root用戶連接mysql數(shù)據(jù)庫服務(wù)器再輸入如下命令:mysql>grantselectontest.*to'chenney'@'localhost'identifiedby'chenney';注意,information_schema是一個系統(tǒng)庫,地球人都能看到。多權(quán)限一次可以都給一個用戶,用逗號分開。授權(quán)后,重新以chenney用戶登錄。如果遠(yuǎn)程登錄,則@后要用%號。grantallprivilegesontest.*to'chenney'@'localhost'identifiedby'chenney';dropuser'chenney'@'localhost';二查看系統(tǒng)對象信息showdatabases;showtables;descuser_table;三數(shù)據(jù)庫的備份與恢復(fù)MySQL的備份數(shù)據(jù)庫兩個主要方法是:(1)用mysqldump程序(2)直接拷貝數(shù)據(jù)庫文件“擴(kuò)展名代表不了文件的本質(zhì)屬性”這和windows不一樣的。mysql并不和windows一致。如果直接拷貝數(shù)據(jù)庫文件,一定要先把服務(wù)停止。這種方法叫“冷備份與恢復(fù)“,也叫”物理備份與恢復(fù)“。相反的叫作“熱”“執(zhí)備份”指令是mysqldump。它是shell指令。shell>mysqldumpsamp_db>文件夾/備份文件名shell>mysqldump-uroot-ptest>d:\copy.dmp下面可以將這個test庫刪除了。mysql>dropdatabasetest;則用下面的方法恢復(fù):mysql>createdatabasetest;備份恢復(fù)不使用mysqldump而是使用mysql,這旨一個shell指令:mysql-uroot-p666666test<d:\copy.dmp

第四講客戶端和實(shí)用工具程序一mysql:MySQL命令行工具mysql是一個簡單的SQL外殼(有GNUreadline功能)。它支持交互式和非交互式使用。當(dāng)交互使用時,查詢結(jié)果采用ASCII表格式。當(dāng)采用非交互式(例如,用作過濾器)模式時,結(jié)果為tab分割符格式。可以使用命令行選項(xiàng)更改輸出格式。如果由于結(jié)果較大而內(nèi)存不足遇到問題,使用--quick選項(xiàng)。這樣可以強(qiáng)制mysql從服務(wù)器每次一行搜索結(jié)果,而不是檢索整個結(jié)果集并在顯示之前不得不將它保存到內(nèi)存中。使用mysql_use_result()而不是mysql_store_result()來搜索結(jié)果集。使用mysql很簡單。從命令解釋符提示來調(diào)用它:shell>mysqldb_name或:shell>mysql--user=user_name--password=your_passworddb_name這樣輸入一個SQL語句,用‘;’、\g或者\(yùn)G結(jié)尾并按回車鍵。也可以這樣:1命令選項(xiàng)mysql支持下面的選項(xiàng):·help,-?顯示幫助消息并退出?!?-batch,-B打印結(jié)果,使用tab作為列間隔符,每個行占用新的一行。使用該選項(xiàng),則mysql不使用歷史文件?!?-character-sets-dir=path字符集的安裝目錄。·--compress,-C壓縮在客戶端和服務(wù)器之間發(fā)送的所有信息(如果二者均支持壓縮)?!atabase=db_name,-Ddb_name要使用的數(shù)據(jù)庫。主要在選項(xiàng)文件中有用。·debug[=debug_options],-#[debug_options]寫調(diào)試日志。debug_options字符串通常為'd:t:o,file_name'。默認(rèn)為'd:t:o,/tmp/mysql.trace'?!ebug-info,-T當(dāng)程序退出時輸出部分調(diào)試信息。·--default-character-set=charset使用charsetas作為默認(rèn)字符集?!?-execute=statement,-estatement執(zhí)行語句并退出。默認(rèn)輸出格式與用--batch產(chǎn)生的相同。二mysql命令mysql將發(fā)出的SQL語句發(fā)送到待執(zhí)行的服務(wù)器。還有一系列命令mysql可以自己解釋。要查看這些命令,在mysql>提示下輸入help或\h:每個命令有長形式和短形式。長形式對大小寫不敏感;短形式敏感。在delimiter命令中,應(yīng)避免使用反斜線(‘\’),因?yàn)檫@是MySQL的轉(zhuǎn)義符。Edit、nopager、pager和system命令只在Unix中工作。status命令提供連接和使用的服務(wù)器相關(guān)的部分信息。如果用--safe-updates模式運(yùn)行,status也打印影響查詢的MySQL變量的值。要想記錄查詢及其輸出,應(yīng)使用tee命令。屏幕上顯示的所有數(shù)據(jù)被追加到給定的文件后面。這對于調(diào)試也很有用。可以用--tee選項(xiàng)在命令行中啟用該特性,或者用tee命令交互式啟用??梢杂胣otee命令交互式禁用tee文件。再次執(zhí)行tee可以重新啟用日志。前面的文件使用時不帶任何參數(shù)。請注意執(zhí)行完每個語句后tee可以將查詢結(jié)果刷新到一個文件中,并且在mysql打印下一個提示前刷新。用r選項(xiàng),可以用交互式模式使用Unix程序,例如less、more或者其它類似的程序,來瀏覽或搜索查詢結(jié)果。如果未指定該選項(xiàng)的值,mysql檢查PAGER環(huán)境變量的值并將PAGER設(shè)為該值??梢杂胮ager命令交互式啟用輸出分頁,并用nopager禁用。該命令采用可選參量;如果給出,分頁程序設(shè)置為該值。如果沒有給出參量,分頁器被設(shè)置為在命令行中設(shè)置的分頁器的值,如果未指定分頁器,則設(shè)置為stdout。輸出分頁只適合Unix,因?yàn)樗褂胮open()函數(shù),該函數(shù)在Windows中不存在。在Windows中,可以使用tee選項(xiàng)來保存查詢輸出,盡管在某些情況下瀏覽輸出時不如pager方便。

第五講語言結(jié)構(gòu)文字值包括字符串、數(shù)值、十六進(jìn)制值、布爾值和NULL。一字符串字符串指用單引號(‘'’)或雙引號(‘"’)引起來的字符序列。例如:'astring'"anotherstring"在字符串中,某些序列具有特殊含義。這些序列均用反斜線(‘\’)開始,即所謂的轉(zhuǎn)義字符。MySQL識別下面的轉(zhuǎn)義序列:這些序列對大小寫敏感。例如,‘\b’解釋為退格,但‘\B’解釋為‘B’。‘\%’和‘\_’序列用于搜索可能會解釋為通配符的模式匹配環(huán)境中的‘%’和‘_’文字實(shí)例。請注意如果你在其它環(huán)境中使用‘\%’或‘\_’,它們返回字符串‘\%’和‘\_’,而不是‘%’和‘_’。在其它轉(zhuǎn)義序列中,反斜線被忽略。也就是說,轉(zhuǎn)義字符解釋為仿佛沒有轉(zhuǎn)義。有幾種方式可以在字符串中包括引號:·在字符串內(nèi)用‘'’引用的‘'’可以寫成‘''’。·在字符串內(nèi)用‘"’引用的‘"’可以寫成‘""’?!た梢栽谝柷凹愚D(zhuǎn)義字符(‘\’)。·在字符串內(nèi)用‘"’引用的‘'’不需要特殊處理,不需要用雙字符或轉(zhuǎn)義。同樣,在字符串內(nèi)用‘'’引用的‘"’也不需要特殊處理。下面的SELECT語句顯示了引用和轉(zhuǎn)義如何工作:mysql>SELECT'hello','"hello"','""hello""','hel''lo','\'hello';mysql>SELECT"hello","'hello'","''hello''","hel""lo","\"hello";mysql>SELECT'This\nIs\nFour\nLines';mysql>SELECT'disappearing\backslash';二數(shù)值整數(shù)用一系列阿拉伯?dāng)?shù)字表示。浮點(diǎn)數(shù)使用‘.’作為十進(jìn)制間隔符。兩種類型的數(shù)值均可以在前面加一個‘-’來表示負(fù)值。合法整數(shù)的例子:12210-32合法浮點(diǎn)數(shù)的例子:294.42-32032.6809e+10148.00整數(shù)可以用在浮點(diǎn)環(huán)境中;它被解釋為與浮點(diǎn)數(shù)等效。三十六進(jìn)制值MySQL支持十六進(jìn)制值。在數(shù)字上下文中,十六進(jìn)制數(shù)如同整數(shù)(64位精度)。在字符串上下文,如同二進(jìn)制字符串,每對十六進(jìn)制數(shù)字被轉(zhuǎn)換為一個字符:mysql>SELECTx'4D7953514C';mysql>SELECT0xa+0;mysql>SELECT0x5061756c;十六進(jìn)制值的默認(rèn)類型是字符串。如果想要確保該值作為數(shù)字處理,可以使用CAST(...ASUNSIGNED):mysql>SELECT0x41,CAST(0x41ASUNSIGNED);0x語法基于ODBC。十六進(jìn)制字符串通常用于ODBC以便為BLOB列提供值。x’hexstring’語法基于標(biāo)準(zhǔn)SQL??梢杂肏EX()函數(shù)將一個字符串或數(shù)字轉(zhuǎn)換為十六進(jìn)制格式的字符串:mysql>SELECTHEX('cat');mysql>SELECT0x636174;四布爾值常量TRUE等于1,常量FALSE等于0。常量名可以寫成大寫或小寫。mysql>SELECTTRUE,true,F(xiàn)ALSE,false;

MySQL添加用戶的兩種方法(2)有2個不同的方法增加用戶:通過使用GRANT語句或通過直接操作MySQL授權(quán)表。比較好的方法是使用GRANT語句,因?yàn)樗麄兪歉喢鞑⑶液孟皴e誤少些。下面的例子顯示出如何使用MySQL客戶安裝新用戶。這些例子假定權(quán)限已缺省被安裝。這意味著為了改變,你必須在MySQL正在運(yùn)行同一臺機(jī)器上,你必須作為MySQLroot用戶連接,并且root用戶必須對MySQL數(shù)據(jù)庫有insert權(quán)限和reload管理權(quán)限。另外,如果你改變了root用戶口令,你必須如下的MySQL命令指定它。你可以通過發(fā)出GRANT語句增加新用戶:shell>mysql--user=rootmysqlmysql>GRANTALLPRIVILEGESON*.*TOmonty@localhostIDENTIFIEDBY'something'WITHGRANTOPTION;mysql>GRANTALLPRIVILEGESON*.*TOmonty@"%"IDENTIFIEDBY'something'WITHGRANTOPTION;mysql>GRANTRELOAD,PROCESSON*.*TOadmin@localhost;mysql>GRANTUSAGEON*.*TOdummy@localhost;這些GRANT語句安裝3個新用戶:monty:可以從任何地方連接服務(wù)器的一個完全的超級用戶,但是必須使用一個口令('something'做這個。注意,我們必須對monty@localhost和monty@"%"發(fā)出GRANT語句。如果我們增加localhost條目,對localhost的匿名用戶條目在我們從本地主機(jī)連接接時由mysql_install_db創(chuàng)建的條目將優(yōu)先考慮,因?yàn)樗懈囟ǖ腍ost字段值,所以以user表排列順序看更早到來。admin:可以從localhost沒有一個口令進(jìn)行連接并且被授予reload和process管理權(quán)限的用戶。這允許用戶執(zhí)行mysqladminreload、mysqladminrefresh和mysqladminflush-*命令,還有mysqladminprocesslist。沒有授予數(shù)據(jù)庫有關(guān)的權(quán)限。他們能在以后通過發(fā)出另一個GRANT語句授權(quán)。dummy:可以不用一個口令連接的一個用戶,但是只能從本地主機(jī)。全局權(quán)限被設(shè)置為'N'--USAGE權(quán)限類型允許你無需權(quán)限就可設(shè)置一個用戶。它假定你將在以后授予數(shù)據(jù)庫相關(guān)的權(quán)限。你也可以直接通過發(fā)出INSERT語句增加同樣的用戶存取信息,然后告訴服務(wù)器再次裝入授權(quán)表:shell>mysql--user=rootmysqlmysql>INSERTINTOuserVALUES('localhost','monty',PASSWORD('something'),'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y')mysql>INSERTINTOuserVALUES('%','monty',PASSWORD('something'),'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y')mysql>INSERTINTOuserSETHost='localhost',User='admin',Reload_priv='Y',Process_priv='Y';mysql>INSERTINTOuser(Host,User,Password)VALUES('localhost','dummy','');mysql>FLUSHPRIVILEGES;取決于你的MySQL版本,對上述,你可能必須使用一個不同數(shù)目'Y'值(在3.22.11以前的版本有更少的權(quán)限列)。對admin用戶,只用在3.22.11開始的版本具有的更加可讀的INSERT擴(kuò)充的語法。注意,為了設(shè)置一個超級用戶,你只需創(chuàng)造一個user表?xiàng)l目,其權(quán)限字段設(shè)為'Y'。不需要db或host表的條目。在user表中的權(quán)限列不是由最后一個INSERT語句明確設(shè)置的(對dummy用戶),因此那些列被賦予缺省值'N'。這是

溫馨提示

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

評論

0/150

提交評論