




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
MySQL
數據庫管理第4章通過本課程的學習,您將應該:了解數據庫的相關概念熟悉數據庫工具的使用熟悉SQL語言的規則與規范熟練掌握MySQL數據庫管理方法熟練掌握MySQL表結構管理方法熟練掌握表記錄的檢索方法熟練掌握視圖與索引的使用方法熟練掌握數據處理之增刪改熟練掌握存儲過程與游標的使用方法熟練掌握存儲函數的應用熟練掌握觸發器的應用熟練掌握事務的基本特性和應用場景熟練掌握數據庫安全及管理熟練掌握MySQL數據庫備份和恢復操作了解利用MySQL+Java開發一個數據庫學習系統并部署課程目標項目部署成功本講教學目標熟練掌握數據庫的創建、刪除、修改操作過程。熟練使用不同的MySQL工具對數據庫進行管理。通過本講的學習,您將可以:1.OPTION2.OPTION查看表數據目錄ContentMySQL數據庫管理概述01創建和管理數據庫02課業任務03常見錯誤及解決方案04MySQL數據庫管理概述014.1.1數據庫系統概述數據庫系統(DatabaseSystem,簡稱DBS)是指在計算機應用系統中引入數據庫后的系統構成。主要由硬件、OS、數據庫、數據庫管理系統、應用系統和數據庫用戶組成,用戶可以通過DBMS或應用程序操作數據庫。數據請求過程具體步驟:首先由客戶端應用程序發起一個數據請求,經過DBMS把客戶端應用程序發來的請求命令轉換,轉換成一個底層數據庫能夠識別的底層指令,然后交給底層數據庫,數據庫經過相應的處理并把查詢結果返還給DBMS,然后DBMS將處理結果返回給客戶端應用程序。具體的數據請求過程如下圖所示。4.1.1數據庫系統概述由上圖所知,DBS的核心是DBMS,對于程序員來講,DBMS提供了很大的便利,可以更加專注程序本身。DBS與普通軟件系統的最大區別在于:普通軟件是自己管理數據及數據安全,而DBS是由DBMS來管理數據和安全性。4.1.2數據的存儲過程存儲數據是處理數據的第一步,只有正確地把數據存儲起來,才能進行有效的處理和分析。若在MySQL中想要把用戶各種經營相關的、紛繁復雜的數據,有序、高效地存儲起來,則一個完整的數據存儲需要以下4步即可,數據的存儲過程如下圖所示。由上圖可知,首先得創建一個數據庫,再創建數據表,那么為什么不直接創建數據表呢?
因為從系統架構的層次上看,MySQL數據庫系統從大到小依次是:數據庫服務器、數據庫、數據表、數據表的行與列;MySQL數據庫服務器之前已經安裝,所以就從創建數據庫開始。說明:創建和管理數據庫024.2.1創建數據庫如果想要使用數據庫存儲數據,首先就要創建數據庫。創建數據庫是在系統磁盤上劃分一塊區域用于數據的存儲和管理。創建數據庫時,可以指定一些選項,例如字符集(CharacterSet)和排序規則(Collation)。4.2.1創建數據庫在MySQL中使用SQL語句創建數據庫有以下三種方式。方式1:直接創建數據庫,創建時是使用默認的字符集(UTF-8),語法格式如下。方式2:創建數據庫,并指定需要使用的字符集,語法格式如下。方式3:判斷數據庫是否已經存在,若不存在,則創建數據庫,若MySQL中已經存在相關的數據庫,則忽略該創建語句,不再創建數據庫,語法格式如下。4.2.1創建數據庫【案例4.1】使用方式1直接創建數據庫。在MySQL中創建一個新的數據庫,命名為“test1”的SQL語句如下。執行上述SQL語句,運行結果如下圖所示“QueryOK,1rowaffected(0.01sec)”表示數據庫test1創建成功。
說明:(1)在MySQL中表或列可以改名,而DATABASE不能修改數據庫名。但是一些可視化工具可以改名,它是通過建一個新的庫,把所有表復制到新庫中,再刪除舊庫來完成修改庫名的;4.2.1創建數據庫(2)新建的test1數據庫以文件夾的形式保存,如果MySQL是默認安裝沒有修改過安裝路徑,新建的數據庫則保存在“C:\ProgramData\MySQL\MySQLServer8.0\Data”文件夾中,如下圖所示;(3)直接在“C:\ProgramData\MySQL\MySQLServer8.0\Data”文件夾中刪除空數據庫test1,服務器上test1仍然是存在的,需要使用“DROPDATABASEtest1;”語句刪除數據庫;(4)正在使用的數據庫是不可以刪除和移動的。4.2.2查看數據庫有些老版本的MySQL數據庫會有一個test數據庫,這是一個測試數據庫,有了sakila和world替代test在新版本中也就沒有這個數據庫了。如果是使用免安裝包安裝的MySQL數據庫中是只包含了information_schema、mysql、performance_schema、sys四個系統數據庫,也就是缺少兩個測試數據庫。可以使用“SHOWDATABASES”命令語句進行查看當前所有的數據庫。在MySQL數據庫中存在系統數據庫和自定義數據庫,系統數據庫是指MySQL安裝完成后,自動創建的information_schema、mysql、performance_schema、sakila、sys以及world六個數據庫,其中MySQL自帶創建的數據庫就是系統數據庫,而自定義數據庫是由用戶自定義創建的數據庫。4.2.2查看數據庫【案例4.2】查看當前所有數據庫。查看當前所有數據庫,并檢查案例4.1的test1數據庫是否創建成功的SQL語句如下所示。執行上述命令,運行結果如下圖所示,可以看到當前所有系統數據庫和用戶自定義數據庫,其中就存在【案例4.1】創建的數據庫test1。由運行結果可以得知:除了MySQL本身自帶的數據庫以外,還顯示了剛剛新建的數據庫test1。由此可見,一個MySQL系統可以管理多個數據庫。4.2.2查看數據庫information_schema:主要保存關于MySQL服務器維護的所有其他數據庫的信息,如數據庫名稱、數據庫的表名稱、字段名稱、表欄的數據類型、訪問權限與系統使用的文件夾等;mysql:主要存儲數據庫的用戶、權限設置、關鍵字等MySQL本身需要使用的控制和管理信息;performance_schema:主要用于收集MySQL數據庫服務器性能參數,且數據庫里表的存儲引擎均為PERFORMANCE_SCHEMA,而用戶是不能創建存儲引擎為PERFORMANCE_SCHEMA的表的。sakila:這個數據庫最初由MySQLAB文檔團隊的前成員MikeHillyer開發,旨在提供可用于書籍、教程、文章、樣本等示例的標準模式。sakila示例數據庫還用于突出MySQL的最新功能,如視圖、存儲過程和觸發器;MySQL中自帶的數據庫其各自功能如下:4.2.2查看數據庫sys:通過視圖的形式把information_schema、performance_schema結合起來,查詢出更加容易理解的數據存儲過程,可以執行一些性能方面的配置,也可以得到得到一些性能診斷報告內容,幫助系統管理員和開發人員監控MySQL的技術性能;world:是MySOL提供的示例數據庫,包括3個數據表,分別是city、country、countrylanguage等內容。MySQL中自帶的數據庫其各自功能如下:
說明:切記不要隨意刪除MySQL系統自帶的數據庫,否則MySQL服務器不能正常運行。若想查看剛創建的數據庫是否創建成功,可以使用以下SQL語句進行查看數據庫的創建信息。4.2.2查看數據庫【案例4.3】查看指定數據庫的創建信息。在MySQL中查看剛創建的test1數據庫相關信息的SQL語句如下所示。執行上述SQL語句,運行結果如下圖所示,可以查看到test1的字符集等信息。4.2.2查看數據庫
說明:由創建信息的注釋中可知test1數據庫默認使用的字符集為“utf8mb4”,創建數據庫時,如果沒有指定字符集,會采用服務器的默認字符集,設置服務器默認字符集為“utf8mb4”,可以提高便利性。使用的排序規則是“utf8mb4_0900_ai_ci”,最后的注釋“DEFAULTENCRYPTION=’N’”表示默認沒有使用MySQL的加密技術。4.2.3選擇當前操作的數據庫查看指定庫下的所有表,語法格式如下。執行上述命令,如下圖所示,由運行結果可知當前沒有正在操作的數據庫。若想查看在MySQL中當前正在使用的數據庫,可以使用以下SQL語句進行查看。4.2.3選擇當前操作的數據庫執行上述SQL語句,如下圖所示,由運行結果可知test1數據庫中沒有任何工作表。在MySQL中查看test1數據庫中表情況的SQL語句如下所示。【案例4.4】查看test1數據庫中的所有表。
說明:由于還沒有創建表,所以查看當前使用的庫中的表示為空的。4.2.3選擇當前操作的數據庫對于剛創建完的數據庫,如果接下來的SQL語句都是針對一個數據庫操作的,那就不用重復USE了,如果要針對另一個數據庫操作,那么要重新USE語句。使用/切換數據庫的命令語句如下。在MySQL中使用test1數據庫,并查看當前正在使用的數據庫是否為test1,SQL語句如下所示。【案例4.5】使用/切換到數據庫test1。4.2.3選擇當前操作的數據庫執行上述SQL語句,運行結果如下圖所示,當前正在使用的數據庫是test1。由運行結果中可以得知:當出現“Databasechanged”提示信息,則表示成功選擇test1數據庫。也可以通過查看當前正在使用的數據庫來證明是否成功選擇test1數據庫。
說明:在操作表格和數據之前必須先說明是對哪個數據庫進行操作,否則就要對所有對象加上數據庫名稱。4.2.4修改數據庫MySQL8.0版本的數據庫默認使用的字符集是utf8mb4,一般都不會去更改字符集,因為utf8mb4支持中文輸入,但是特殊原因還是要更改字符編碼的時候,我們可以使用“ALTERDATABASE”語句,基本格式如下。在MySQL中將test1數據庫的字符編碼修改為“gbk”,并查看修改后的數據庫信息,SQL語句如下所示。【案例4.6】修改test1數據庫的字符編碼為“gbk”。4.2.4修改數據庫執行上述SQL語句,運行結果如下圖所示。由運行結果可得知:通過“SHOWCREATEDATABASE”語句查看到test1數據庫的詳細信息,在注釋信息中說明了test1數據庫的字符編碼已成功被修改為“gbk”。
說明:在MySQL5.5.3之后就增加了utf8mb4的編碼,且只需要3個字節,這樣不僅減少磁盤I/O、數據庫cache,還可以減少網絡傳輸的時間,從而提高性能。如果數據庫主要支持中文且數據量很大,性能要求也比較高,那么就可以選擇gbk。因為相對于utf8mb4而言,gbk占用的空間較小,每個漢字只占2個字節。相反,如果數據庫主要處理英文,則建議采用utf8mb4。因為utf8mb4對中文采用3個字節,對英文采用1個字節,gbk對中英文都采用2個字節。當然還有其他字符編碼格式,可以根據需求來選擇編碼格式。4.2.5刪除數據庫隨著后期開發的進行,數據開始增加,SQL執行地越來越慢,系統運行速度大不如前。此時就應該要去調整數據庫,調整數據庫的方法有很多種,其中一個方法就是刪除不需要的數據庫來釋放被占用的空間。或者不再需要某個數據庫,亦或是想將數據庫遷移到另一個數據庫或服務器時,可以刪除數據庫。在MySQL使用SQL語句中刪除指定的數據庫有以下兩種方式如下。方式1:如果要刪除的數據庫存在,則刪除成功;反之,則會報錯。基本語法格式如下。方式2:如果要刪除的數據庫存在,則刪除成功;反之,則默認結束,不會報錯。基本語法格式如下。4.2.5刪除數據庫在MySQL中刪除test1數據庫后通過查看當前所有存在的數據庫,檢查test1數據庫是否刪除成功,SQL語句如下所示。【案例4.7】使用方式1直接刪除數據庫test1。執行上述SQL語句,運行結果如下圖所示。4.2.5刪除數據庫由運行結果可得知:通過“DROPDATABASE”命令將數據庫test1已刪除成功,也可以通過查看當前存在數據庫,發現數據庫列表中已沒有test1數據庫,證明已刪除成功。
說明:在使用“DROPDATABASE”命令時要小心謹慎,因為在執行該命令時,MySQL不會給出任何提醒確認信息,一旦刪除了數據庫,數據庫中存儲的所有數據表和數據也將一同被刪除,而且不能恢復。課業任務034.3課業任務課業任務4-1創建數據庫學習系統數據庫課業任務4-2使用數據庫學習系統數據庫課業任務4-3修改數據庫學習系統數據庫課業任務4-6使用Navicat工具管理數據庫課業任務4-4刪除數據庫學習系統數據庫課業任務4-5使用Workbench工具管理數據庫王小明想利用MySQL+Java開發一個數據庫學習系統,在熟悉了SQL語言的規則與規范后,需熟悉MySQL數據庫的管理,并能夠熟練掌握數據庫的創建、修改和刪除數據庫的操作過程,將為后續開發數據庫學習系統打下良好的基礎。現通過6個課業任務來完成。具體請見實驗3常見錯誤及解決方案044.4常見錯誤及解決方案4.4.1錯誤4-1數據庫創建錯誤4.4.2錯誤4-2MySQL數據庫刪除失敗具體請見實驗3選擇題填空題判斷題(1)下面哪一個不是MySQL默認創建的數據庫()。A.masterB.mysqlC.information_schemaD.performance_schema(2)用戶及權限信息存儲在()數據庫中。A.testB.mysqlC.information_schemaD.performation_schemaBC選擇題填空題判斷題(3)DBMS是指下列哪個選項()。A.數據庫系統B.數據并發系統C.數據庫信息系統D.數據庫管理系統(4)創建數據庫db_test的命令是()。A.CREATEdb_testB.CREATETABLEdb_testC.DATABASEdb_testD.CREATEDATABASEdb_testDA選擇題填空題判斷題(5)選擇數據庫db_good為當前數據庫的命令是()。A.INdb_goodB.SHOWdb_goodC.USERdb_goodD.USEdb_good(6)數據庫服務器、數據庫和表的關系,正確的說法是()。A.一個數據庫服務器只能管理一個數據庫,一個數據庫只能包含一個表B.一個數據庫服務器只能管理一個數據庫,一個數據庫可以包含多個表C.一個數據庫服務器可以管理多個數據庫,一個數據庫可以包含多個表D.一個數據庫服務器可以管理多個數據庫,一個數據庫只能包含一個表DC選擇題填空題判斷題(1)()簡稱DBS,它是由數據庫、硬件、軟件、用戶等組成的計算機系統。(2)數據庫(DB)、數據庫系統(DBS)和數據庫管理系統(DBMS)三者之間的關系是()。(3)查看所有數據庫的命令是()。(4)長期存儲在計算機內的,有組織的、可共享的數據的集合稱為()。(5)數據庫系統的核心是()。答案:(1)數據庫系統。(2)DBS(數據庫系統)包括DB(數據庫)和DBMS(數據庫管理系統)。數據庫系統包括數據庫、數據庫管理系統、數據庫管理人員等,是最大的范疇。(3)SHOWDATABASES;。(4)數據庫。(5)數據庫管理系統(DBMS)。判斷題填空題選擇題(1)為了讓MySQL較好的支持中文,在安裝MySQL時,最好將字符集設定為gbk格式。()(2)查看MySQL服務器上有哪些數據庫的命令是SHOWDATABASES。()(3)數據庫系統中,實現數據管理功能的核心軟件稱為數據結構。()(4)選擇數據庫TEST為當前數據庫的命令是USETEST。()(5)創建數據庫可以通過“CREATEDATABASEdb.book;”語句進行創建。()(6)可以刪除MySQL中自帶的數據庫sys。()×√√×××本講拓展與MySQL數據庫管理相似的數據庫管理系統包括:1.PostgreSQL:PostgreSQL是一個開源的關系型數據庫管理系統,與MySQL類似,支持多種操作系統,具有強大的功能和可擴展性。2.OracleDatabase:Oracle是一個商業級的關系型數據庫管理系統,具有廣泛的功能和高性能,被廣泛用于企業級應用和大型數據處理。3.MicrosoftSQLServer:MicrosoftSQLServer是微軟開發的關系型數據庫管理系統,適用于Windows操作系統,具有豐富的功能和集成性。4.SQLite:SQLite是一個嵌入式關系型數據庫管理系統,它是一個輕量級的數據庫引擎,適用于嵌入式設備和小型應用程序。感謝觀看MySQL數據表結構管理第5章通過本課程的學習,您將應該:了解數據庫的相關概念熟悉數據庫工具的使用熟悉SQL語言的規則與規范熟練掌握MySQL數據庫管理方法熟練掌握MySQL表結構管理方法熟練掌握表記錄的檢索方法熟練掌握視圖與索引的使用方法熟練掌握數據處理之增刪改熟練掌握存儲過程與游標的使用方法熟練掌握存儲函數的應用熟練掌握觸發器的應用熟練掌握事務的基本特性和應用場景熟練掌握數據庫安全及管理熟練掌握MySQL數據庫備份和恢復操作了解利用MySQL+Java開發一個數據庫學習系統并部署課程目標項目部署成功本講教學目標熟悉常見的MySQL數據類型、約束類型。掌握如何創建數據表掌握查看數據表的結構掌握修改數據表通過完成課業任務學會分析問題、解決問題,提高動手操作能力。通過本講的學習,您將可以:1.OPTION2.OPTIONOPTION4.OPTION3.5.OPTIONtb_course表的數據添加目錄Content數據類型01創建數據表02修改數據表03刪除數據表04課業任務05常見錯誤及解決方案06數據類型015.1.1MySQL數據類型介紹數據類型是指在系統中用于限制或允許該列中存儲的數據。在MySQL中,數據類型主要根據數據值的內容、大小、精度來選擇,給字段選擇合適的數據類型對數據庫的優化具有很重要的作用;反之,則可能會嚴重影響應用程序的功能和性能。MySQL支持多種數據類型,主要分為三種數據類型:數值、日期與時間以及字符串類型,其中數值類型又包括整數類型、浮點數與定點數類型;字符串類型包括文本字符串、二進制字符串類型。MySQL具體包括的數據庫類型如下表所示。5.1.2整數類型MySQL中的整數類型分為TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER)和BIGINT這5個類型。不同的數據類型存儲空間不同,提供的取值范圍也不同。因為存儲范圍越大,存儲的空間也越大,所以在實際中需要根據需求選擇合適的數據類型,這樣有利于節約存儲空間以及利于提高查詢效率。MySQL中整數類型的具體區別如下表所示。5.1.2整數類型
說明:在MySQL5.7版本中,整型數據類型可以在定義表結構時指定所需要的顯示寬度,如果不指定,則系統為每一種類型指定默認的寬度值。從MySQL8.0.17開始,整數數據類型不推薦使用顯示寬度屬性。面對實際場景需求時,該如何進行選擇?以下是MySQL整數類型的不同場景選擇。(1)TINYINT:一般可用于枚舉數據,例如系統設定取值范圍很小且固定的場景;(2)SMALLINT:一般可以用于較小范圍的統計數據,例如統計工廠的固定資產庫存數量等;(3)MEDIUMINT:一般可用于較大整數的計算,例如車站每日的客流量等;(4)INT(INTEGER):一般用于取值范圍足夠大,一般情況下不用考慮超限問題,用得最多,例如商品編號;(5)BIGINT:一般只有當處理特別巨大的整數時才會用到,例如雙十一的交易量、大型門戶網站點擊量、證券公司衍生產品持倉等。5.1.3浮點數與定點數類型在實際開發當中,會有很多情況需要存儲的數據是有小數數值的,這就想要使用到浮點數類型。在MySQL中的浮點數類型主要有兩種,分別單精度浮點數FLOAT和雙精度浮點數DOUBLE。1.浮點數類型浮點數類型可以用(M,D)來表示,其中M稱為精度,表示整數的位數;D稱為標度,小數的位數。MySQL中浮點數類型的存儲范圍和取值范圍如下表所示。5.1.3浮點數與定點數類型2.定點數類型當對精確度要求較高的項目時,則可以使用定點數類型。在MySQL中的定點數類型只有DECIMAL一種類型,定點數也可以用(M,D)來表示,其中M稱為精度,表示數據的總位數;D稱為標度,表示數據的小數部分的位數。MySQL中定點數類型的取值范圍如下表所示。
說明:(1)FLOAT和DOUBLE浮點數類型之間的區別如下:FLOAT占用字節數少,取值范圍小。DOUBLE占用字節數多,取值范圍也大;(2)當浮點數類型不指定數據精度時,系統會默認按照實際計算機硬件和操作系統來決定精度;若指定精度超出浮點數類型的數據精度,系統則會自動四舍五入,且正常顯示。5.1.3浮點數與定點數類型
說明:(1)定點數類型是以字符串存儲的;(2)當定點數類型不指定M和D時,系統則默認為“DECIMAL(10,0)”;(3)若數據的精度超出了定點數類型的精度范圍,MySQL系統也會進行四舍五入操作,但會有警告。浮點數和定點數類型在實際場景當中,該如何進行選擇?以下是MySQL浮點數和定點數類型的不同場景選擇。定點數類型適合于對精度要求極高的場景,例如涉及金額計算的場景。浮點數類型適用于需要取值范圍大,且可容忍微小誤差的科學計算場景,例如計算化學、分子建模、流體動力學等;5.1.4日期與時間類型MySQL有多種數據類型用于表示日期和時間,主要有:YEAR、TIME、DATE、DATETIME和TIMESTAMP類型。MySQL的日期和時間類型的日期格式、取值范圍如上表所示。5.1.4日期與時間類型日期與時間類型的主要區別如下:1.YEAR類型MySQL中YEAR類型有兩種存儲格式,分別是以4位字符串或數字格式表示和以2位字符串格式表示。
說明:(1)當以4位字符串或數字格式表示時,格式為:“YYYY”,數值取值范圍為“1901~2155”。(2)當以2位字符串格式表示YEAR類型時,表示范圍如下表所示。5.1.4日期與時間類型2.DATE類型DATE類型用于僅需要日期值時,沒有時間部分,日期格式為“YYYY-MM-DD”,其中YYYY表示年,MM表示月,DD表示日。
說明:(1)若以YYYYMMDD格式表示,則會被轉化為YYYY-MM-DD格式;(2)使用CURRENT_DATE()或者NOW()函數,會獲取當前系統的日期。3.TIME類型TIME類型用于只需要時間信息的值,格式為HH:MM:SS。HH表示小時,MM表示分鐘,SS表示秒。5.1.4日期與時間類型
說明:(1)如果使用帶有D格式的字符串,例如DHH:MM:SS、DHH:MM等格式,當插入字段時,D會被轉化為小時,計算格式為“D*24+HH”;(2)當使用帶有冒號并且不帶D的字符串表示時間時,如“12:34:56”,表示當天的時間;不帶有冒號的字符串或數字,如“123456”或123456,格式為“HHMMSS”或者HHMMSS,將被自動轉化為“HH:MM:SS”格式進行存儲。如果插入一個不合法的字符串或數字,如“12:34:56PM”,或者“1234567”,則會將其自動轉化為“00:00:00”進行存儲。因為在MySQL中,時間類型的數據是用“HH:MM:SS”格式進行存儲和比較的,如果插入的數據不符合這個格式,MySQL會將其自動轉換為“HH:MM:SS”格式,如果無法轉換則會被視為“00:00:00”;(3)使用CURRENT_TIME()或者NOW()函數,會插入當前系統的日期。5.1.4日期與時間類型4.DATETIME類型DATETIME類型在格式上是DATE類型和TIME類型的結合,是在所有類型中存儲內存最大的,格式為“YYYY-MM-DDHH:MM:SS”或“YYYYMMDDHHMMSS”,其中,YYYY表示年份,MM表示月份,DD表示日期,HH表示小時,MM表示分鐘,SS表示秒。
說明:(1)插入DATETIME類型的字段時,兩位數的年份規則符合YEAR類型的規則;(2)存儲格式類同于DATE類型的存儲格式,以YYYYMMDDHHMMSS格式的數字插入DATETIME類型的字段時,會被轉化為YYYY-MM-DDHH:MM:SS格式;(3)使用CURRENT_TIMESTAMP()或者NOW()函數,可以向DATETIME類型的字段插入當前系統的日期和時間。5.1.4日期與時間類型5.TIMESTAMP類型TIMESTAMP類型的格式與DATATIME類型的格式相同,也可以表示日期和時間。但與DATATIME類型不同的是,TIMESTAMP類型在存儲數據時是以UTC(世界標準時間)格式進行存儲的,存儲時對當前時區進行轉換,查詢時再轉換回當前時區,也就是在不同地區查詢時會顯示不同時間。
說明:(1)當插入TIMESTAMP類型的字段時,兩位數值的年份同樣符合YEAR類型的規則條件;(2)TIMESTAMP類型表示的時間范圍要小很多,在插入字段時,不要超出范圍,否則MySQL會拋出錯誤;(3)使用CURRENT_TIMESTAMP()或者NOW()函數,可以向TIMESTAMP類型的字段插入當前系統的日期和時間。5.1.4日期與時間類型日期與時間的數據類型在實際場景,該如何選擇?以下是MySQL中日期與時間類型在實際場景中的選擇。(4)DATATIME占8個字節,TIMESTAMP占4個字節,若要求存儲范圍較大時,建議使用DATATIME類型。DATETIME類型反映的是插入時當地的時區,不會因為訪問用戶時區不同顯示的結果發生變化,而TIMESTAMP類型反映的是訪問用戶的時區,不同時區的用戶訪問會顯示不同的結果。DATATIME和TIMESTAMP比較大小或日期計算時,TIMESTAMP類型會更快、更方便。(1)若存儲數據需要記錄年份,則使用YEAR類型;(2)若存儲數據只需要記錄時間,則使用TIME類型;(3)若同時需要記錄日期和時間,則可以使用TIMESTAMP或者DATETIME類型;5.1.5文本字符串類型MySQL支持的字符串類型包括文本字符串類型和二進制字符串類型,主要用來存儲字符串數據,以及存儲圖片和聲音的二進制數據。MySQL中的字符串類型主要分為CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT、ENUM、SET等類型。MySQL中的字符串數據類型主要包括的類型如下表所示,其中M表示為其指定長度。5.1.5文本字符串類型每一種文本字符串類型的長度范圍和占用存儲空間都是不同的,那么在實際應用當中要考慮好該字段適合的長度和存儲空間,再選擇合適的數據類型。1.CHAR與VARCHAR類型在MySQL中,CHAR(M)類型一般需要先定義字符串長度,若沒有指定M,則表示長度默認是1個字符;而VARCHAR(M)類型是定義時必須指定長度M,否則會報錯。
說明:(1)當檢索到CHAR類型的數據時,CHAR類型字段尾部的空格將被刪除;(2)但VARCHAR類型在保存和檢索字段數據時,字段尾部的空格仍會保留。5.1.5文本字符串類型那么在實際場景,CHAR和VARCHAR類型該如何進行選擇?以下是MySQL中CHAR和VARCHAR類型在實際場景中的選擇。(1)當存儲的信息較短,速度要求高時,可以使用CHAR類型來實現,例如班級號(01,02...)。反之,則選擇VARCHAR類型來實現;(2)當需要固定長度時,使用CHAR類型會更合適,而VARCHAR類型是動態根據長度的特性就消失,而且還會占多一個長度信息。由于CHAR類型平均占用的空間多于VARCHAR類型,所以除了簡短并且固定長度的,其他考慮VARCHAR類型;(3)在InnoDB存儲引擎中,建議使用VARCHAR類型。因為對于InnoDB數據表,內部的行存儲格式并沒有區分固定長度和可變長度列,而且主要影響性能的因素是數據行使用的存儲總量,由于VARCHAR類型是按實際長度進行存儲的,這樣節省空間,所以對磁盤I/O和數據存儲總量比較好。5.1.5文本字符串類型2.TEXT類型在MySQL中,TEXT類型分為4種,主要包括TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT類型,不同的TEXT類型保存的數據長度和所占用的存儲空間都不同。當在TEXT類型字段上保存或查詢數據時,與VARCHAR類型相同,不會刪除數據尾部的空格。如若在實際場景中,TEXT類型該如何進行選擇?以下是MySQL中TEXT類型在實際場景中的選擇。(3)當字符數大于5000時,建議使用TEXT類型,并且新建一個表進行存儲,避免影響索引查詢的效率。
(1)當TEXT列保存非二進制字符串,如文章內容、評論等;(2)在實際開發當中,實際存儲長度不確定時,不建議使用TEXT類型字段做主鍵;5.1.5文本字符串類型3.ENUM類型ENUM類型又叫作枚舉類型,它的取值范圍需要在創建表示通過枚舉方式進行指定,在設置字段值時,ENUM類型只允許從成員中選取單個值,不能一次選取多個值,其所需要的存儲空間是由定義ENUM類型時指定的成員個數決定。成員個數的具體范圍和存儲空間如上表所示,其中L表示實際成員個數。
說明:在定義字段時,若ENUM類型字段聲明為NULL時,插入NULL是有效值,默認為NULL;若ENUM類型字段聲明為NOTNULL時,插入NULL為無效值,默認值為ENUM類型成員的第一個成員。4.SET類型SET與ENUM類型十分相似,SET類型也是一個字符串對象。與ENUM類型不同的是,SET類型一次可以選取多個成員,而ENUM類型則只能選取一個。當一個字符串設置字段值時,SET類型可以取成員個數范圍內的0個或多個值。SET類型包含的成員個數和存儲空間都不同,具體如表表所示,其中L表示實際成員個數。5.1.5文本字符串類型5.1.6二進制字符串類型在MySQL中,二進制字符串類型主要存儲二進制數據,例如可以存儲圖片、音頻和視頻等二進制數據。MySQL中支持的二進制字符串類型主要包括BIT、BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB類型。其每種類型的長度以及存儲空間如上表所示,其中M和L都表示值的長度。1.BIT類型BIT類型又稱作位字段類型,主要存儲的是二進制值,類似“010110”。若沒有指定M,默認是1位。1位表示只能存1位的二進制值。若分配的值的長度小于M位,則在值的左邊用“0”填充。MySQL中BIT類型的長度范圍和存儲空間如下表所示。5.1.6二進制字符串類型2.BINARY與VARBINARY類型BINARY(M)是固定長度的二進制字符串,如果未指定M,表示只能存儲1個字節。若字段值不足M個字節,將在右邊填充“/0”以補齊指定長度;反之,超出的部分則會被截斷。VARBINARY(M)是可變長度的二進制字符串,必須指定M,否則會報錯。MySQL中BINARY與VARBINARY類型的長度范圍和存儲空間如下表所示。5.1.6二進制字符串類型3.BLOB類型在MySQL中BLOB類型包括4種類型,主要包括TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB類型。BLOB類型是一個二進制的對象,主要用來存儲可變數量的數據,例如圖片、音頻和視頻等。MySQL中BLOB類型的長度范圍和存儲空間如下表所示。5.1.6二進制字符串類型在實際開發中,BLOB類型與TEXT類型該如何選擇?以下是MySQL中BLOB和TEXT類型在實際場景中的選擇。(2)BLOB類型的數據是以字節序列的形式存儲的,因此在進行排序和比較時,會基于這些字節的數值進行操作。TEXT類型的數據則是以字符序列的形式存儲的,所以在排序和比較時,會根據字符集規則對這些字符進行操作;(3)在實際工作中,往往不會在MySQL數據庫中使用BLOB類型存儲大對象數據,通常會將圖片、音頻和視頻文件存儲到服務器的磁盤上,并將圖片、音頻和視頻的訪問路徑存儲到MySQL中。(1)BLOB類型存儲的是二進制字符串,而TEXT類型存儲的是非進制字符串;創建數據表025.2.1約束概述在MySQL中,約束是指對表中數據的一種約束,能夠幫助數據庫管理員更好地管理數據庫,并且能夠確保數據庫中數據的完整性。數據完整性是指數據的精確性和可靠性,是防止數據庫中存在不符合語義規定的數據和防止因錯誤信息的輸入輸出造成無效操作或錯誤信息而提出的。例如,在數據表中存放身高的值時,如果存入300、400cm這些無效的值就毫無意義了,所以使用約束來限定表中的數據范圍是很有必要的。約束可以在創建數據表時規定約束,執行“CREATETABLE”語句,或者在數據表創建之后執行“ALTERTABLE”語句規定約束。接下來講解創建數據表時該如何規定約束。5.2.2創建數據表的語法格式數據表是數據庫的重要組成部分,每一個數據庫都是由若干個數據表組成的。也就是說,沒有數據表就無法在數據庫中存放數據。所以在創建完數據庫之后,接下來就要在創建好的數據庫中創建新的數據表。創建數據表的過程是規定數據列的屬性的過程,同時也是實施數據完整性約束的過程。在MySQL中創建數據表的語法格式如下所示。5.2.2創建數據表的語法格式
說明:(1)表名稱:表示需要創建數據表的表的名稱;(2)字段:規定數據表中列的名稱;(3)數據類型:規定數據表中列的數據類型,例如VARCHAR、DATE等;(4)列級約束條件:指定列級字段的某些約束條件。在MySQL中創建數據表時需要注意的一些問題如下:創建數據表時加上了“IFNOTEXISTS”關鍵字,則表示:若當前數據庫中不存在要創建的數據表,則創建數據表;如果當前數據庫中已經存在要創建的數據表,則忽略建表語句,不再創建數據表;在創建數據表時,還需要指定數據表中每一列的名稱和數據類型,多個列之間需要以逗號進行分隔;在Windows操作系統中,創建數據表的表名是不區分大小寫的,但不能使用SQL語言中的關鍵字,例如INSERT、ALTER、DROP等。5.2.2創建數據表的語法格式【案例5.1】創建數據表。在數據庫學習系統數據庫(db_study)中創建一個數據表,名稱為tb_department,用于保存部門信息,分別給每個字段選擇合適的數據類型,具體信息如下表所示。5.2.2創建數據表的語法格式在學習系統數據庫中創建tb_department數據表前,需要使用“USE數據庫;”語句指定選擇使用的數據庫,再創建數據表,否則會報錯。SQL語句如下所示。5.2.2創建數據表的語法格式執行上述SQL語句,運行結果如下圖所示創建部門表成功。也可以使用“SHOWTABLES”語句查看數據表是否創建成功,由結果得知,tb_department表已創建成功,執行“SHOWTABLES”語句如下圖所示。5.2.3使用非空約束
說明:(1)在MySQL中默認所有的類型的值都可以是NULL;(2)只能某個列單獨限定非空,不能組合非空;(3)空字符串’’不等于NULL,0也不等于NULL。非空約束(NotNullConstraint)指的就是數據表中某一列的內容不允許為空,可以使用“NOTNULL”來表示,對于使用了非空約束的手段,如果用戶在添加數據時沒有指定的值,數據庫系統會報錯。非空約束的語法格式如下所示。5.2.3使用非空約束【案例5.2】添加非空約束。對【案例5.1】中的部門表tb_department進行完善,將字段department_id和字段department_name添加為非空,其他字段則默認為空。當想對表結構進行修改時,則執行“DROPTABLE”語句先將數據表刪除后再創建。SQL語句如下。5.2.3使用非空約束執行上述SQL語句,運行結果如下圖所示。5.2.3使用非空約束由運行結果可以得知:當出現“QueryOK”提示信息,則表示成功刪除或創建tb_department數據表。也可以執行“DESC表名稱;”語句(具體請見5.3.2查看數據表結構)查看數據表的結構,發現department_id和department_name字段已添加了非空約束。
說明:在實際的工作之中,任何的開發,當表一旦設計了,基本就很難做修改。如果真的要進行表結構的修改,只有一個原則:刪除表后重建。但需要給某個字段添加約束時可以使用“ALTER”語句進行添加(具體請見5.4.3修改字段)。5.2.4使用主鍵約束在MySQL中創建數據表時,可以給數據表指定主鍵,主鍵又稱為主碼,是表中一列或多列的組合。主鍵約束(PrimaryKeyConstraint)是使用最頻繁的約束,主鍵約束既不能重復也不能為空,主鍵能夠唯一地標識表中的一條記錄,可以結合外鍵來定義不同數據表之間的關系,并且加快數據庫查詢的速度,可以使用“PRIMARYKEY”表示,簡稱PK。在創建數據表時設置主鍵約束,可以由一個字段組成,也可以多個字段聯合組成。但是不管使用哪種方法,在一個表中只能設置一個主鍵。以下是單列主鍵和多列聯合主鍵的語法格式。1.單列主鍵單列主鍵是只包含數據表中的一個字段,MySQL中單列主鍵不僅可以在定義列時同時指定主鍵,還可以在定義完所有列之后指定主鍵。單列主鍵的語法格式如下所示。5.2.4使用主鍵約束【案例5.3】添加主鍵約束。對【案例5.2】中的部門表tb_department進行完善,將字段department_id添加為主鍵,SQL語句如下。2.多列聯合主鍵多列主鍵是支持多個字段溝通組成的,但多列聯合主鍵只能在定義完所有列之后指定。多列聯合主鍵的語法格式如下所示。5.2.4使用主鍵約束【案例5.3】添加主鍵約束。對【案例5.2】中的部門表tb_department進行完善,將字段department_id添加為主鍵,SQL語句如下。5.2.4使用主鍵約束執行上述SQL語句,運行結果如下圖所示。5.2.4使用主鍵約束當數據表中不需要指定主鍵約束時,可以執行“DROP”語句將其刪除,刪除主鍵約束的語法格式如下所示。
說明:(1)表名稱:表示要刪除的主鍵約束的表的名稱;(2)PRIMARYKEY:表示主鍵約束的關鍵字。由運行結果可以得知:當出現“QueryOK”提示信息,則表示成功刪除或創建tb_department數據表。也可以執行“DESC表名稱;”語句(具體請見5.3.2查看數據表結構)查看數據表的結構,發現department_id字段已添加了主鍵約束。5.2.5使用外鍵約束外鍵約束(ForeignKeyConstraint)是用來在兩個表的數據之間建立連接,可以使一列或者多列,只要是數據表設計,一定要有外鍵關系,外鍵是作用在兩張數據表上的約束,限定某個表的某個字段的引用完整性。一張表的外鍵可以為空,也可以不為空,當外鍵不為空時,則每一個外鍵的值必須等于另一張表的主鍵的某個值,一張表的外鍵可以不是本表的主鍵,但其對應著另一張表的主鍵。在一張表中定義了外鍵之后不允許刪除另外一張表中具有關聯關系的行數據。外鍵是作用在兩個表中,對于兩個具有關聯關系的表而言,又分為主表和從表。主表(父表):兩個表具有關聯關系時,關聯字段中主鍵所在的表為主表;從表(子表):兩個表具有關聯關系時,關聯字段中外鍵所在的表為從表。外鍵約束的語法格式如下所示。5.2.5使用外鍵約束
說明:(1)外鍵名:定義外鍵約束的名稱;(2)字段:表示從表需要創建外鍵約束的字段列,可以由多個列組成;(3)主表名:表示被從表外鍵所依賴的表的名稱;(4)主鍵列:表示被應用的表中的列名,也可以由多個列組成;(5)CONSTRAINT:創建約束的關鍵字;(6)FROEIGNKEY:表示所創建約束的類型為外鍵約束;(7)REFERENCES:表示被約束的列在主表中的某個列。5.2.5使用外鍵約束【案例5.4】添加外鍵約束。在數據庫學習系統數據庫(db_study)中創建一個數據表,名稱為tb_class,用于保存班級信息,將班級號設置為主鍵,部門號設置為外鍵,則班級表結構如下表所示。在學習系統數據庫中創建tb_class數據表,按照要求添加外鍵約束的SQL語句如下所示。5.2.5使用外鍵約束在學習系統數據庫中創建tb_class數據表,按照要求添加外鍵約束的SQL語句如下所示。5.2.5使用外鍵約束執行上述SQL語句,運行結果如下圖所示。5.2.5使用外鍵約束由運行結果可以得知:成功創建tb_class數據表后,可以執行“DESC表名稱;”語句(具體請見5.3.2查看數據表結構)查看數據表的結構,發現在tb_class表中已將department_id字段添加了外鍵約束。
說明:(1)因為主表是tb_department,則必須先創建成功后,才能創建tb_class表,由于案例5.3已創建成功,所以這里才能指定外鍵成功;(2)當需要刪除數據表時,首先得先刪除從表,再刪除主表。5.2.5使用外鍵約束當數據表中不需要使用外鍵約束時,可以執行“DROP”語句將其刪除,刪除外鍵約束的語法格式如下所示。
說明:(1)表名稱:表示要刪除的外鍵約束的表的名稱;(2)字段名:需要刪除字段的外鍵約束的名稱;(3)FOREIGNKEY:表示外鍵約束的關鍵字。5.2.6使用唯一約束唯一約束(UniqueConstraint)是指數據表中某一個列的數據不允許重復。例如每個用戶的Email,郵箱地址不允許重復,就使用唯一性約束(UNIQUE)進行聲明。唯一約束與主鍵約束相似的是它們都可以確保列的唯一性。不同的是,唯一約束在一個表中可有多個,并且設置唯一約束的列允許有空值,但是只能有一個空值。而主鍵約束在一個表中只能有一個,且不允許有空值。唯一約束通常設置在除了主鍵以外的其他列上,語法格式如下所示。
說明:UNIQUE:是唯一約束的關鍵字。【案例5.5】添加唯一約束。為了避免班級名稱重名,需要為其添加唯一約束。對【案例5.4】中的班級表tb_class進行完善,將班級名稱設置為唯一約束,SQL語句如下所示。5.2.6使用唯一約束【案例5.5】添加唯一約束。為了避免班級名稱重名,需要為其添加唯一約束。對【案例5.4】中的班級表tb_class進行完善,將班級名稱設置為唯一約束,SQL語句如下所示。5.2.6使用唯一約束執行上述SQL語句,運行結果如下圖所示。5.2.6使用唯一約束由運行結果可以得知:成功創建完tb_class數據表后,可以執行“DESC表名稱;”語句(具體請見5.3.2查看數據表結構)查看數據表的結構,發現在tb_class表中已將department_id字段添加了外鍵約束。
說明:(1)同一個表可以是某一個列的值唯一,也可以多個列組合的值唯一;(2)唯一性約束允許列值為空;(3)在創建唯一約束的時候,如果不給唯一約束命名,就默認和列名相同。5.2.7使用AUTO_INCREMENT自增列在數據庫應用中,需要在每次插入記錄時,系統能自動生成字段的主鍵值。可以通過為表主鍵添加“AUTO_INCREMENT”關鍵字來實現。當主鍵定義為自增長后,這個主鍵的值就不再需要用戶輸入數據,而由數據庫根據定義自動賦值。每增加一條記錄,主鍵會自動以相同的步長進行增長。設置自增列的語法格式如下所示。【案例5.6】添加自增列。在數據庫學習系統數據庫(db_study)中創建一個數據表,名稱為tb_student,用于保存學生信息,其中需要將學號student_id字段實現自增長,且初始值為20220101001,學生表的表結構如下表所示。5.2.7使用AUTO_INCREMENT自增列【案例5.6】添加自增列。在數據庫學習系統數據庫(db_study)中創建一個數據表,名稱為tb_student,用于保存學生信息,其中需要將學號student_id字段實現自增長,且初始值為20220101001,學生表的表結構如下表所示。5.2.7使用AUTO_INCREMENT自增列在學習系統數據庫中創建tb_student數據表,按照要求添加自增長的SQL語句如下所示。5.2.7使用AUTO_INCREMENT自增列執行上述SQL語句,運行結果如下圖所示。5.2.7使用AUTO_INCREMENT自增列由運行結果可以得知:成功創建完tb_student數據表后,可以執行“DESC表名稱;”語句(具體請見5.3.2查看數據表結構)查看數據表的結構,發現在tb_student表中已將student_id字段添加了自增列約束。
說明:(1)在默認情況下,自增列的初始值為1,每新增一條記錄,字段值自動加1;(2)一個表中只能有一個字段使用自增列約束,且該字段必須為主鍵或主鍵的一部分;(3)自增列約束只能是整數類型,例如TINYINT、SMALLINT、INT、BIGINT等。5.2.8使用默認值約束默認約束(DefaultConstraint)是給某個字段/某列指定默認值,一旦設置默認值,在插入數據時,如果此字段沒有顯式賦值,則賦值為默認值。例如在1班中的學生,那么班級編號就可以指定默認值“01”。如果插入一條新的記錄并且沒有為這個字段賦值,則系統會自動為班級編號這個字段賦值為“01”。默認值約束的語法格式如下所示。
說明:(1)DEFAULT:表示默認值約束的關鍵字;(2)默認值:表示一個具體的值也可以是通過表達式得到的一個值,但必須與該字段的數據類型相匹配;(3)一個表可以有很多的默認值約束,在創建表時為列添加默認值,可以一次為多個列添加默認值,需要注意不同列的數據類型;(4)默認值約束意味著,該字段如果沒有手動賦值,會按默認值處理。5.2.9使用檢查約束檢查約束(CheckConstraint)是指在進行數據更新前設置一些過濾條件,滿足此條件的數據可以實現更新,可以使用“CHECK”關鍵字可以定義檢查約束。用于檢驗輸入值,拒絕接受不滿足條件的值,減少無效數據的輸入。檢查約束的語法格式如下所示。
說明:CHECK:表示設置檢查約束的關鍵字。雖然有檢查約束這種概念,但是在實際場景中,會比較少使用檢查約束,為什么?因為所有的檢查約束都是逐個進行過濾,如果在一個數據表上進行了過多的檢查約束,在進行數據更新的時候會嚴重影響程序的性能。比如說:哪里有交警哪里就絕對堵車,一條路沒有任何障礙物,就能很快通過,但是一旦有個障礙物,就會變得很慢。5.2.10查看數據表結構在MySQL中使用SQL語句創建好數據表之后,可以查看數據表的結構,確認數據表的定義是否正確。MySQL支持使用“DESCRIBE/DESC”語句查看數據表結構,也支持使用“SHOWCREATETABLE”語句查看數據表結構。以下是分別介紹這兩種查看數據表結構的方法。1.DESCRIBE/DESC語句使用“DESCRIBE/DESC”語句可以查看數據表的基本結構,語法格式如下所示。
說明:表名稱:表示需要查看數據表結構的表的名稱。5.2.10查看數據表結構【案例5.7】查看數據表的基本結構。使用DESCRIBE/DESC語句查看班級表tb_class的基本結構,SQL語句如下。執行上述SQL語句,運行結果如下圖所示。5.2.10查看數據表結構由運行結果得知:使用“DESCRIBE表名稱;”和“DESC表名稱;”語句查詢的結果一樣,可以查看表的字段名稱、字段數據類型、是否為主鍵、是否唯一等。其中,各個字段的含義分別解釋如下。Field:表示字段名稱;Type:表示字段類型,這里CHAR、VARCHAR是文本字符串類型;Null:表示該列是否可以存儲NULL值;Key:表示該列是否已編制索引。PRI表示該列是表主鍵的一部分;UNI表示該列是UNIQUE索引的一部分;MUL表示在列中某個給定值允許出現多次;Default:表示該列是否有默認值,如果有,那么值是多少;Extra:表示可以獲取的與給定列有關的附加信息,例如AUTO_INCREMENT等。5.2.10查看數據表結構2.SHOWCREATETABLE語句使用“SHOWCREATETABLE”語句不僅可以查看表創建時的詳細語句,還可以查看存儲引擎和字符編碼。語法格式如下所示。【案例5.8】查看數據表的詳細信息。使用“SHOWCREATETABLE”語句查看班級表tb_class的詳細信息,SQL語句如下。5.2.10查看數據表結構執行上述SQL語句,運行結果如下兩圖所示。由運行結果可知:(1)執行“SHOWCREATETABLE表名稱;”和“SHOWCREATETABLE表名稱\G”語句查看數據表的詳細信息的結果是一樣的;(2)\G參數相當于格式化輸出,使用\G之后,可以看到輸出內容具有較高的易讀性。修改數據表035.3.1重命名表在實際開發當中,還需要根據實際情況來對數據表進行修改,當需要修改數據表的名稱,則可以執行“ALTERTABLE”語句來實現表名稱的修改,具體語法格式如下。其中TO表示為可選參數,使用與否不影響執行結果。【案例5.9】修改數據表的名稱。在已有的數據表tb_class中,將tb_class表改為“班級表”,使用“ALTERTABLE”語句修改新的表名稱,SQL語句如下。5.3.1重命名表執行上述SQL語句,再執行“SHOWTABLES;”語句查看數據表,發現tb_class表已成功修改為“班級表”運行結果如下圖所示。5.3.2添加字段在實際工作當中,隨著業務需求的變化,可能需要在表中添加新的字段,添加字段時可以修改字段的排列位置,在MySQL中添加新的字段的語法格式如下。
說明:(1)FIRST是可選參數,其作用是將新添加的字段設置為表的第一個字段;(2)AFTER是可選參數,其作用是將新添加的字段添加到指定的“已存在字段名”的后面。【案例5.10】添加新的字段。對【案例5.9】中的班級表進行完善。為了統計每個班的總人數,現在需要在班級表中添加新的字段,并命名為class_size,數據類型為TINYINT類型,SQL語句如下。5.3.2添加字段執行上述SQL語句,再執行“DESC表名稱;”語句查看數據表結構,發現class_size字段已添加在列表中,運行結果如下圖所示。5.3.2添加字段在MySQL中,當創建好數據表時,想要修改數據類型時,可以使用“ALTERTABLE”語句修改字段的數據類型,修改字段的數據類型一般語法格式如下。
說明:(1)表名稱:表示需要修改數據表的名稱;(2)字段名:表示需要添加數據類型的字段列;(3)字段類型:表示該字段需要修改的數據類型。當在創建數據表時沒有添加約束,也可以執行“ALTERTABLE”語句進行添加或修改,不同的約束有不同的修改方式,以下分別講解在修改數據表時添加約束的語法格式。5.3.2添加字段1.修改數據表字段時添加主鍵約束當創建完數據表后,如果還需要為數據表的某個字段添加主鍵約束時,可以不需要重新創建數據表,可以使用“ALTER”語句為現有的數據表添加主鍵,語法格式如下。
說明:(1)約束名:表示需要添加外鍵約束的名稱;(2)字段:表示需要添加外鍵約束的字段列,可以由多個列組成;(3)CONSTRAINT:需要創建約束的關鍵字;(4)PRIMARYKEY:表示所添加約束的類型為主鍵約束。5.3.2添加字段2.修改數據表字段時添加外鍵約束如果在創建數據表時沒有創建外鍵,可以使用“ALTER”語句為現有的數據表添加外鍵,語法格式如下。
說明:(1)約束名:需要添加的外鍵約束名稱;(2)CONSTRAINT:需要添加約束的關鍵字;(3)FOREIGNKEY:表示所添加約束的類型為外鍵鍵約束;(4)主鍵列:表示需要被應用的表中的列名,也可以由多個列組成。5.3.2添加字段3.修改數據表字段時添加唯一約束如果在創建數據表時沒有創建唯一約束,可以使用“ALTER”語句為現有的數據表添加唯一約束,但是需要保證添加唯一性約束的列中存放的值沒有重復的。其語法格式如下。
說明:(1)約束名:表示需要添加的唯一約束名稱;(2)字段名:需要設置唯一約束的字段名稱;(3)UNIQUE:表示唯一約束的關鍵字。5.3.2添加字段4.修改數據表字段時添加自增性約束如果在創建數據表時沒有創建自增列,可以使用“ALTER”語句為現有的數據表添加自增列約束,其語法格式如下。
說明:(1)CHANGE:表示修改列屬性的關鍵字;(2)UNSIGNED:表示需要自增長的數值無符號化;(3)AUTO_INCREMENT:表示自增列約束的關鍵字。5.3.2添加字段5.修改數據表字段時添加默認值約束如果在創建數據表時沒有創建默認值約束,可以使用“ALTER”語句為現有的數據表添加默認值約束,其語法格式如下。
說明:(1)約束名:表示添加默認值的約束名;(2)默認值:表示具體的一個值或通過表達式得到的一個值,但該值必須與該字段的數據類型相匹配。5.3.2添加字段【案例5.11】修改字段的約束條件。在添加class_size字段時,沒有添加唯一性約束,現在給班級表中的class_size字段添加一個唯一約束,SQL語句如下。執行上述SQL語句,再執行“DESC表名稱;”語句查看字段的約束是否修改成功,發現在班級表中class_size的字段約束已添加為唯一約束,運行結果如下圖所示。5.3.3重命名字段重命名字段就是把舊的字段名修改一個新的字段名稱,為了方便開發人員或數據庫維護人員管理數據表,其語法格式如下。
說明:(1)舊字段名:指修改前的字段名稱;(2)新字段名:指修改后字段名稱;(3)新數據類型:表示修改后的數據類型,如果不需要修改字段的數據類型,可以將新數據類型設置與原來的一樣即可,但數據類型不能為空。5.3.3重命名字段【案例5.12】修改字段名稱。將班級表中的class_size字段的名稱修改為“班級人數”,數據類型不變,SQL語句如下。執行上述SQL語句,再執行“DESC表名稱;”語句查看字段的名稱是否修改成功,發現班級表中class_size的字段已成功修改成新的字段名稱“班級人數”,運行結果如下圖所示。5.3.4修改字段的排列位置對于一個數據表來說,在創建的時候,字段就在表中的排列順序就已經確定了,但表的結構并不是完全不可以改變的,也可以執行“ALTERTABLE”語句來改變表中字段的位置,其語法格式如下。
說明:(1)MODIFY:表示修改列屬性的關鍵字;(2)字段1:表示需要修改位置的字段;(3)數據類型:指的是字段1的數據類型;(4)字段2:表示需要插入新字段的前一個字段;(5)FIRST:其作用是將字段1修改為數據表中的第一個字段;(6)AFTER:其作用是將字段1插到字段2的后面。5.3.4修改字段的排列位置【案例5.13】修改字段的排列位置。將班級表中的班級人數字段的位置排列到class_name字段的后面,SQL語句如下。執行上述SQL語句,再執行“DESC表名稱;”語句查看班級人數字段是否排列在class_name字段的后面,發現在班級表中班級人數字段已排列在class_name字段的后面,運行結果如下圖所示。5.3.5刪除字段在MySQL中,刪除字段就是將數據表中的某個字段從表中移除,其語法格式如下。【案例5.14】刪除字段。在班級表中,將剛修改的“班級人數”字段刪除掉,SQL語句如下。執行上述SQL語句,再執行“DESC表名稱;”語句查看班級人數字段是否刪除成功,發現班級表中的班級人數字段已刪除成功,運行結果如下圖所示。刪除數據表045.4.1刪除沒有被關聯的表刪除沒有被關聯的表就是刪除與其他數據表沒有關聯的表,使用“DROPTABLE”語句刪除,可以一次刪除一個或多個沒有被其他表關聯的數據表,語法格式如下。【案例5.15】刪除課程表。在數據庫學習系統數據庫中,先創建一個沒有關聯其他數據表的表,稱為課程表(tb_course),用于保存課程信息,其中課程號設置為主鍵,課程名稱不可以重復,表結構如下表所示。
說明:(1)數據表n:表示需要刪除的數據表的名稱,可以同時刪除多個數據表,相互之間用逗號隔開即可;(2)IFEXISTS:用于在刪除前判斷表是否存在。5.4.1刪除沒有被關聯的表【案例5.15】刪除課程表。在數據庫學習系統數據庫中,先創建一個沒有關聯其他數據表的表,稱為課程表(tb_course),用于保存課程信息,其中課程號設置為主鍵,課程名稱不可以重復,表結構如下表所示。5.4.1刪除沒有被關聯的表在學習系統數據庫中創建tb_course數據表,SQL語句如下所示。5.4.1刪除沒有被關聯的表執行上述SQL語句,再執行“SHOWTABLES;”語句查看課程表是否創建成功,運行結果如下圖所示。由運行結果可知,發現列表中有tb_course表,說明課程表已創建成功。在學習系統數據庫中課程表tb_course與其他數據沒有任何關聯,當想要刪除課程表時,可以直接使用以下SQL語句。執行上述SQL語句,再執行“SHOWTABLES;”語句查看課程表是否刪除成功,發現數據庫學習系統數據庫中已經沒有課程表了,說明已刪除成功,運行結果如下圖所示。5.4.1刪除沒有被關聯的表5.4.2刪除被其他關聯的主表在數據表之間存在外鍵關聯的情況下,如果直接刪除父表,結果會顯示失敗,原因是之間刪除將破壞表的完整性。如果必須要刪除,可以先直接刪除與它關聯的子表,再刪除父表,只是這樣就同時刪除了兩個數據表中的數據,或者將關聯表的外鍵約束取消,再刪除父表;適用于需要保留子表的數據,只刪除父表的情況。在MySQL中刪除外鍵的語法格式如下。【案例5.16】刪除部門表。在數據庫學習系統數據庫中,將部門表tb_department進行刪除,但在案例5.4中已經將department_id字段設置為外鍵,如果直接刪除部門表,會顯示失敗。SQL語句如下。5.4.2刪除被其他關聯的主表執行上述SQL語句,可以看到直接刪除主表tb_department時,MySQL會出現“3730”報錯。運行結果如下圖所示。由錯誤提示信息可知,department_id是班級表的外鍵約束字段,班級表為子表,具有名稱為fk_department_id1的外鍵約束,tb_department為父表,其主鍵department_id被子表班級表所關聯。則需要解除關聯子表班級表的外鍵約束,SQL語句如下。運行上述SQL語句,運行結果如下圖所示。5.4.2刪除被其他關聯的主表由運行結果可知,當出現“QueryOK”提示信息,說明已經將關聯子表的外鍵約束刪除成功,則可以將父表tb_department刪除掉,SQL語句如下。運行上述SQL語句,最后再執行“SHOWTABLES;”語句查看列表中是否還有數據表tb_department,發現數據庫學習系統數據庫中已經沒有tb_department表了,說明已刪除成功,運行結果如下圖所示。課業任務055.5
課業任務王小明想利用MySQL+Java開發一個數據庫學習系統,在熟悉了MySQL數據庫的管理后,需熟悉對數據表的管理,并熟練掌握數據表的將為后續開發數據庫學習系統打下良好的基礎。現通過7個課業任務來完成。具體請見實驗4課業任務5-1創建用戶登錄表tb_login課業任務5-2往用戶登錄表tb_login中添加字段課業任務5-3修改用戶登錄表tb_login字段的數據類型課業任務5-6使用Workbench工具創建用戶登錄表課業任務5-4刪除用戶登錄表tb_login字段的一個字段課業任務5-5刪除用戶登錄表tb_login課業任務5-7使用Navicat工具往用戶登錄表中添加字段常見錯誤及解決方案065.6常見錯誤及解決方案具體請見實驗45.6.1錯誤5-1創建數據表失敗5.6.2錯誤5-2刪除數據表失敗選擇題填空題判斷題(1)以下約束不是單表約束的是()。A.主鍵約束B.非空約束C.唯一約束D.外鍵約束(2)UNIQUE唯一索引的作用是()。A.保證各行在該索引上的值都不得重復B.保證各行在該索引上的值不得為NULLC.保證參加唯一索引的各列,不得再參加其他的索引D.保證唯一索引不能被刪除DA選擇題填空題判斷題(3)MySQL中非空約束是()。A.ForeignKeyConstraintB.NotNullConstraintC.PrimaryKeyConstraintD.UniqueConstraint(4)在SQL中,創建數據表的命令是()。A.CREATEDATABASEB.CREATEVIEWC.CREATETABLED.CREATEINDEXBC選擇題填空題判斷題(5)查看數據庫中所有數據表的命令應該使用()。A.SHOWDATABASEB.SHOWTABLESC.SHOWDATABASESD.SHOWTABLEB選擇題填空題判斷題(1)在MySQL中,取值范圍最小的整型是()。(2)當某字段要使用AUTO_INCREMENT的屬性時,該字段必須是()類型的數據。(3)MySQL中數據定義語言中的創建、修改、刪除的關鍵字分別是()。(4)VARCHAR類型長度范圍是()。(5)SQL語句中修改表結構的命令是()。答案:(1)在MySQL中,取值范圍最小的整型是TINYINT。(2)當某字段要使用AUTO_INCREMENT的屬性時,該字段必須是整數類型(INT)的數據。(3)MySQL中數據定義語言中的創建、修改、刪除的關鍵字分別是CREATE、ALTER、DROP。(4)VARCHAR類型長度范圍是1到65,53
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 玉米品種采購合同協議
- 電塔電池租賃合同協議
- 生態板買賣交易合同協議
- 玩具加工代理合同協議
- 電機銷售安裝合同協議
- 玉石供貨協議合同協議
- 電子汽車計量衡合同協議
- 牲豬屠宰工作合同協議
- 申通快遞協議物流合同
- 電器設備采購合同協議
- 2023年全國高中數學聯賽北京賽區預賽試題
- 腫瘤介入治療的圍手術期管理
- 管制刀具課件教學課件
- 金融違反案例
- 工商銀行營銷培訓課件
- 煤礦人員定位系統管理制度
- 動火作業施工方案5篇
- 全心智造(廈門)體育用品有限公司體育用品制造項目
- 【基于PLC的搬運機器人系統設計(論文)7400字】
- 光纖光纜線路維護技術 第3部分:基于光傳感技術的光纜識別 征求意見稿
- 成都地鐵運營有限公司招聘筆試題庫2024
評論
0/150
提交評論