版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
MySQL新手入門(mén)目錄TOC\h\h(1)重新開(kāi)始\h(2)數(shù)據(jù)庫(kù)概論和MySQL安裝\h(3)SELECT基礎(chǔ)查詢(xún)\h(4)運(yùn)算式和函數(shù)\h(5)JOIN和UNION查詢(xún)\h(6)CRUD和資料維護(hù)\h(7)字符集和數(shù)據(jù)庫(kù)\h(8)存儲(chǔ)引擎和數(shù)據(jù)類(lèi)型\h(9)表格和索引\h(10)子查詢(xún)\h(11)視圖\h(12)預(yù)處理語(yǔ)句\h(13)存儲(chǔ)過(guò)程入門(mén)\h(14)存儲(chǔ)過(guò)程的變量和流程\h(15)存儲(chǔ)過(guò)程進(jìn)階\h(16)觸發(fā)器\h(17)資料庫(kù)資訊\h(18)錯(cuò)誤處理和查詢(xún)\h(19)導(dǎo)入和導(dǎo)出數(shù)據(jù)\h(20)性能\hCoverPageMySQL與SQLMySQL在資訊應(yīng)用的角色,好像跟三國(guó)演義這本著作有點(diǎn)類(lèi)似。MySQL是目前最普及的資料庫(kù)伺服器,可是大家也最不在意它,可能因?yàn)樗且惶酌赓M(fèi)的軟體,如果不要對(duì)它太過(guò)份,它會(huì)默默的在電腦中為你服務(wù),在一般情況下都不太會(huì)出問(wèn)題。MySQL跟其它一般的資料庫(kù)一樣,同樣支援ANSISQL92,也加入少許MySQL自己特別的指令。不論是網(wǎng)頁(yè)或應(yīng)用程式的開(kāi)發(fā)人員,當(dāng)你第一次接觸資料庫(kù),學(xué)習(xí)SQL這種古老的指令,應(yīng)該不會(huì)覺(jué)得太難。如果你正要進(jìn)入開(kāi)發(fā)應(yīng)用程式的領(lǐng)域,在學(xué)習(xí)的路上,你會(huì)分配給SQL的時(shí)間應(yīng)該也不會(huì)太多,因?yàn)樗淌秸Z(yǔ)言比較起來(lái)是比較單純一些的。因?yàn)镸ySQL和SQL幾乎是最常見(jiàn)的應(yīng)用,而且大家也覺(jué)得它們是簡(jiǎn)單的,當(dāng)然就不會(huì)在它們身上花太多時(shí)間。所以慢慢的我們會(huì)發(fā)現(xiàn)一些情況,有一些應(yīng)用程式發(fā)生的問(wèn)題,其實(shí)是來(lái)自MySQL資料庫(kù)伺服器和應(yīng)用程式中的SQL敘述,這些問(wèn)題相對(duì)是比較單純的,只是大家忽略了。例如MySQL提供方便好用的「LIMIT」子句,在應(yīng)用程式中讓開(kāi)發(fā)人員可以很容易完成一些特定的功能,例如網(wǎng)頁(yè)應(yīng)用程式中的分頁(yè)查詢(xún)。不過(guò)LIMIT子句是MySQL才有的,如果應(yīng)用程式更換資料庫(kù)伺服器,例如Oracle,應(yīng)用程式就會(huì)產(chǎn)生一堆錯(cuò)誤了。還有資料庫(kù)的交易(transaction)管理,MySQL預(yù)設(shè)的MYISAM儲(chǔ)存引擎并沒(méi)有支***易管理,因?yàn)楸容^簡(jiǎn)單一些,所以運(yùn)作的效率也會(huì)比較好;如果應(yīng)用程式需要執(zhí)行交易管理,就要在建立資料庫(kù)的時(shí)候指定儲(chǔ)存引擎為InnoDB。各種關(guān)于MySQL資料庫(kù)管理和SQL的問(wèn)題,開(kāi)發(fā)人員通常在遇到錯(cuò)誤的時(shí)候,才會(huì)開(kāi)始尋求解決問(wèn)題的方法。這似乎也是MySQL的宿命,因?yàn)槲覀冸m然一直在使用它,可是卻不太重視它,也認(rèn)為這本來(lái)就是合理的,開(kāi)發(fā)人員不應(yīng)該分配太多時(shí)間給它。有一個(gè)很明顯的情況,在逛書(shū)局的時(shí)候,你應(yīng)該已經(jīng)看不到只有討論關(guān)于MySQL和SQL的書(shū)籍了。OCPMySQL5Developer在我們臺(tái)灣這里,跟開(kāi)發(fā)人員相關(guān)的認(rèn)證考試,這應(yīng)該算是最冷門(mén)的OCP認(rèn)證科目之一。這個(gè)認(rèn)證考試的主要內(nèi)容是MySQL的SQL,通過(guò)這個(gè)考試的人,表示它具備在應(yīng)用程式中使用SQL的技能。你應(yīng)該會(huì)覺(jué)的這是一個(gè)有點(diǎn)詭異的認(rèn)證考試,它好像沒(méi)有存在的必要。對(duì)一個(gè)有經(jīng)驗(yàn)的開(kāi)發(fā)人員來(lái)說(shuō),使用SQL的技能就像是本來(lái)就應(yīng)該存在的,你甚至已經(jīng)忘記當(dāng)初是怎么學(xué)會(huì)SQL;對(duì)一個(gè)新手來(lái)說(shuō),不會(huì)有人建議你去買(mǎi)一本關(guān)于SQL的書(shū)籍來(lái)學(xué)習(xí)這方面的技能,因?yàn)榭赡芤操I(mǎi)不到了,不過(guò)有各種網(wǎng)站提供SQL的學(xué)習(xí),認(rèn)識(shí)一些基礎(chǔ)的敘述后,遇到問(wèn)題再說(shuō)吧!SQL在目前的環(huán)境下,越來(lái)越不受到開(kāi)發(fā)人員的關(guān)愛(ài),尤其是現(xiàn)在各種關(guān)于資料庫(kù)應(yīng)用的框架,例如Hibernate和MyBatis,它們的任務(wù)就是要?dú)⑺繱QL這只遠(yuǎn)古巨獸,讓開(kāi)發(fā)人員不用受到SQL的煎熬。我也認(rèn)為開(kāi)發(fā)應(yīng)用程式一直是一件很困難的事情,各種越來(lái)越進(jìn)步的科技讓生活更方便,可是應(yīng)用程式開(kāi)發(fā)技術(shù)卻越來(lái)越復(fù)雜,開(kāi)發(fā)人員必須具備的技能也更多,如果真的能有一種技術(shù)可以完全消滅SQL,那絕對(duì)是一件非常美好的事情。不過(guò)目前的情況應(yīng)該還是有很多困難,就以大約十年前的應(yīng)用程式來(lái)說(shuō),SQL還是一個(gè)必要的成員,除非放棄原來(lái)已經(jīng)運(yùn)作正常的程式,否則你還是要面對(duì)這些冗長(zhǎng)的SQL敘述。這就是「MySQL超新手入門(mén)」系列文章的目的,內(nèi)容的范圍涵蓋OCPMySQL5Developer認(rèn)證考試,因?yàn)樗姆秶彩且粋€(gè)開(kāi)發(fā)人員必須具備的SQL技能。從安裝MySQL資料庫(kù)與相關(guān)的工具程式開(kāi)始,到學(xué)習(xí)所有MySQL提供的SQL,雖然是針對(duì)MySQL資料庫(kù)撰寫(xiě)的,不過(guò)絕大部份都符合ANSISQL92的標(biāo)準(zhǔn),也就是在其它資料庫(kù)產(chǎn)品也可以正確的運(yùn)作。內(nèi)容規(guī)劃為19章:數(shù)據(jù)庫(kù)概論與MySQL安裝SELECT基礎(chǔ)查詢(xún)表達(dá)式和函數(shù)JOIN和UNION查詢(xún)CRUD和數(shù)據(jù)維護(hù)字符集和數(shù)據(jù)庫(kù)儲(chǔ)存引擎和數(shù)據(jù)類(lèi)型表格和索引子查詢(xún)視圖預(yù)處理語(yǔ)句存儲(chǔ)過(guò)程入門(mén)存儲(chǔ)過(guò)程的變量和流程存儲(chǔ)過(guò)程進(jìn)階觸發(fā)器資料庫(kù)資訊錯(cuò)誤處理和查詢(xún)導(dǎo)入和導(dǎo)出數(shù)據(jù)性能在第一章介紹基本的資料庫(kù)概念與安裝需要的軟體后,第二章到第五章討論基本的新增、修改、刪除和查詢(xún);第六章到第八章討論資料庫(kù)、表格和索引的建立與管理,這個(gè)部份的內(nèi)容會(huì)有比較多MySQL獨(dú)有的特色;第九章是子查詢(xún);第十章到第十五章討論資料庫(kù)進(jìn)階的應(yīng)用,這些在其它資料庫(kù)產(chǎn)品都會(huì)提供類(lèi)似的技術(shù),例如Oracle的PL/SQL;第十六章到第十九章討論的內(nèi)容比較偏向于資料庫(kù)管理和效率的進(jìn)階應(yīng)用,這些也是一個(gè)開(kāi)發(fā)人員需要了解的。注:紅樓夢(mèng)在文學(xué)上的重視讓它演變成一門(mén)「紅學(xué)」,可是紅樓夢(mèng)的故事與人物對(duì)一般人來(lái)說(shuō),卻不如三國(guó)演義來(lái)得熟悉目錄\h1、存儲(chǔ)與管理資料\h1.1資料庫(kù)管理系統(tǒng)與資料庫(kù)伺服器\h1.2資料庫(kù)\h2.SQL介紹\h3.MySQLWorkbench\h4.下載與安裝MySQL資料庫(kù)\h5.安裝范例資料庫(kù)1、存儲(chǔ)與管理資料儲(chǔ)存與管理資料一直是資訊應(yīng)用上最基本、也是最常見(jiàn)的技術(shù)。在還沒(méi)有使用電腦來(lái)管理你的資料時(shí),你可能會(huì)使用這樣的方式來(lái)保存世界上所有的國(guó)家資料:這樣的作法在生活中是很常見(jiàn)的,例如親友的通訊錄,你可能也會(huì)使用一張卡片來(lái)記錄一個(gè)親友的通訊資料,上面有名字、電話、住址,與所有你想要保存的資料。這種保存資料的方式很直接,也很省錢(qián)。不過(guò)你應(yīng)該會(huì)遇到這樣的問(wèn)題:如果你買(mǎi)了一臺(tái)電腦,電腦中也安裝了一種工作表的軟體,像這類(lèi)國(guó)家或是親友通訊錄的資料,可能就會(huì)用這樣的方式把它們儲(chǔ)存在電腦里面:使用這種工作表來(lái)儲(chǔ)存國(guó)家資料,當(dāng)然比用卡片好多了,尤其是想要尋找某個(gè)國(guó)家的資料,然后修改它的人口數(shù)量。雖然方便多了,不過(guò)在你查詢(xún)國(guó)家資料時(shí),可能會(huì)有這樣的問(wèn)題:你不太可能把一個(gè)洲的國(guó)家資料,儲(chǔ)存為一個(gè)工作表檔案;就算你這么作了,如果你想要查詢(xún)?nèi)丝跀?shù)小于十萬(wàn)的國(guó)家時(shí),你會(huì)發(fā)現(xiàn)這會(huì)是一件很困難的工作。1.1資料庫(kù)管理系統(tǒng)與資料庫(kù)伺服器在資訊的應(yīng)用軟體中,「資料庫(kù)管理系統(tǒng)」是一種用來(lái)儲(chǔ)存與管理資料的軟體,它使用安全、穩(wěn)定與有效率的方式把資料儲(chǔ)存起來(lái),也可以方便與快速的維護(hù)資料。尤其是資料的數(shù)量很龐大的時(shí)候,使用資料庫(kù)管理系統(tǒng)來(lái)儲(chǔ)存與管理資料,會(huì)是一種令人安心而且比較有效率的方式。資料庫(kù)管理系統(tǒng)是一種軟體程式,它主要的工作就是儲(chǔ)存與管理資料,如果你把這個(gè)軟體程式安裝在一臺(tái)電腦中,這臺(tái)電腦就會(huì)稱(chēng)為「資料庫(kù)伺服器」:在你有了一臺(tái)資料庫(kù)伺服器以后,你就可以依照自己的需求,使用資料庫(kù)管理系統(tǒng)建立一些資料庫(kù):1.2資料庫(kù)在使用資料庫(kù)前,要先在資料庫(kù)伺服器中建立需要的「資料庫(kù)、database」,你會(huì)依照自己的需求,建立一個(gè)或多個(gè)資料庫(kù):各種資料庫(kù)伺服器軟體通常會(huì)提供一些用戶(hù)端軟體程式,讓使用者可以輸入與執(zhí)行SQL敘述,或是執(zhí)行管理與設(shè)定資料庫(kù)的工作:以?xún)?chǔ)存世界資料的資料庫(kù)來(lái)說(shuō),你想要把世界上所有的國(guó)家、城市和語(yǔ)言資料,在這個(gè)資料庫(kù)中儲(chǔ)存與管理。所以你會(huì)針對(duì)國(guó)家資料的部份,在世界資料庫(kù)中建立一個(gè)儲(chǔ)存國(guó)家資料的「表格、table」:儲(chǔ)存在世界資料庫(kù)中的國(guó)家資料,隨時(shí)可以依照不同的需求,查詢(xún)需要的國(guó)家資料:除了國(guó)家表格外,你還會(huì)在世界資料庫(kù)中建立儲(chǔ)存城市和語(yǔ)言資料的表格:2.SQL介紹有許多廠商開(kāi)發(fā)各種不同的資料庫(kù)管理系統(tǒng)產(chǎn)品,它們都可以執(zhí)行儲(chǔ)存與管理資料的工作,而且使用的方式都是差不多的。執(zhí)行資料儲(chǔ)存與管理的工作,主要有建立資料庫(kù)與表格,和執(zhí)行資料的新增、修改、刪除與查詢(xún)。想要請(qǐng)資料庫(kù)管理系統(tǒng)執(zhí)行這些工作,你會(huì)使用一種叫作「StructuredQueryLanguage、SQL」的敘述,一般會(huì)把「SQL」念為「sequel」。SQL在很久以前就已經(jīng)是一種標(biāo)準(zhǔn)的技術(shù),不同的資料庫(kù)管理系統(tǒng)產(chǎn)品,在執(zhí)行資料庫(kù)的工作時(shí),使用的SQL的敘述幾乎是一樣的:SQL有一套國(guó)際通用的標(biāo)準(zhǔn),里面規(guī)定了所有執(zhí)行資料庫(kù)工作的SQL敘述要怎么寫(xiě),不同的資料庫(kù)管理系統(tǒng)產(chǎn)品都會(huì)以這套標(biāo)準(zhǔn)為基礎(chǔ)。不過(guò)不同的產(chǎn)品通常會(huì)增加或修改一些SQL敘述,其它的資料庫(kù)管理系統(tǒng)就不認(rèn)識(shí)這些SQL敘述了。與資料庫(kù)伺服器相對(duì)的是「用戶(hù)端、client」,跟資料庫(kù)伺服器比起來(lái),用戶(hù)端就會(huì)比較復(fù)雜一些:使用像是Java程式設(shè)計(jì)技術(shù)開(kāi)發(fā)的各種應(yīng)用程式,例如進(jìn)銷(xiāo)存系統(tǒng)或會(huì)計(jì)系統(tǒng),對(duì)資料庫(kù)伺服器來(lái)說(shuō),也算是一種用戶(hù)端軟體:不論是哪一種用戶(hù)端軟體,它們都是使用SQL敘述跟資料庫(kù)溝通:3.MySQLWorkbenchMySQL提供的工具軟體,在這幾年有很大的進(jìn)步,目前已經(jīng)把所有常用的軟體整合在一起,稱(chēng)為MySQLWorkbench,里面包含:SQLDevelopment:SQL開(kāi)發(fā)工具,讓使用者輸入并執(zhí)行SQL敘述DatabaseDesignModeling:資料庫(kù)設(shè)計(jì)與模型工具DatabaseAdministration:資料庫(kù)管理工具DatabaseMigration:資料庫(kù)轉(zhuǎn)換工具SQLDevelopment是這個(gè)系列文章使用的工具軟體,使用這個(gè)內(nèi)建的工具,可以很方便輸入需要執(zhí)行的SQL敘述,并檢視執(zhí)行后的結(jié)果:DatabaseDesignModeling是一個(gè)圖形化的資料庫(kù)設(shè)計(jì)工具,可以幫助開(kāi)發(fā)人員設(shè)計(jì)需要的資料庫(kù),或是產(chǎn)生資料庫(kù)模型的文件:DatabaseAdministration可以提供開(kāi)發(fā)人員執(zhí)行管理MySQL資料庫(kù)的基本功能,也可以監(jiān)控資料庫(kù)的狀態(tài):4.下載與安裝MySQL資料庫(kù)如果你已經(jīng)安裝過(guò)MySQL資料庫(kù)和可以輸入和執(zhí)行SQL敘述的軟體,接下來(lái)的內(nèi)容就可以忽略,直接到第五節(jié)安裝范例資料庫(kù)就可以了。MySQL的官方網(wǎng)站目前提供一個(gè)完整的安裝程式,在Windows平臺(tái)只要下載與安裝一個(gè)檔案,就包含資料庫(kù)伺服器和所有需要的工具軟體,包含這里需要使用的MySQLWorkbench。你可以到這個(gè)連結(jié)準(zhǔn)備開(kāi)始下載:\h/downloads/windows/installer/進(jìn)入這個(gè)網(wǎng)站以后,參考下面的說(shuō)明,下載與儲(chǔ)存完整的安裝檔案:下載完成后,執(zhí)行安裝程式,選擇開(kāi)始安裝并同意版權(quán)聲明后,在選擇安裝種類(lèi)的畫(huà)面選擇DeveloperDefault:后面的步驟依照畫(huà)面的指示,選擇Execute或Next,就會(huì)進(jìn)入開(kāi)始安裝的步驟。安裝完成后,就可以準(zhǔn)備進(jìn)入設(shè)定MySQL資料庫(kù)的步驟:依照畫(huà)面的指示,選擇Next進(jìn)入設(shè)定資料庫(kù)管理員(root)密碼的步驟,輸入一個(gè)你自己決定的密碼:依照畫(huà)面的指示,選擇Next完成設(shè)定資料庫(kù)的工作。在最后完成安裝與設(shè)定的步驟,勾選StartMySQLWorkbenchafterSetup選項(xiàng)后,選擇Finish結(jié)束安裝與設(shè)定MySQL資料庫(kù)的工作。安裝程式會(huì)啟動(dòng)MySQLWorkbench,依照下面的說(shuō)明,準(zhǔn)備設(shè)定資料庫(kù)連線的基本資訊:選擇下面畫(huà)面說(shuō)明的按鈕:在出現(xiàn)的對(duì)話框中輸入在安裝過(guò)程中決定的密碼:選擇TestConnection按鈕:如果出現(xiàn)這樣的畫(huà)面,表示可以正確的連線到MySQL資料庫(kù):在MySQLWorkbench主畫(huà)面選擇Connect:連線到資料庫(kù)后,在左側(cè)的World資料庫(kù)名稱(chēng)上點(diǎn)兩下(Doubleclick),會(huì)發(fā)現(xiàn)World會(huì)變成粗體字,表示目前開(kāi)啟(作用中)的資料庫(kù)。在畫(huà)面中輸入一個(gè)測(cè)試的SQL敘述,SELECT*FROMcountry。輸入完后,按下執(zhí)行敘述的快速鍵Ctrl+Enter,就可以看到所有的國(guó)家資料:5.安裝范例資料庫(kù)完成前面的安裝與設(shè)定工作后,MySQL資料庫(kù)伺服器中已經(jīng)有一個(gè)內(nèi)建的范例資料庫(kù)world,后面的文章會(huì)使用這個(gè)資料庫(kù)討論與說(shuō)明一些主題。不過(guò)因?yàn)檫@個(gè)資料庫(kù)比較簡(jiǎn)單一些,所以要請(qǐng)你安裝另外一個(gè)范例資料庫(kù),后面的文章討論到一些不同的主題時(shí),就會(huì)用到這個(gè)額外的范例資料庫(kù)。在下面的連結(jié)按滑鼠右鍵后,選擇另存連結(jié),下載與儲(chǔ)存一個(gè)建立資料庫(kù)的SQLScript檔案:\h/u/61562257/cmdev.sql在MySQLWorkbench中選擇File->OpenSQLScript,選擇剛才下載與儲(chǔ)存的檔案,就可以看到像這樣的畫(huà)面:在MySQLWorkbench中選擇Query->Execute(AllorSelection),Workbench會(huì)花一點(diǎn)時(shí)間執(zhí)行所有的敘述。執(zhí)行完成后,在資料庫(kù)列表區(qū)塊的任何空白位置,按滑鼠右鍵后選擇RefreshAll,就可以看到安裝好的新資料庫(kù)cmdev:完成所有準(zhǔn)備工作,下一篇文章就可以開(kāi)始進(jìn)入SQL的世界了。目錄\h1查詢(xún)資料前的基本概念\h1.1表格、紀(jì)錄與欄位\h1.2認(rèn)識(shí)資料型態(tài)\h2查詢(xún)敘述\h2.1指定使用中的資料庫(kù)\h2.2只有SELECT\h2.3指定欄位與表格\h2.4指定需要的欄位\h2.5數(shù)學(xué)運(yùn)算\h2.6別名\h3條件查詢(xún)\h3.1比較運(yùn)算子\h3.2邏輯運(yùn)算子\h3.3其它條件運(yùn)算子\h3.4NULL值的判斷\h3.5字串樣式\h4排序\h5限制查詢(xún)\h5.1指定回傳紀(jì)錄數(shù)量\h5.2排除重復(fù)紀(jì)錄1查詢(xún)資料前的基本概念1.1表格、紀(jì)錄與欄位表格是資料庫(kù)儲(chǔ)存資料的基本元件,它是由一些欄位組合而成的,儲(chǔ)存在表格中的每一筆紀(jì)錄就擁有這些欄位的資料。以?xún)?chǔ)存城市資料的表格「city」來(lái)說(shuō),設(shè)計(jì)這個(gè)表格的人希望一個(gè)城市資料需要包含編號(hào)、名稱(chēng)、國(guó)家代碼、區(qū)域和人口數(shù)量,所以他為「city」表格設(shè)計(jì)了這些「欄位(column)」:儲(chǔ)存在表格中的每一筆資料稱(chēng)為「列(row)」或「紀(jì)錄(record)」:在設(shè)計(jì)表格的時(shí)候,通常會(huì)指定一個(gè)欄位為「主索引鍵(primarykey)」:注:主索引鍵會(huì)在「第八章、表格與索引」中詳細(xì)的討論。1.2認(rèn)識(shí)資料型態(tài)資料庫(kù)中可以?xún)?chǔ)存各種不同的資料,SQL提供許多不同的「資料型態(tài)」讓你應(yīng)付這些不同的需求。在開(kāi)始查詢(xún)資料之前,你要先認(rèn)識(shí)最常見(jiàn)、也是最基本的資料型態(tài)。第一種是數(shù)值,為了更精準(zhǔn)的保存數(shù)值資料,SQL提供整數(shù)與小數(shù)兩種數(shù)值型態(tài):你可以依照自己的需求,使用儲(chǔ)存的數(shù)值資料執(zhí)行數(shù)學(xué)運(yùn)算:常用的資料型態(tài)還有「字串」與「日期」:在SQL敘述中使用字串資料的時(shí)候,字串資料的前后要使用單引號(hào)或雙引號(hào):使用日期資料的時(shí)候,MySQL資料庫(kù)預(yù)設(shè)的日期格式是「年-月-日」。與字串資料一樣,前后也要使用單引號(hào)或雙引號(hào):注:字串與日期資料型態(tài)會(huì)在「第七章、儲(chǔ)存引擎與資料型態(tài)、欄位資料型態(tài)」中詳細(xì)的討論。另外一種在資料庫(kù)中比較特殊的資料型態(tài)是「NULL」,它不像數(shù)值、字串或日期資料型態(tài)是一個(gè)明確的資料,「NULL」是用來(lái)表示「不確定」、「未知」或「沒(méi)有」的資料:2查詢(xún)敘述在執(zhí)行資料庫(kù)的操作中,查詢(xún)算是最常見(jiàn)也是最復(fù)雜的工作,所以一個(gè)查詢(xún)敘述所使用到的子句也最多,下列是查詢(xún)敘述的基本語(yǔ)法:這一章會(huì)討論「SELECT」、「FROM」、「WHERE」、「ORDERBY」和「LIMIT」五個(gè)子句組合起來(lái)的查詢(xún)敘述。其它的子句會(huì)在下一章繼續(xù)討論。在你使用「SELECT」搭配各種子句來(lái)查詢(xún)資料時(shí),要特別注意子句使用的順序:就算你每一個(gè)子句的寫(xiě)法都沒(méi)有出錯(cuò),如果順序不對(duì)了:2.1指定使用中的資料庫(kù)一個(gè)資料庫(kù)伺服器可以建立許多需要的資料庫(kù),所以在你執(zhí)行任何資料庫(kù)的操作前,通常要先指定使用的資料庫(kù)。下列是指定資料庫(kù)的指令:如果你使用「MySQLWorkbench」這類(lèi)的工具軟體,畫(huà)面上看起來(lái)會(huì)像這樣:2.2只有SELECT一個(gè)SQL查詢(xún)敘述一定要以「SELECT」子句開(kāi)始,再搭配其它的子句完成查詢(xún)資料的工作。你可以單獨(dú)使用「SELECT」子句,只不過(guò)這樣的用法跟資料庫(kù)一點(diǎn)關(guān)系都沒(méi)有,它只不過(guò)把你輸入的內(nèi)容顯示出來(lái)而已:例如下列的查詢(xún)敘述,只是簡(jiǎn)單的顯示字串和計(jì)算結(jié)果,并不會(huì)查詢(xún)資料庫(kù)中的資料:SELECT'MynameisSimonJohnson',35*12
2.3指定欄位與表格一般所謂的查詢(xún)敘述,通常是查詢(xún)資料庫(kù)中的資料,所以「SELECT」子句會(huì)搭配「FROM」子句來(lái)使用,而「SELECT」后面可以指定「*」表示要查詢(xún)指定表格的所有欄位:如果目前使用中的資料庫(kù)為「world」,下列的敘述可以查詢(xún)「world」資料庫(kù)中,「city」表格的所有資料:SELECT*FROMcity
一個(gè)資料庫(kù)伺服器可以建立許多需要的資料庫(kù),所以在你執(zhí)行任何資料庫(kù)的操作前,都要使用「USE」敘述指定一個(gè)使用中的資料庫(kù)。不過(guò)你也可以在SQL敘述中使用下列的語(yǔ)法來(lái)指定資料庫(kù):如果目前使用中的資料庫(kù)是「world」,你不用先使用「USEcmdev」敘述切換使用中的資料庫(kù),可以使用下列的語(yǔ)法查詢(xún)「cmdev」資料庫(kù)中的「emp」表格:SELECT*FROMcmdev.emp
2.4指定需要的欄位有時(shí)候你并不需要查詢(xún)一個(gè)表格中所有的欄位,所以你可以在「SELECT」子句后面自己指定需要的欄位:如果你在「SELECT」后面使用「*」的話:你可以依照自己的需要決定要查詢(xún)哪些欄位和順序:2.5數(shù)學(xué)運(yùn)算除了查詢(xún)表格中的欄位外,你可以加入任何需要的運(yùn)算,這里先討論一般常見(jiàn)的數(shù)學(xué)運(yùn)算。下列是很常用來(lái)執(zhí)行數(shù)學(xué)運(yùn)算的運(yùn)算子:優(yōu)先順序運(yùn)算子說(shuō)明范例運(yùn)算結(jié)果1%余數(shù)7%311MOD余數(shù)7MOD311*乘7*3211/除7/32.3331DIV除(整數(shù))7DIV322+加7+3102-減7–34注:優(yōu)先順序的數(shù)字從1開(kāi)始,1表示優(yōu)先權(quán)比較高,2比較低,以此類(lèi)推。就跟一般數(shù)學(xué)運(yùn)算的先乘除后加減一樣:在一個(gè)運(yùn)算式中,優(yōu)先權(quán)高的先算完,再換低優(yōu)先權(quán)繼續(xù)算;同樣優(yōu)先權(quán)的就由左到右計(jì)算。你也可以在運(yùn)算式中使用左右括號(hào),括號(hào)中的運(yùn)算會(huì)先執(zhí)行。以「cmdev」資料庫(kù)中的員工表格(emp)來(lái)說(shuō),想要計(jì)算員工的年薪,就可以使用這些運(yùn)算子來(lái)完成你的查詢(xún)工作:2.6別名你可以另外為「SELECT」后面查詢(xún)的資料取一個(gè)自己想要的名稱(chēng),這個(gè)作法稱(chēng)為「別名(alias
name)」:取欄位別名會(huì)讓執(zhí)行查詢(xún)后的結(jié)果,使用你自己取的名稱(chēng)為欄位名稱(chēng):注:幫一般欄位取一個(gè)欄位別名是比較沒(méi)有必要的,如果是運(yùn)算式的話,通常就要幫它取一個(gè)欄位別名來(lái)取代原來(lái)一大串的運(yùn)算式。在取欄位別名的時(shí)候要特別注意下列的狀況:另外如果你「堅(jiān)持」要使用SQL語(yǔ)法中的保留字來(lái)當(dāng)作欄位別名的話:如果違反上列兩個(gè)規(guī)定,執(zhí)行敘述以后會(huì)發(fā)生錯(cuò)誤。3條件查詢(xún)使用「SELECT」和「FROM」執(zhí)行的查詢(xún)敘述,是把你在「FROM」子句指定表格里所有的紀(jì)錄傳回來(lái)。資料庫(kù)最大的好處就是可以隨時(shí)依照需要查詢(xún)部份紀(jì)錄資料,你可以搭配「WHERE」子句執(zhí)行查詢(xún)條件的設(shè)定:3.1比較運(yùn)算子要使用「WHERE」執(zhí)行查詢(xún)條件的設(shè)定,你會(huì)使用下列基礎(chǔ)的比較運(yùn)算子:|優(yōu)先順序|運(yùn)算子|說(shuō)明|
|1|=|等于|
|1|`|等于||1|
!=|不等于||1|
``|大于||1|
>=`|大于等于|注:``運(yùn)算子在后面「NULL值的判斷」會(huì)討論。使用這些基礎(chǔ)的比較運(yùn)算子就可以完成一些簡(jiǎn)單的條件設(shè)定:設(shè)定日期資料型態(tài)的條件也是很常見(jiàn)的:3.2邏輯運(yùn)算子查詢(xún)條件的設(shè)定,有時(shí)候會(huì)像前面討論的單一條件一樣,并不會(huì)太復(fù)雜;不過(guò)也很常遇到在一個(gè)查詢(xún)的需求中,需要設(shè)定一個(gè)以上的條件,那你就會(huì)用到下列的運(yùn)算子:優(yōu)先順序運(yùn)算子說(shuō)明1NOT非2&&而且2AND而且3||
或3OR或3XOR互斥「NOT」運(yùn)算子比較特殊一些,在一般的需求中,比較不會(huì)用到它。以下列的需求來(lái)說(shuō):如果想要查詢(xún)國(guó)家代碼是「TWN」,而且人口數(shù)量小于十萬(wàn)的城市,就必須設(shè)定兩個(gè)條件,而兩個(gè)條件之間,依照「而且」的需求,使用「AND」來(lái)結(jié)合兩個(gè)條件:如果想要查詢(xún)國(guó)家代碼是「TWN」或是「USA」的城市,在兩個(gè)條件之間依照「或」的需求,使用「OR」來(lái)結(jié)合兩個(gè)條件:在邏輯運(yùn)算子的介紹中,它們也同樣有「優(yōu)先順序」的。如果你想要查詢(xún)?cè)跉W洲(Europe)或非洲(Aftica)國(guó)家,而且人口數(shù)要小于一萬(wàn)。使用下列的查詢(xún)條件所得到的資料,跟你想要的卻不一樣:如果有多個(gè)查詢(xún)條件的設(shè)定,全部都是「AND」或全部都是「OR」的話,就沒(méi)有這類(lèi)問(wèn)題;如果查詢(xún)條件中,有「AND」和「OR」同時(shí)出現(xiàn)的話,就要依照你的需要,視情況加上左右刮號(hào)來(lái)控制條件的設(shè)定:3.3其它條件運(yùn)算子一般的條件和邏輯運(yùn)算子,已經(jīng)可以應(yīng)付大部份的查詢(xún)條件需求。下列還有一些可以用在特殊用途或是提供替代寫(xiě)法的條件設(shè)定:BETWEEN…AND…:范圍比較IN(…):成員比較IS:是…ISNOT:不是…LIKE:像…「BETWEEN…AND…」用來(lái)執(zhí)行一個(gè)指定范圍條件的設(shè)定:如果要查詢(xún)?nèi)丝跀?shù)量在八萬(wàn)到九萬(wàn)之間的城市資料,可以有下列兩種條件的寫(xiě)法,它們執(zhí)行以后的結(jié)果是完全一樣的:使用「BETWEEN…AND…」的條件設(shè)定會(huì)包含指定的資料,所以下列兩個(gè)查詢(xún)條件所得到的結(jié)果就不一樣了:「BETWEEN…AND…」使用在日期資料時(shí),也可以完成某一個(gè)日期范圍的判斷:「IN(…)」使用在一組成員資料的比對(duì)條件設(shè)定:下列兩個(gè)查詢(xún)敘述,都可以得到國(guó)家代碼是「TWN、USA、JPN、ITA和KOR」的城市資料,可是使用「IN(…)」來(lái)設(shè)定條件的話,看起來(lái)會(huì)簡(jiǎn)潔很多:3.4NULL值的判斷在國(guó)家表格中,有一個(gè)儲(chǔ)存平均壽命的欄位「LifeExpectancy」,不過(guò)資料庫(kù)中的資料并沒(méi)有很完整,所以有一些國(guó)家是沒(méi)有這個(gè)資料的,所以會(huì)使用「NULL」值來(lái)表示:如果想要查詢(xún)沒(méi)有平均壽命資料的國(guó)家,也就是平均壽命的欄位值是「NULL」,你可能會(huì)使用下列的敘述:SELECTName,LifeExpectancy
FROMcountry
WHERELifeExpectancy=NULL
上列的敘述執(zhí)行以后,并沒(méi)有傳回任何紀(jì)錄,這表示并沒(méi)有資料符合你設(shè)定的查詢(xún)條件。所以「NULL」值的判斷,不可以使用判斷一般資料的條件設(shè)定:注:``在判斷一般資料的時(shí)候,跟「=」完全一樣;不過(guò)它用在判斷「NULL」資料的時(shí)候,效果跟「IS」一樣。如果換成要查詢(xún)「有」平均壽命資料的國(guó)家,也就是平均壽命的欄位值不是「NULL」:3.5字串樣式在使用字串資料的條件判斷時(shí),會(huì)有一種很常見(jiàn)、也比較特殊的需求,像是「想要查詢(xún)名稱(chēng)以w字元開(kāi)始的城市」,如果你使用下列的查詢(xún)敘述:SELECTNameFROMcityWHEREName='w'
這樣的查詢(xún)條件,當(dāng)然不是「名稱(chēng)以w字元開(kāi)始的城市」,而是名稱(chēng)只有一個(gè)「w」字元的城市。所以這類(lèi)的查詢(xún)就會(huì)使用下列這個(gè)特殊的條件設(shè)定:上列語(yǔ)法中,在「LIKE」后面的「樣版」字串中,會(huì)使用到下列兩種「樣版字元」:%:0到多個(gè)任何字元_:一個(gè)任何字元所以要查詢(xún)「名稱(chēng)以w字元開(kāi)始的城市」的話:參考上列的作法,就可以延伸出其它的查詢(xún)條件設(shè)定了:上列的查詢(xún)條件中,「w%」表示第一個(gè)字元是「w」就符合條件;「%w」表示最后一個(gè)字元是「w」就符合條件;最后一個(gè)「%w%」表示不論在什么位置有「w」字元,都符合條件。另外一種樣版字元「_」表示一個(gè)任何字元:把這些樣版中的底線換到后面的話:你也可以搭配兩種樣版字元完成條件的設(shè)定:甚至像查詢(xún)「名稱(chēng)是三十(包含)個(gè)字元以上的城市」:注:其實(shí)完成上列的查詢(xún)條件的需求是不用這么麻煩的,在后面的章節(jié)會(huì)討論比較簡(jiǎn)單的方式。4排序在你執(zhí)行任何一個(gè)查詢(xún)以后,MySQL傳回的資料是依照「自然」的順序排列的。所謂的自然順序,通常是資料新增到表格中的順序,可是在資料庫(kù)運(yùn)作一段時(shí)間后,陸續(xù)會(huì)有各種不同的操作,所以這個(gè)「自然」順序?qū)δ銇?lái)說(shuō),通常是沒(méi)什么意義的。一般的查詢(xún)通常會(huì)有資料排序上的需求,所以你會(huì)使用「ORDERBY」子句:如果你希望在查詢(xún)城市資料的時(shí)候,資料庫(kù)會(huì)依照國(guó)家代碼幫你排序的話:你也可以指定資料排列的順序?yàn)橛纱蟮叫。骸窸RDERBY」子句后面可以依照需求指定多個(gè)排序的資料:「ORDERBY」子句后面指定多個(gè)排序資料的時(shí)候,都可以依照需求,各自指定資料排列的方式:「ORDERBY」子句指定的資料可以是欄位名稱(chēng)、編號(hào)、運(yùn)算式或是欄位別名:雖然比較不會(huì)有下列這樣的需求,不過(guò)你還是可以這樣作:注:資料排列的順序在「第六章、字元集與資料庫(kù)」與「第七章、儲(chǔ)存引擎與資料型態(tài)」中進(jìn)一步詳細(xì)的討論。5限制查詢(xún)5.1指定回傳紀(jì)錄數(shù)量在你執(zhí)行一個(gè)查詢(xún)敘述后,資料庫(kù)會(huì)將你查詢(xún)的資料傳回來(lái)給你;如果你使用「WHERE」子句設(shè)定查詢(xún)條件的話,資料庫(kù)就只會(huì)傳回符合條件的資料;除了上列的狀況外,你也可以另外使用「LIMIT」子句指定回傳紀(jì)錄的數(shù)量:如果你在「LIMIT」子句后面指定一個(gè)數(shù)字:「LIMIT」子句后面也可以指定兩個(gè)數(shù)字:在查詢(xún)敘述中,使用「ORDERBY」子句搭配「LIMIT」子句,就可以完成下列查詢(xún)「排名」的工作:注:如果出現(xiàn)類(lèi)似「…LIMIT1000000,10」這樣的查詢(xún)敘述,雖然你只會(huì)得到十筆資料,資料庫(kù)總共會(huì)查詢(xún)一百萬(wàn)零一十筆資料,只不過(guò)資料庫(kù)會(huì)幫你跳過(guò)前一百萬(wàn)筆;類(lèi)似這樣的需求,還是要使用「WHERE」子句先挑出想要的資料會(huì)比較好一些。5.2排除重復(fù)紀(jì)錄在一個(gè)查詢(xún)敘述執(zhí)行以后,資料庫(kù)不會(huì)幫你檢查回傳的資料是否重復(fù)(回傳的兩筆紀(jì)錄資料完全一樣),在「SELECT」子句后面可以讓你設(shè)定「回傳的資料是否重復(fù)」:沒(méi)有使用「ALL」或「DISTINCT」的效果,跟你自己加上「ALL」的查詢(xún)效果是一樣的,資料庫(kù)會(huì)依照你的查詢(xún)傳回所有的資料:使用「DISTINCT」的話,資料庫(kù)會(huì)特別執(zhí)行回傳紀(jì)錄是否重復(fù)的檢查:目錄\h1值與運(yùn)算式\h1.1數(shù)值\h1.2字串值\h1.3日期與時(shí)間值\h1.4NULL值\h2函式\h2.1字串函式\h2.2數(shù)學(xué)函式\h2.3日期時(shí)間函式\h2.4流程控制函式\h2.5其它函式\h3群組查詢(xún)\h3.1群組函式\h3.2GROUP_CONCAT函式\h3.3GROUPBY與HAVING子句1值與運(yùn)算式不論在執(zhí)行查詢(xún)或資料異動(dòng)的時(shí)候,你都可能會(huì)使用各種不同種類(lèi)的值(literalvalues)來(lái)完成你的工作:不同種類(lèi)的值會(huì)有不同的用法與規(guī)定,可以搭配使用的運(yùn)算子和函式也不一樣。根據(jù)資料類(lèi)型可以分為下列幾種:數(shù)值:可以用來(lái)執(zhí)行算數(shù)運(yùn)算的數(shù)值,包含整數(shù)與小數(shù),分為精確值與近似值兩種字串:使用單引號(hào)或雙引號(hào)包圍的文字日期/時(shí)間:使用單引號(hào)或雙引號(hào)包圍的日期或時(shí)間空值:使用「NULL」表示的值布林值:「TRUE」或「1」表示「真」,「FALSE」或「0」表示「假」1.1數(shù)值數(shù)值分為「精確值(exact-value)」與「近似值(approximate-value)」兩種。精確值在使用時(shí)不會(huì)因?yàn)檫M(jìn)位而產(chǎn)生差異;使用近似值的時(shí)候,可能會(huì)因?yàn)檫M(jìn)位而產(chǎn)生些微的差異。精確值使用一個(gè)明確的數(shù)字來(lái)表示一個(gè)整數(shù)或小數(shù)數(shù)值:整數(shù):沒(méi)有小數(shù)的數(shù)字,范圍從-9223372036854775808到9223372036854775807小數(shù):包含小數(shù)的數(shù)字,整數(shù)范圍與上面一樣,小數(shù)位數(shù)最多可以有30個(gè)一般來(lái)說(shuō),使用精確值在執(zhí)行各種算數(shù)運(yùn)算的時(shí)候,所得到的結(jié)果都不會(huì)有誤差的問(wèn)題,你只要特別注意范圍就可以了。例如下列這個(gè)比較奇怪的查詢(xún)需求:包含小數(shù)的數(shù)字,在整數(shù)部份的限制與整數(shù)相同,小數(shù)位數(shù)會(huì)有這樣的限制:近似值的的數(shù)字通常稱(chēng)為「科學(xué)表示法」,它使用下列的方式來(lái)表示一個(gè)數(shù)值:這兩種表示方式所代表的數(shù)值是這樣計(jì)算的:XE+Y,X*10Y,例如5E+3,代表的數(shù)字為5000XE-Y,X*10-Y,例如5E-3,代表的數(shù)字為0.005注:「XE+Y」格式中的「+」可以省略,例如「5E+3」與「5E3」是一樣的。使用近似值來(lái)表示一個(gè)數(shù)值的時(shí)候,你一定要牢記它是一個(gè)「近似值」,也就是它真正儲(chǔ)存的數(shù)值可能不是你所看到的。下列的情況是你比較容易理解的:不過(guò)下列的狀況就會(huì)有不一樣的結(jié)果:第一個(gè)運(yùn)算值采用精確值的方式,所以它們一定會(huì)相等;第二個(gè)運(yùn)算使用近似值的方式,所以它們不一定相等。1.2字串值字串值是以單引號(hào)或雙引號(hào)包圍的文字資料,就文字資料來(lái)說(shuō),你不會(huì)拿文字執(zhí)行加、減、乘、除這類(lèi)的算數(shù)運(yùn)算。如果你拿字串來(lái)執(zhí)行算數(shù)運(yùn)算的話,MySQL會(huì)先把字串中的內(nèi)容轉(zhuǎn)換為數(shù)字,然后再執(zhí)行算數(shù)運(yùn)算:如果字串內(nèi)容包含不是數(shù)值的文字,MySQL在執(zhí)行轉(zhuǎn)換的時(shí)候會(huì)出現(xiàn)警告訊息:字串與字串可以執(zhí)行連接的運(yùn)算,就是把一些字串的內(nèi)容連接起來(lái)后,產(chǎn)生一個(gè)新的字串。要執(zhí)行字串連接的工作,可以使用「||」運(yùn)算子,這個(gè)運(yùn)算子在條件的判斷中是「或」的意思,如果你直接使用「||」運(yùn)算子連接字串的話:這是因?yàn)樵陬A(yù)設(shè)的設(shè)定下,MySQL把「||」運(yùn)算子當(dāng)成數(shù)值的「或」運(yùn)算,所以會(huì)出現(xiàn)這樣的情況;你可以透過(guò)設(shè)定MySQL的SQL模式,來(lái)改變這個(gè)預(yù)設(shè)處理方式:SETsql_mode='PIPES_AS_CONCAT'
這個(gè)設(shè)定會(huì)把「||」運(yùn)算子用在字串值的時(shí)候,把它當(dāng)成「連接」運(yùn)算子:注:字串的連接也可以使用函式來(lái)處理,在這章的后面討論;另外字串的比較因?yàn)楦幋a有關(guān),會(huì)在后面的章節(jié)詳細(xì)討論。1.3日期與時(shí)間值日期與時(shí)間值(temporalvalues)有下列幾種:日期:年年年年-月月-日日,2007-01-01
日期時(shí)間:年年年年-月月-日日時(shí)時(shí):分分:秒秒,2007-01-0112:00:00
時(shí)間:時(shí)時(shí):分分:秒秒:12:00:00
在日期與時(shí)間值中西元年的部份,可以使用四個(gè)或兩個(gè)數(shù)字。如果指定的兩個(gè)數(shù)字是「70」到「99」之間,就代表「1970」到「1999」;如果是「00」到「69」之間,就代表「2000」到「2069」。日期值中預(yù)設(shè)的分隔字元是「-」,你也可以使用「/」,所以「2000-1-1」與「2000/1/1」都是正確的日期值。日期時(shí)間資料可以使用在條件的判斷外,也可以用來(lái)「運(yùn)算」,不過(guò)當(dāng)然不是數(shù)值的算數(shù)運(yùn)算,而是「一個(gè)日期的36天后是哪一天」這類(lèi)的運(yùn)算,而且只能使用「+」與「-」的運(yùn)算。它的語(yǔ)法是:語(yǔ)法中的單位可以使用下列表格中的單位關(guān)鍵字:YEAR:年QUARTER:季MONTH:月DAY:日HOUR:時(shí)MINUTE:分SECOND:秒注:上列「單位關(guān)鍵字」并沒(méi)有列出所有的單位關(guān)鍵字,全部的單位關(guān)鍵字請(qǐng)參考MySQL手冊(cè)「12.5.DateandTimeFunctions」。1.4NULL值「NULL」值的處理比任何其它型態(tài)的值都來(lái)得奇怪一些,它也是一個(gè)很常見(jiàn)的資料,可以用來(lái)表示「未知的資料」;而且它最特別的地方是「NULL值與其它任何值都不一樣,包含NULL自己」。「NULL」是一個(gè)SQL關(guān)鍵字,大小寫(xiě)都可以。你已經(jīng)知道判斷一個(gè)欄位資料是否為「NULL」值的時(shí)候,跟其它一般資料判斷是不一樣的;如果算數(shù)運(yùn)算式或比較運(yùn)算式中有任何「NULL」值的話,結(jié)果都會(huì)是「NULL」:SELECTNULL=NULL,NULL<NULL,NULL!=NULL,NULL+3
上列的查詢(xún)所得到的結(jié)果全部都是「NULL」。所以在比較「NULL」值的時(shí)侯要使用下列的方式:2函式在你在執(zhí)行查詢(xún)或維護(hù)資料的時(shí)候,可能會(huì)有下列這個(gè)比較特殊的需求:以這樣的需求來(lái)說(shuō),你當(dāng)然不用自己去計(jì)算兩個(gè)日期之間的天數(shù),MySQL提供許多不同的函式(functions),可以完成這類(lèi)的需求,不論在執(zhí)行查詢(xún)或維護(hù)的敘述中,都可以使用這些函式。函式基本的用法會(huì)像這樣:注:MySQL規(guī)定函式預(yù)設(shè)的寫(xiě)法是函式名稱(chēng)和左括號(hào)之間不可以有任何空格,否則會(huì)造成錯(cuò)誤;你可以執(zhí)行SETsql_mode='IGNORE_SPACE'
,這個(gè)設(shè)定讓你可以在函式名稱(chēng)和左括號(hào)之間加入空格也不會(huì)出錯(cuò)。以上列「計(jì)算兩個(gè)日期之間的天數(shù)」來(lái)說(shuō),就會(huì)在查詢(xún)敘述中使用到這樣的函式:MySQL提供的函式非常多,你不用把每一個(gè)函式的名稱(chēng)和用法都背起來(lái),就算是為了參加認(rèn)證考試也一樣。這個(gè)章節(jié)只有介紹「部份」函式,并不是全部,所以你在了解這章討論的函式以后,需要到MySQL參考手冊(cè)中的「Chapter12.FunctionsandOperators」,進(jìn)一步認(rèn)識(shí)MySQL還有提供哪一些函式。2.1字串函式字串資料的處理是一種很常見(jiàn)的工作,處理字串的函式也非常多,所以這里使用分類(lèi)的方式來(lái)介紹。下列是處理字串內(nèi)容的相關(guān)函式:LOWER(字串):將[字串]轉(zhuǎn)換為小寫(xiě)UPPER(字串):將[字串]轉(zhuǎn)換為大寫(xiě)LPAD(字串1,長(zhǎng)度,字串2):如果[字串1]的長(zhǎng)度小于指定的[長(zhǎng)度],就在[字串1]左邊使用[字串2]補(bǔ)滿(mǎn)RPAD(字串1,長(zhǎng)度,字串2):如果[字串1]的長(zhǎng)度小于指定的[長(zhǎng)度],就在[字串1]右邊使用[字串2]補(bǔ)滿(mǎn)LTRIM(字串):移除[字串]左邊的空白R(shí)TRIM(字串):移除[字串]右邊的空白TRIM(字串):移除[字串]左、右的空白R(shí)EPEAT(字串,個(gè)數(shù)):重復(fù)[字串]指定的[個(gè)數(shù)]REPLACE(字串1,字串2,字串3):將[字串1]中的[字串2]替換為[字串3]「LPAD」與「RPAD」在處理報(bào)表資料的時(shí)候,很常用來(lái)控制報(bào)表內(nèi)容的格式。例如下列的需求:使用「LPAD」函式讓查詢(xún)后得到的字串內(nèi)容向右對(duì)齊:下列是截取字串內(nèi)容的函式:LEFT(字串,長(zhǎng)度):傳回[字串]左邊指定[長(zhǎng)度]的內(nèi)容RIGHT(字串,長(zhǎng)度):傳回[字串]右邊指定[長(zhǎng)度]的內(nèi)容SUBSTRING(字串,位置):傳回[字串]中從指定的[位置]開(kāi)始到結(jié)尾的內(nèi)容SUBSTRING(字串,位置,
長(zhǎng)度):傳回[字串]中從指定的[位置]開(kāi)始,到指定[長(zhǎng)度]的內(nèi)容下列是一個(gè)測(cè)試這些函式的查詢(xún)敘述:下列是連接字串的函式:CONCAT(參數(shù)[,…]):傳回所有參數(shù)連接起來(lái)的字串CONCAT_WS(分隔字串,參數(shù)[,…]):傳回所有參數(shù)連接起來(lái)的字串,參數(shù)之間插入指定的[分隔字串]你可以使用「||」運(yùn)算子連接字串,「CONCAT」函式也可以完成同樣的需求。唯一的差異是要先設(shè)定「sql_mode」為「PIPES_AS_CONCAT」后,才可以使用「||」運(yùn)算子連接字串;而「CONCAT」函式不用執(zhí)行任何設(shè)定就可以連接字串。「CONCAT_WS」函式提供一種比較方便的字串連接功能,例如下列這個(gè)使用「||」運(yùn)算子連接字串的查詢(xún)敘述:改成使用「CONCAT_WS」函式的話,就會(huì)比較簡(jiǎn)單一些:注:「CONCAT」與「CONCAT_WS」兩個(gè)函式的參數(shù)可以接受任何型態(tài)的資料,它們都會(huì)把全部的資料轉(zhuǎn)為字串后連接起來(lái);「CONCAT」函式的參數(shù)中如果有「NULL」值,結(jié)果會(huì)是「NULL」;「CONCAT_WS」函式的參數(shù)中如果有「NULL」值,「NULL」值會(huì)被忽略。下列是取得字串資訊的函式:LENGTH(字串):傳回[字串]的長(zhǎng)度(bytes)CHAR_LENGTH(字串):傳回[字串]的長(zhǎng)度(字元個(gè)數(shù))LOCATE(字串1,字串2):傳回[字串1]在[字串2]中的位置,如果[字串2]中沒(méi)有[字串1]指定的內(nèi)容就傳回0使用「LENGTH」函式可以完成類(lèi)似「國(guó)家名稱(chēng)長(zhǎng)度排行榜」的查詢(xún):注:「LENGTH」與「CHAR_LENGTH」的差異在「第六章、字元集與資料庫(kù)」與「第七章、儲(chǔ)存引擎與資料型態(tài)」中會(huì)詳細(xì)的討論。如果有需要的話,你也會(huì)搭配許多函式來(lái)完成你的工作,例如:上列的敘述可以查詢(xún)「名稱(chēng)是一個(gè)單字以上的國(guó)家」。2.2數(shù)學(xué)函式下列是數(shù)值舍去與進(jìn)位的函式:ROUND(數(shù)字):四舍五入到整數(shù)ROUND(數(shù)字,位數(shù)):四舍五入到指定的位數(shù)CEIL(數(shù)字)、CEILING(數(shù)字):進(jìn)位到整數(shù)FLOOR(數(shù)字):舍去所有小數(shù)TRUNCATE(數(shù)字,位數(shù)):將指定的[數(shù)字]舍去指定的[位數(shù)]下列是一個(gè)測(cè)試這些函式的查詢(xún)敘述:在這些函式中,「TRUNCATE」函式的用法會(huì)比較不一樣:下列是算數(shù)運(yùn)算的函式:PI():圓周率POW(數(shù)字1,數(shù)字2)、POWER(數(shù)字,數(shù)字2):[數(shù)字1]的[數(shù)字2]平方RAND():亂數(shù)SQRT(數(shù)字):[數(shù)字]的平方每次使用「RAND」函式的時(shí)候,它都會(huì)傳回一個(gè)大于等于0而且小于等于1的小數(shù)數(shù)字,通常會(huì)把它稱(chēng)為「亂數(shù)」,這個(gè)數(shù)值是由MySQL隨機(jī)產(chǎn)生的。如果你的敘述中需要一個(gè)固定范圍內(nèi)的亂數(shù),可以搭配「RAND」函式套用下列的公式來(lái)產(chǎn)生:使用「RAND」函式也可以完成「隨機(jī)查詢(xún)」的需求:注:MySQL還有提供的許多不同應(yīng)用的數(shù)學(xué)函式,例如三角函式,你可以查詢(xún)MySQL參考手冊(cè)中的「12.4.2.
MathematicalFunctions」。2.3日期時(shí)間函式下列是取得日期與時(shí)間的函式:CURDATE():取得目前日期,相同功能:CURRENT_DATE、CURRENT_DATE()CURTIME():取得目前時(shí)間,相同功能:CURRENT_TIME、CURRENT_TIME()YEAR(日期):傳回[日期]的年MONTH(日期)數(shù)字傳回[日期]的月DAY(日期):傳回[日期]的日,相同功能:DAYOFMONTH()MONTHNAME(日期):傳回[日期]的月份名稱(chēng)DAYNAME(日期):傳回[日期]的星期名稱(chēng)DAYOFWEEK(日期):傳回[日期]的星期,1到7的數(shù)字,表示星期日、一、二…DAYOFYEAR(日期):傳回[日期]的日數(shù),1到366的數(shù)字,表示一年中的第幾天QUARTER(日期):傳回[日期]的季,1到4的數(shù)字,代表春、夏、秋、冬EXTRACT(單位FROM日期/時(shí)間):傳回[日期]中指定的[單位]資料HOUR(時(shí)間):傳回[時(shí)間]的時(shí)MINUTE(時(shí)間):傳回[時(shí)間]的分SECOND(時(shí)間):傳回[時(shí)間]的秒「CURDATE」與「CURTIME」可以取得目前伺服器的日期與時(shí)間,搭配其它函式就可以完成下列的「建國(guó)最久的國(guó)家排行」查詢(xún):「EXTRACT」函式用來(lái)取得日期時(shí)間資料的指定「單位」,例如日期中的月份,使用的「單位」與這一章之前在「日期與時(shí)間值」中討論的一樣,這個(gè)函式讓你不用記太多「YEAR」或「MONTH」這類(lèi)函式的名稱(chēng):下列是計(jì)算日期與時(shí)間的函式:ADDDATE(日期,天數(shù)):傳回[日期]在指定[天數(shù)]以后的日期ADDDATE(日期,INTERVAL數(shù)字單位):傳回[日期]在指定[數(shù)字]的[單位]以后的日期ADDTIME(日期時(shí)間,INTERVAL數(shù)字單位):傳回[日期時(shí)間]在指定[數(shù)字]的[單位]以后的日期時(shí)間SUBDATE(日期,天數(shù)):傳回[日期]在指定[天數(shù)]以前的日期SUBDATE(日期,INTERVAL數(shù)字單位):傳回[日期]在指定[數(shù)字]的[單位]以前的日期SUBTIME(日期時(shí)間,INTERVAL數(shù)字單位):傳回[日期時(shí)間]在指定[數(shù)字]的[單位]以前的日期時(shí)間DATEDIFF(日期1,日期2):計(jì)算兩個(gè)日期差異的天數(shù)在計(jì)算日期方面的函式,MySQL也提供兩種不同的用法:上列函式中使用的「單位」與這一章之前在「日期與時(shí)間值」中討論的一樣。2.4流程控制函式在處理一般工作的時(shí)候,使用各種SQL敘述與函式,通常就可以完成你的需求;可是在實(shí)際的應(yīng)用上,難免會(huì)遇到類(lèi)似下列這樣比較復(fù)雜一點(diǎn)的需求:像這種依照條件判斷結(jié)果而顯示不同資料的需求,可以使用下列這個(gè)「IF」函式來(lái)處理:使用「IF」函式可以在查詢(xún)的時(shí)候,依照員工進(jìn)公司的日期判斷是資深或是一般員工:如果要依照資深員工與一般員工計(jì)算不同的獎(jiǎng)金,也可以使用「IF」函式來(lái)完成:「IF」函式可以用來(lái)判斷一個(gè)條件「成立」或「不成立」兩種狀況的需求;但是像下列的需求就不適合使用「IF」函式了:如果要完成多種條件的判斷,就要使用下列的「CASE」語(yǔ)法,它應(yīng)該不能算是一個(gè)函式,因?yàn)樗拈L(zhǎng)像實(shí)在不像是一個(gè)函式:套用上列的語(yǔ)法,就可以判斷出所有員工的新資等級(jí):在「CASE」的語(yǔ)法中,要判斷一種條件就使用一個(gè)「WHEN」來(lái)完成;如果有「所有條件以外」的情況要處理的話,就可以使用「ELSE」來(lái)處理:如果要依照員工新資等級(jí)計(jì)算不同的獎(jiǎng)金,也可以使用「CASE」語(yǔ)法來(lái)完成這個(gè)需求:「CASE」除了上列介紹的語(yǔ)法外,還有另外一種寫(xiě)法可以處理一些比較特別的需求,例如下列七大洲的名稱(chēng)與縮寫(xiě)對(duì)照表:Asia:ASEurope:EUAfrica:AFOceania:OAAntarctica:ANNorthAmerica:NASouthAmerica:SA如果要在SQL敘述中有類(lèi)似這樣的需求,就可以使用下列這種「CASE」的語(yǔ)法:套用上列的語(yǔ)法就可以完成這樣的查詢(xún):以上列的查詢(xún)來(lái)說(shuō),你也可以換成這樣的寫(xiě)法:SELECTName,Continent,
CASE
WHENContinent='Asia'THEN'AS'
WHENContinent='Europe'THEN'EU'
WHENContinent='Africa'THEN'AF'
WHENContinent='Oceania'THEN'OA'
WHENContinent='Antarctica'THEN'AN'
WHENContinent='NorthAmerica'THEN'NA'
WHENContinent='SouthAmerica'THEN'SA'
ENDContinentCode
FROMcountry
經(jīng)由這樣的對(duì)照,應(yīng)該可以很容易看得出來(lái),使用哪一種寫(xiě)法來(lái)完成這個(gè)查詢(xún)會(huì)好一些。2.5其它函式IFNULL(參數(shù),運(yùn)算式):如果[參數(shù)]為NULL就傳回[運(yùn)算式]的值;否則傳回[參數(shù)]的值ISNULL(參數(shù)):如果[參數(shù)]為NULL就傳回TRUE;否則傳回FALSE當(dāng)資料庫(kù)中有「NULL」資料出現(xiàn)的時(shí)候,就可能會(huì)發(fā)生下列這樣奇怪的結(jié)果:所以要得到正確的結(jié)果,就要使用「IFNULL」函式來(lái)特別處理NULL值的運(yùn)算:「ISNULL」函式用來(lái)判斷一個(gè)指定的資料是否為「NULL」,它的效果跟之前在「第二章、基礎(chǔ)查詢(xún)、條件比較」中討論的「IS」和「」運(yùn)算子是一樣的,你可以自己決定要使用哪一種來(lái)執(zhí)行判斷。3群組查詢(xún)資料庫(kù)通常是用來(lái)儲(chǔ)存龐大數(shù)量的資料,這也是它最善長(zhǎng)跟主要的工作,所以查詢(xún)并計(jì)算資料的統(tǒng)計(jì)分析資訊也是一種很常見(jiàn)的需求:你也可能會(huì)進(jìn)一步的查詢(xún)更詳細(xì)的統(tǒng)計(jì)與分析資訊:3.1群組函式想要完成上列討論的統(tǒng)計(jì)與分析查詢(xún),你會(huì)用到下列的「群組函式」:MAX(運(yùn)算式):最大值MIN(運(yùn)算式):最小值SUM(運(yùn)算式):合計(jì)AVG(運(yùn)算式):平均COUNT([DISTINCT]|運(yùn)算式):使用「DISTINCT」時(shí),重復(fù)的資料不會(huì)計(jì)算;使用[]時(shí),計(jì)算表格紀(jì)錄的數(shù)量:使用[運(yùn)算式]時(shí),計(jì)算的數(shù)量不會(huì)包含「NULL」值使用上列的群組函式可以很容易的查詢(xún)需要的統(tǒng)計(jì)與分析資訊:這些函式套用在數(shù)值資料時(shí)會(huì)比較明確一些,把它們用在日期資料也是可以完成「員工最早和最晚進(jìn)公司的日期」的查詢(xún)需求:在這些群組函式中,「COUNT」函式的用法會(huì)比較不一樣:利用「COUNT」函式的特性,也可以查詢(xún)一些特別的資訊:3.2GROUP_CONCAT函式「GROUP_CONCAT」函式是比較特別的一個(gè)群組函式,它用來(lái)將一些字串資料「串接」起來(lái)。在執(zhí)行一般查詢(xún)的時(shí)候,會(huì)根據(jù)查詢(xún)的資料,將許多紀(jì)錄傳回來(lái)給你:使用「GROUP_CONCAT」函式的話,只會(huì)回傳一筆紀(jì)錄,這筆紀(jì)錄包含所有字串資料串接起來(lái)的內(nèi)容:下列是「GROUP_CONCAT」函式的語(yǔ)法:上列的范例是「GROUP_CONCAT」函式最簡(jiǎn)單的用法,你還可以在函式中使用與「ORDERBY」子句一樣的用法來(lái)指定資料的排列順序:「GROUP_CONCAT」函式連接字串的時(shí)候,預(yù)設(shè)是使用逗號(hào)分隔資料,你可以自己指定分隔的字串:在「GROUP_CONCAT」函式中還可以使用類(lèi)似在「基礎(chǔ)查詢(xún)、限制查詢(xún)」中討論過(guò)的「DISTINCT」來(lái)排除重復(fù)的資料,例如:在「GROUP_CONCAT」函式中使用「DISTINCT」也會(huì)有同樣的效果:3.3GROUPBY與HAVING子句在上列使用群組函式的所有范例中,都是將「FROM」子句中指定的表格當(dāng)成是一整個(gè)「群組」,群組函式所處理的資料是表格中所有的紀(jì)錄。如果希望依照指定的資料來(lái)計(jì)算分組統(tǒng)計(jì)與分析資訊,在執(zhí)行查詢(xún)的時(shí)候,可能會(huì)有下列幾種不同的結(jié)果:上列的范例使用「GROUPBY」子句指定分組的設(shè)定,下列是分組查詢(xún)中的語(yǔ)法:「GROUPBY」子句指定是依照你自己的需求來(lái)決定的,同樣以人口數(shù)量合計(jì)來(lái)說(shuō),不同的指定可以得到不同的統(tǒng)計(jì)資訊:使用不同的群組函式,就可以得不同的資訊:如果需要的話,你可以在一個(gè)查詢(xún)中,一次取得所有需要的統(tǒng)計(jì)與分析資訊:在查詢(xún)?nèi)航M統(tǒng)計(jì)與分析資訊的時(shí)候,你可以指定多個(gè)群組設(shè)定取得更詳細(xì)的資訊:使用「GROUPBY」指定群組的設(shè)定以后,回傳的群組查詢(xún)資料都會(huì)依照指定的群組排序,預(yù)設(shè)定排序方式是遞增排序,使用「DESC」關(guān)鍵字可以指定排序的方式為遞減排序:使用「GROUPBY」子句的時(shí)候可以搭配「WITHROLLUP」:使用「WITHROLLUP」以后,效果會(huì)作用在查詢(xún)中的每一個(gè)群組函式:在「GROUPBY」子句中有多個(gè)群組設(shè)定的時(shí)候,你可以在最后面加入「WITHROLLUP」:在執(zhí)行群組查詢(xún)的時(shí)候,一般的條件設(shè)定同樣使用「WHERE」子句就可以了:可是以類(lèi)似上列的查詢(xún)來(lái)說(shuō),把查詢(xún)條件從「亞洲的地區(qū)」換成「人口合計(jì)大于一億的地區(qū)」,如果還是把條件設(shè)定放在「WHERE」子句的話:包含群組函式的條件設(shè)定就一定要放在「HAVING」子句中依照需求在執(zhí)行群組查詢(xún)的時(shí)候,應(yīng)該不會(huì)出現(xiàn)下列的查詢(xún)敘述:MySQL資料庫(kù)在執(zhí)行上列的查詢(xún)敘述后,并不會(huì)產(chǎn)生任何錯(cuò)誤,為了預(yù)防這樣的狀況,你可以執(zhí)行下列的設(shè)定:SETsql_mode='ONLY_FULL_GROUP_BY'
在「sql_mode」的設(shè)定中加入「ONLY_FULL_GROUP_BY」,表示多了下列的規(guī)定:如果查詢(xún)敘述違反「ONLY_FULL_GROUP_BY」的規(guī)定,就會(huì)產(chǎn)生錯(cuò)誤訊息:目錄\h1使用多個(gè)表格\h2InnerJoin\h2.1使用結(jié)合條件\h2.2指定表格名稱(chēng)\h2.3表格別名\h2.4使用「INNERJOIN」\h3OuterJoin\h3.1LEFTOUTERJOIN\h3.2RIGHTOUTERJOIN\h4合并查詢(xún)1使用多個(gè)表格在「world」資料庫(kù)的「country」表格中,儲(chǔ)存世界上所有的國(guó)家資料,其中有一個(gè)欄位「Capital」用來(lái)儲(chǔ)存首都資料,不過(guò)它只是儲(chǔ)存一個(gè)編號(hào);另外在「city」表格中,儲(chǔ)存世界上所有的城市資料,它主要的欄位有城市編號(hào)和城市的名稱(chēng):雖然「country」表格自己沒(méi)有儲(chǔ)存城市名稱(chēng),不過(guò)它可以使用「Capital」欄位的值,對(duì)照到「city」表格中的「ID」欄位,也可以知道城市的名稱(chēng)。在這樣的表格設(shè)計(jì)架構(gòu)下,如果你想要查詢(xún)「所有國(guó)家的首都名稱(chēng)」:這樣的查詢(xún)需求就稱(chēng)為「結(jié)合查詢(xún)」,也就是你要查詢(xún)的資料,來(lái)自于一個(gè)以上的表格,而且兩個(gè)表格之間具有上列討論的「對(duì)照」情形。2InnerJoin「Innerjoin」通常稱(chēng)為「內(nèi)部結(jié)合」,它可以應(yīng)付大部份的結(jié)合查詢(xún)需求,內(nèi)部結(jié)合有兩種寫(xiě)法,差異在把結(jié)合條件設(shè)定在「WHERE」子句或「FROM」子句中。2.1使用結(jié)合條件下列是在「WHERE」子句中設(shè)定結(jié)合條件來(lái)執(zhí)行結(jié)合查詢(xún)的語(yǔ)法:雖然這里會(huì)先介紹使用結(jié)合條件的結(jié)合查詢(xún),不過(guò)不管使用哪一種寫(xiě)法,在使用結(jié)合查詢(xún)時(shí)都會(huì)有一樣的想法。首先是你想要查詢(xún)的欄位:把需要查詢(xún)的欄位列在「SELECT」之后,「FROM」子句后面該需要哪一些表格就很清楚了:最后把表格與表格之間「對(duì)照」的結(jié)合條件放在「WHERE」子句中:這樣的敘述就可以查詢(xún)「所有國(guó)家的首都名稱(chēng)」。2.2指定表格名稱(chēng)在上列的討論中,因?yàn)槭褂玫蕉鄠€(gè)表格了,所以在使用表格的欄位時(shí),都特別提醒你要在欄位名稱(chēng)前面加上表格名稱(chēng)。其實(shí)并不是全部都要指定表格名稱(chēng),你只有在一種情況下,才「一定要」在欄位名稱(chēng)前指定表格名稱(chēng):在查詢(xún)敘述的「FROM」子句中用到的表格,如果有一樣的欄位名稱(chēng),而且你在查詢(xún)敘述中也用到了這些欄位,就「一定要」在欄位名稱(chēng)前指定表格名稱(chēng),否則都可以省略:所以省略掉一些表格名稱(chēng)以后,查詢(xún)敘述就簡(jiǎn)短多了,不過(guò)它執(zhí)行查詢(xún)后的結(jié)果也是一樣的:SELECTCode,Capital,city.Name
FROMcountry,city
WHERECapital=ID
如果不小心違反上列的規(guī)則,你的查詢(xún)敘述在執(zhí)行以后就會(huì)發(fā)生錯(cuò)誤:2.3表格別名如果你想要查詢(xún)「國(guó)家和首都的人口和比例」:這樣的結(jié)合查詢(xún)剛好都使用到兩個(gè)表格中,有同樣名稱(chēng)的欄位,所以你一定要指定表格名稱(chēng):SELECT,country.PopulationcoPop,
city.Name,city.PopulationciPop,
city.Population/country.Population*100Scale
FROMcountry,city
WHERECapital=ID
這樣的查詢(xún)敘述就會(huì)比較長(zhǎng)一些,也比較容易打錯(cuò);所以在結(jié)合查詢(xún)的敘述中,通常為幫「FROM」子句后面的表格都取一個(gè)「表格別名」:使用表格別名以后:幫「FROM」子句中使用到的表格都取一個(gè)表格別名,這樣的查詢(xún)敘述通常也可以比較簡(jiǎn)短一些了。2.4使用「INNERJOIN」執(zhí)行結(jié)合查詢(xún)除了使用上列討論的方式外,還有另外一種結(jié)合查詢(xún)語(yǔ)法:雖然這兩種寫(xiě)法看起來(lái)的差異很大,不過(guò)它們的想法會(huì)是一樣的。首先是需要查詢(xún)的欄位:接下來(lái)是需要用到的表格,不過(guò)你要使用「INNERJOIN」把兩個(gè)表格「結(jié)合」起來(lái):最后是結(jié)合條件:上列使用「INNERJOIN」的結(jié)合查詢(xún)執(zhí)行以后,跟之前使用結(jié)合條件的結(jié)合查詢(xún),所得到的結(jié)果是完全一樣的。所以查詢(xún)「國(guó)家和首都的人口和比例」的結(jié)合查詢(xún),也可以改用下列的寫(xiě)法:SELECT,a.PopulationcoPop,
b.Name,b.PopulationciPop,
b.Population/a.Population*100
FROMcountryaINNERJOINcitybONCapital=ID
使用「INNERJOIN」的結(jié)合查詢(xún)還有另外一種選擇:下列是使用「ON」或是「USING」來(lái)設(shè)定結(jié)合條件的情況:所以如果想要查詢(xún)「cmdev」資料庫(kù)中,員工資料和他們的部門(mén)名稱(chēng),就會(huì)有三種寫(xiě)法可以選擇了:3OuterJoin在「cmdev」的員工資料(emp)表格中,部門(mén)編號(hào)(deptno)欄位是用來(lái)儲(chǔ)存員工所屬的部門(mén)用的;不過(guò)有一些員工并沒(méi)有部門(mén)編號(hào):所以如果你使用「內(nèi)部結(jié)合」的作法執(zhí)行下列的查詢(xún),你會(huì)發(fā)現(xiàn)少了兩個(gè)員工的資料:這是因?yàn)槭褂谩竷?nèi)部結(jié)合」的查詢(xún),一定要符合「結(jié)合條件」的資料才會(huì)出現(xiàn):如果你想查詢(xún)的資料是「包含部門(mén)名稱(chēng)的員工資料,可是沒(méi)有分派部門(mén)的員工就不用出現(xiàn)了」,那使用「內(nèi)部結(jié)合」就可以完成你的工作了;可是如果你想要查詢(xún)的資料是「包含部門(mén)名稱(chēng)的員工資料,沒(méi)有分派部門(mén)的員工也要出現(xiàn)」,那你就要使用「OUTERJOIN」,這種結(jié)合查詢(xún)通常稱(chēng)為「外部結(jié)合」:除了多一個(gè)「LEFT」或「RIGHT」,還有把「INNER」換成「OUTER」外,其它的部份與內(nèi)部結(jié)合的作法都是一樣的。3.1LEFTOUTERJOIN所以在結(jié)合查詢(xún)的應(yīng)用中,如果你想要查詢(xún)的資料是「包含部門(mén)名稱(chēng)的員工資料,沒(méi)有分派部門(mén)的員工也要出現(xiàn)」,也就是希望不符合結(jié)合條件的資料也要出現(xiàn)的話,就要換成使用「LEFTOUTERJOIN」來(lái)執(zhí)行結(jié)合查詢(xún)。OUTERJOIN分為L(zhǎng)EFT和RIGHT兩種,在這個(gè)范例中,要使用LEFT才符合查詢(xún)的需求:3.2RIGHTOUTERJOIN其實(shí)使用「LEFTOUTERJOIN」或是「RIGHTOUTERJOIN」并沒(méi)有差異,以上列的需求來(lái)說(shuō),要查詢(xún)「包含部門(mén)名稱(chēng)的員工資料,沒(méi)有分派部門(mén)的員工也要出現(xiàn)」,就是要以「cmdev.emp」表格的資料為主,所以下列兩種寫(xiě)法所得到的結(jié)果是完全一樣的:了解兩種「OUTERJOIN」的后,下列這兩個(gè)看起來(lái)會(huì)有點(diǎn)混淆的查詢(xún),雖然只有「LEFT」與「RIGHT」的差異,它們所完成的查詢(xún)需求,卻是完全不一樣的:所以使用「RIGHTOUTERJOIN」的查詢(xún)需求,就成為「部門(mén)名稱(chēng)與該部門(mén)的員工資料,沒(méi)有員工的部門(mén)也要出現(xiàn)」:4合并查詢(xún)?cè)陉P(guān)聯(lián)式資料庫(kù)中,因?yàn)楸砀竦脑O(shè)計(jì),你常會(huì)使用結(jié)合查詢(xún)來(lái)取得需要的資料,結(jié)合查詢(xún)指的是在「一個(gè)」查詢(xún)敘述中使用「多個(gè)」資料表。而現(xiàn)在要討論的「合并、UNION」查詢(xún),指的是把一個(gè)以上的查詢(xún)敘述所得到的結(jié)果合并為一個(gè),有這樣的需求時(shí),你會(huì)在多個(gè)查詢(xún)敘述之間使用「UNION」關(guān)鍵字:以下列這兩個(gè)獨(dú)立的查詢(xún)來(lái)說(shuō),它們?cè)趫?zhí)行以后會(huì)得到各自傳回查詢(xún)的紀(jì)錄:如果使用「UNION」關(guān)鍵字把這兩個(gè)查詢(xún)合并起來(lái)的話,就只會(huì)得到一個(gè)查詢(xún)結(jié)果,不過(guò)這個(gè)查詢(xún)結(jié)果會(huì)包含兩個(gè)查詢(xún)所得到的紀(jì)錄:在執(zhí)行合并查詢(xún)的時(shí)候,有一些規(guī)則要知道與遵守。第一個(gè)規(guī)則是回傳結(jié)果的欄位名稱(chēng):第二個(gè)規(guī)則是所有查詢(xún)敘述的欄位數(shù)量一定要一樣:上列的范例比較看不出為什么要使用合并查詢(xún),一般來(lái)說(shuō),你大概會(huì)因?yàn)橄铝械脑颍言瓉?lái)的查詢(xún)敘改用合并查詢(xún)的寫(xiě)法來(lái)完成你的需求:目錄\h1取得表格資訊\h1.1DESCRIBE指令\h1.2欄位順序\h2新增\h2.1基礎(chǔ)新增敘述\h2.2同時(shí)新增多筆紀(jì)錄\h2.3索引值\h2.4索引值與ONDUPLICATEKEYUPDATE\h2.5「REPLACE」敘述\h3修改\h3.1搭配「IGNORE」\h3.2搭配「ORDERBY」與「LIMIT」\h4刪除\h4.1「DELETE」敘述\h4.2「TRUNCATE」敘述1取得表格資訊1.1DESCRIBE指令「DESCRIBE」是MySQL資料庫(kù)提供的指令,它只能在MySQL資料庫(kù)中使用,這個(gè)指令可以取得某個(gè)表格的結(jié)構(gòu)資訊,它的語(yǔ)法是這樣的:你在MySQL的工具中執(zhí)行「DESCcmdev.dept」指令以后,MySQL會(huì)傳回「cmdev.dept」表格的結(jié)構(gòu)資訊:1.2欄位順序每一個(gè)表格在設(shè)計(jì)的時(shí)候,都會(huì)決定它有哪一些欄位,和所有欄位的詳細(xì)設(shè)定。另外也會(huì)決定表格中的欄位順序,知道表格欄位順序在接下來(lái)的討論中是很重要的:注:如何建立一個(gè)新的表格會(huì)在「第八章、表格與索引」中討論。2新增2.1基礎(chǔ)新增敘述新增資料到資料庫(kù)的表格中使用「INSERT」敘述,下列是這個(gè)敘述的基本語(yǔ)法:使用這個(gè)語(yǔ)法新增紀(jì)錄的時(shí)候,要特別注意表格的欄位個(gè)數(shù)與順序,下列的新增敘述會(huì)新增一筆部門(mén)的紀(jì)錄到「cmdev.dept」表格中:除了明確的指定新增紀(jì)錄的每一個(gè)欄位資料外,你也可以使用「DEFAULT」關(guān)鍵字,讓MySQL為你寫(xiě)入在設(shè)計(jì)表格的時(shí)候,為欄位指定的預(yù)設(shè)值。下列的新增敘述同樣會(huì)新增一筆部門(mén)的紀(jì)錄到「cmdev.dept」表格中,不過(guò)部門(mén)的所在位置(location)欄位值指定為使用預(yù)設(shè)值:使用這種語(yǔ)法新增紀(jì)錄的時(shí)候,如果資料個(gè)數(shù)與欄位個(gè)數(shù)不一樣的話,就會(huì)發(fā)生錯(cuò)誤:資料個(gè)數(shù)雖然沒(méi)有錯(cuò),順序卻不對(duì)了,也有可能會(huì)造成錯(cuò)誤:新增敘述的另外一種語(yǔ)法,就提供比較靈活的新增紀(jì)錄方式,你可以自己指定新增紀(jì)錄的欄位個(gè)數(shù)和順序:在你額外為這個(gè)新增敘述指定欄位以后,指定儲(chǔ)存資料的時(shí)候就要依照自己指定的欄位個(gè)數(shù)與順序:如果沒(méi)有依照自己指定的欄位個(gè)數(shù)與順序,就會(huì)發(fā)生錯(cuò)誤:因?yàn)檫@種新增敘述的語(yǔ)法可以自己指定欄位的個(gè)數(shù)與順序,所以你只要指定寫(xiě)入欄位的資料就可以了。不過(guò)要特別注意下列兩種語(yǔ)法的差異:也因?yàn)檫@樣的規(guī)定,所以下列這個(gè)新增敘述在語(yǔ)法上雖然沒(méi)有錯(cuò)誤,如果違反表格設(shè)計(jì)上的規(guī)定,同樣會(huì)造成錯(cuò)誤:這種新增敘述的語(yǔ)法還有一個(gè)比較特別的用法,如果你要新增的紀(jì)錄,所有欄位的值都要使用預(yù)設(shè)值,就可以使用下列的寫(xiě)法。不過(guò)要特別注意下列的新增敘述執(zhí)行以后會(huì)造成錯(cuò)誤,因?yàn)椤竏eptno」與「dname」欄位的預(yù)設(shè)值是「NULL」,可是它們又不能儲(chǔ)存「NULL」:下列是新增敘述的第三種語(yǔ)法:這種語(yǔ)法只是提供你另外一種新增紀(jì)錄的寫(xiě)法,下列兩個(gè)新增敘述的效果是一樣的:2.2同時(shí)新增多筆紀(jì)錄上列討論的新增敘述執(zhí)行以后,都是一個(gè)敘述新增一筆紀(jì)錄,如果需要的話,你也可以在一個(gè)新增敘述新增多筆紀(jì)錄,差異只有在「VALUES」子句后面新增資料的指定:如果你要新增下列三個(gè)員工資料到「cmdev.emp」表格中:
**empno****ename****job****manager****hiredate****salary****comm****deptno**
8001SIMONMANAGER73692001-02-033300NULL50
8002JOHNPROGRAMMER80012002-01-012300NULL50
8003GREENENGINEER80012003-05-012000NULL50
你當(dāng)然可以分別執(zhí)行三個(gè)新增敘述將三個(gè)員工資料新增到「cmdev.emp」表格中;你也可以使用下列一個(gè)新增敘述,這個(gè)敘述執(zhí)行以后,同樣會(huì)新增三筆紀(jì)錄:2.3索引值在設(shè)計(jì)表格的時(shí)候,通常會(huì)視需要指定表格中的某一個(gè)欄位為「主索引」欄位:注:一個(gè)表格除了可以設(shè)定「主索引」欄位外,資料庫(kù)還提供其它幾種不同的「索引」,索引的應(yīng)用與設(shè)定會(huì)在后面「第八章、表格與索引」中詳細(xì)討論。如果一個(gè)表格設(shè)定了某一個(gè)欄位為主索引以后,你在新增紀(jì)錄時(shí)就不可以違反主索引的規(guī)定,否則會(huì)產(chǎn)生錯(cuò)誤:你可以在使用「INSERT」敘述的時(shí)候,加入「IGNORE」關(guān)鍵字,它可以在執(zhí)行一個(gè)違反主索引規(guī)定的新增敘述時(shí),自動(dòng)忽略新增的動(dòng)作,這樣就不會(huì)產(chǎn)生錯(cuò)誤訊息了:2.4索引值與ONDUPLICATEKEYUPDATE使用「INSERT」敘述新增紀(jì)錄的時(shí)候,還可以視需要在最后搭配一串關(guān)鍵字「ONDUPLICATEKEYUPDATE」,它可以用來(lái)指定在違反重復(fù)索引值的規(guī)定時(shí)要執(zhí)行的修改:需要為「INSERT」敘述搭配「ONDUPLICATEKEYUPDATE」的情況會(huì)比較特殊一些,所以接下來(lái)會(huì)使用「」這個(gè)表格來(lái)討論它的用法,「」是員工資料庫(kù)中用來(lái)儲(chǔ)存出差資料的表格,每一個(gè)員工到某個(gè)地方出差的資料,都會(huì)儲(chǔ)存在這個(gè)表格中:因?yàn)檫@個(gè)表格的設(shè)計(jì)方式,所以如果要處理編號(hào)「7900」的員工到「BOSTON」出差資料的話,你就要執(zhí)行下列的動(dòng)作:注:修改敘述「UPDATE」在下一節(jié)討論。你會(huì)發(fā)現(xiàn)要處理員工出差資料會(huì)是一件不算簡(jiǎn)單的工作,搭配「ONDUPLICATEKEYUPDATE」的「INSERT」敘述,可以讓處理這類(lèi)需求的敘述比較簡(jiǎn)單一些:這個(gè)「INSERT」敘述執(zhí)行以后,資料庫(kù)會(huì)幫你執(zhí)行需要的檢查,根據(jù)檢查的結(jié)果執(zhí)行不同的動(dòng)作:2.5「REPLACE」敘述除了使用「INSERT」敘述新增紀(jì)錄外,「REPLACE」敘述同樣可以新增紀(jì)錄,它們的語(yǔ)法幾乎相同:「INSERT」敘述的另一種寫(xiě)法也可以套用給「REPLACE」敘述:會(huì)使用「REPLACE」敘述新增紀(jì)錄的原因,主要還是考慮索引值的情況,「REPLACE」敘述在沒(méi)有違反索引值的規(guī)定時(shí),效果跟「INSERT」敘述一樣,同樣會(huì)新增紀(jì)錄到表格中。在發(fā)生重復(fù)索引值的時(shí)候,「INSERT」敘述會(huì)發(fā)生錯(cuò)誤:「INSERT」敘述搭配「IGNORE」關(guān)鍵字的時(shí)候:同樣的情況改用「REPLACE」敘述的話,它會(huì)執(zhí)行修改紀(jì)錄的動(dòng)作:3修改修改已經(jīng)儲(chǔ)存在表格中的紀(jì)錄使用「UPDATE」敘述,下列是它的基本語(yǔ)法:使用「UPDATE」敘述的時(shí)候,通常會(huì)搭配使用「WHERE」子句,用來(lái)指定要修改的紀(jì)錄:所以你在執(zhí)行「UPDATE」敘述的時(shí)候,一定要依照實(shí)際的需求,正確的設(shè)定修改的條件。以下列兩個(gè)修改敘述來(lái)說(shuō),它們執(zhí)行后的差異是很大的:3.1搭配「IGNORE」在使用「UPDATE」敘述的時(shí)候,也可以視需要加入「IGNORE」關(guān)鍵字,它可以防止錯(cuò)誤的修改敘述出現(xiàn)錯(cuò)誤訊息:除了上列的情況外,你還必須特別注意修改多個(gè)欄位值的情況。首先是沒(méi)有「IGNORE」關(guān)鍵字的時(shí)候,錯(cuò)誤的資料會(huì)在執(zhí)行修改敘述的時(shí)候產(chǎn)生錯(cuò)誤訊息,當(dāng)然也不會(huì)執(zhí)行任何修改的動(dòng)作:同樣的修改敘述加入「IGNORE」關(guān)鍵字后,執(zhí)行后的結(jié)果可能會(huì)跟你想得不太一樣了:3.2搭配「ORDERBY」與「LIMIT」執(zhí)行修改的時(shí)候使用「WHERE」子句是一般最常見(jiàn)的用法,在處理一些比較特殊的修改需求時(shí),也會(huì)搭配「ORDERBY」與「LIMIT」子句:「LIMIT」子句也可以在查詢(xún)敘述中使用,不過(guò)在「UPDATE」敘述中使用「LIMIT」子句會(huì)有一個(gè)限制:以同樣為員工加薪一百的需求來(lái)說(shuō),搭配「ORDERBY」與「LIMIT」子句,可以完成許多不同的情況:4刪除4.1「DELETE」敘述刪除表格中不再需要的紀(jì)錄使用「DELETE」敘述,下列是它的語(yǔ)法:使用「DELETE」敘述的時(shí)候,通常也會(huì)使用「WHERE」子句設(shè)定要?jiǎng)h除哪些紀(jì)錄:執(zhí)行刪除的時(shí)候也可以搭配「ORDERBY」與「LIMIT」子句:4.2「TRUNCATE」敘述如果要?jiǎng)h除一個(gè)表格中所有的紀(jì)錄,你可以選擇使用「TRUNCATE」敘述,下列是它的語(yǔ)法:要執(zhí)行刪除表格中所有的紀(jì)錄,下列兩個(gè)敘述的效果是一樣的:「TRUNCATE」敘述在執(zhí)行刪除紀(jì)錄的時(shí)候,會(huì)比使用「DELETE」敘述的效率好一些,尤其是表格中的紀(jì)錄非常多的時(shí)候會(huì)更明顯。目錄\h1CharacterSet與Collation\h1.1CharacterSet\h1.2COLLATION\h2資料庫(kù)\h2.1建立資料庫(kù)\h2.2修改資料庫(kù)\h2.3刪除資料庫(kù)\h2.4取得資料庫(kù)資訊1CharacterSet與Collation任何資訊技術(shù)在處理資料的時(shí)候,如果只是單純的數(shù)值和運(yùn)算,那就不會(huì)有太復(fù)雜的問(wèn)題;如果處理的資料是文字的話,就會(huì)面臨世界上各種不同語(yǔ)言的問(wèn)題。以資料庫(kù)來(lái)說(shuō),它必須正確的儲(chǔ)存各種不同語(yǔ)言的文字,也就是一個(gè)資料庫(kù)中,有可能同時(shí)儲(chǔ)存繁體和簡(jiǎn)體中文、法文等不同語(yǔ)言的文字。電腦在處理文字資料大多是使用一個(gè)「編碼」來(lái)表示某一個(gè)字,對(duì)MySQL資料庫(kù)來(lái)說(shuō),為了要處理不同語(yǔ)言的文字,它使用一套編碼來(lái)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 贛東學(xué)院《微生物與發(fā)酵工程》2023-2024學(xué)年第一學(xué)期期末試卷
- 2022年上海審計(jì)師(初級(jí))《審計(jì)理論與實(shí)務(wù)》考試題庫(kù)(含典型題)
- 《心電圖的臨床應(yīng)用》課件
- 三年級(jí)科學(xué)上冊(cè)13風(fēng)教案冀教版
- 2021年消防工程師綜合能力模擬題及答案
- 《森林環(huán)境微生物》課件
- 《信息系統(tǒng)運(yùn)作》課件
- 2021年試驗(yàn)檢測(cè)師(含助理)-道路工程-集料試題
- 2021年度證券從業(yè)資格證券發(fā)行與承銷(xiāo)預(yù)熱階段綜合測(cè)試題(含答案)
- 國(guó)家安全線上教育課件
- 四川省瀘州市2023-2024學(xué)年高二上學(xué)期期末考試語(yǔ)文試題
- 個(gè)人簡(jiǎn)歷電子版表格下載
- 2024年新疆生產(chǎn)建設(shè)兵團(tuán)第十三師淖毛湖經(jīng)濟(jì)技術(shù)開(kāi)發(fā)區(qū)管委會(huì)招聘筆試沖刺題
- 市級(jí)實(shí)施高水平醫(yī)院建設(shè)“登峰計(jì)劃”工作實(shí)施方案
- 南京航空航天大學(xué)宣傳
- 中職班主任培訓(xùn)課件
- 居民骨干培訓(xùn)課件
- 《冠脈痙攣指南》課件
- 《經(jīng)濟(jì)學(xué)方法論》課件
- 環(huán)境土壤學(xué)課件
- 《計(jì)算機(jī)組裝與維護(hù)》課件
評(píng)論
0/150
提交評(píng)論