版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
數(shù)據(jù)庫的創(chuàng)建與管理第5章教學(xué)目標(biāo)理解MySQL數(shù)據(jù)表的基本概念01掌握數(shù)據(jù)庫的創(chuàng)建與管理02掌握表的創(chuàng)建、維護(hù)與修改方法03掌握如何在表中添加、修改和刪除數(shù)據(jù)記錄04掌握表的復(fù)制與刪除方法05§5.1數(shù)據(jù)庫的創(chuàng)建5.1.1創(chuàng)建數(shù)據(jù)庫CREATEDATABASE[IFNOTEXISTS]數(shù)據(jù)庫名稱
[CHARACTERSET字符集
][COLLATE校驗(yàn)規(guī)則];注意:分號(hào)是每條語句的結(jié)束標(biāo)記IFNOTEXISTS:在創(chuàng)建online_sales_system數(shù)據(jù)庫之前,首先判斷數(shù)據(jù)庫是否存在,若存在則不再創(chuàng)建,也不會(huì)報(bào)錯(cuò),如果不存在則會(huì)創(chuàng)建該數(shù)據(jù)庫;如果不做判斷直接創(chuàng)建,若數(shù)據(jù)庫已經(jīng)存在,就會(huì)有錯(cuò)誤信息提示。CHARSET字符集5.1.1創(chuàng)建數(shù)據(jù)庫數(shù)據(jù)庫名:數(shù)據(jù)庫名必須符合操作系統(tǒng)文件夾的命名規(guī)則。MySQL在Windows系統(tǒng)下默認(rèn)不區(qū)分大小寫,在Linux系統(tǒng)下默認(rèn)區(qū)分大小寫。CHARSET(8.0及以后等價(jià)于CHARACTERSET)用來設(shè)置數(shù)據(jù)庫采用的字符集,字符集是一套字符內(nèi)容與編碼方式的集合。省略表示采用默認(rèn)值utf8mb4。COLLATE用來設(shè)置數(shù)據(jù)庫校對(duì)規(guī)則,校對(duì)規(guī)則指對(duì)特定字符集比較時(shí)的排序規(guī)則。省略表示采用默認(rèn)值utf8mb4_0900_ai_ci?!?.1數(shù)據(jù)庫的創(chuàng)建5.1.1創(chuàng)建數(shù)據(jù)庫【例5.1】用CREATEDATABASE命令創(chuàng)建一個(gè)數(shù)據(jù)庫online_sales_system,存儲(chǔ)引擎、字符集和校驗(yàn)規(guī)則采用默認(rèn)值。CREATEDATABASEonline_sales_systemCHARSETutf8mb4COLLATEutf8mb4_0900_ai_ci;QueryOK,1rowaffected(0.00sec)的含義:語句成功運(yùn)行,使用時(shí)間為0.00秒。說明SQL語句運(yùn)行速度很快,不到0.01秒?!?.1數(shù)據(jù)庫的創(chuàng)建5.1.2管理數(shù)據(jù)庫----1.顯示數(shù)據(jù)庫語法格式:【例5.2】用SHOWDATABASES命令顯示所有數(shù)據(jù)庫;(大小寫均可)SHOWDATABASES;SHOWDATABASES;§5.1數(shù)據(jù)庫的創(chuàng)建5.1.2管理數(shù)據(jù)庫----1.顯示數(shù)據(jù)庫1)information_schema數(shù)據(jù)庫:存儲(chǔ)了數(shù)據(jù)庫的元數(shù)據(jù)(databasemetadata),元數(shù)據(jù)是關(guān)于MySQL服務(wù)器的信息,例如數(shù)據(jù)庫或表的名稱、列的數(shù)據(jù)類型或訪問權(quán)限等,有時(shí)也稱為數(shù)據(jù)字典(datadictionary)或系統(tǒng)目錄(systemcatalog)。2)mysql數(shù)據(jù)庫:提供了MySQL服務(wù)器運(yùn)行時(shí)所需信息的表,包括用于存儲(chǔ)數(shù)據(jù)庫對(duì)象元數(shù)據(jù)(databaseobjectmetadata)的數(shù)據(jù)字典表,以及諸如日志系統(tǒng)表、時(shí)區(qū)系統(tǒng)表等一系列系統(tǒng)表。3)performance_schema數(shù)據(jù)庫:用于監(jiān)控服務(wù)器的執(zhí)行性能,并提供執(zhí)行時(shí)的信息的訪問。sys數(shù)據(jù)庫:此數(shù)據(jù)庫主要是利用performance_schema數(shù)據(jù)庫提供的信息,生成一系列的視圖、存儲(chǔ)過程和存儲(chǔ)函數(shù),幫助數(shù)據(jù)庫管理人員和開發(fā)者了解系統(tǒng)的性能。§5.1數(shù)據(jù)庫的創(chuàng)建【例5.3】用USE命令選擇數(shù)據(jù)庫,選擇當(dāng)前數(shù)據(jù)庫。USEonline_sales_system;5.1.2管理數(shù)據(jù)庫----2.打開數(shù)據(jù)庫語法格式:USE數(shù)據(jù)庫名稱;數(shù)據(jù)庫切換成功§5.1數(shù)據(jù)庫的創(chuàng)建【例5.4】查看網(wǎng)絡(luò)購物數(shù)據(jù)庫online_sales_system中包含的數(shù)據(jù)表等對(duì)象。SHOW
TABLES;5.1.2管理數(shù)據(jù)庫----3.查看數(shù)據(jù)庫信息查看數(shù)據(jù)庫對(duì)象語法格式:SHOWTABLES;數(shù)據(jù)庫名稱數(shù)據(jù)庫onlin_sales_system1中包含的對(duì)象§5.1數(shù)據(jù)庫的創(chuàng)建數(shù)據(jù)庫對(duì)象包括:數(shù)據(jù)表、索引、視圖、存儲(chǔ)過程等【例5.5】查看網(wǎng)絡(luò)購物數(shù)據(jù)庫online_sales_system采用的字符集。5.1.2管理數(shù)據(jù)庫----3.查看數(shù)據(jù)庫信息查看字符集的語法格式:SHOWVARIABLESLIKE'character_set_database';§5.1數(shù)據(jù)庫的創(chuàng)建【例5.6】查看網(wǎng)絡(luò)購物數(shù)據(jù)庫online_sales_system采用的校驗(yàn)規(guī)則。5.1.2管理數(shù)據(jù)庫----3.查看數(shù)據(jù)庫信息查看校驗(yàn)規(guī)則的語法格式:SHOWVARIABLESLIKE'collation_database';§5.1數(shù)據(jù)庫的創(chuàng)建【例5.7】查看網(wǎng)絡(luò)購物數(shù)據(jù)庫online_sales_system的詳細(xì)信息。5.1.2管理數(shù)據(jù)庫----3.查看數(shù)據(jù)庫信息查看數(shù)據(jù)庫定義的詳細(xì)信息的語法格式:SHOWCREATE
DATABASE數(shù)據(jù)庫名稱;SHOWCREATE
DATABASE
online_sales_system;§5.1數(shù)據(jù)庫的創(chuàng)建字符集校驗(yàn)規(guī)則是否加密DROPDATABASEIFEXISTSonline_sales_system;5.1.2管理數(shù)據(jù)庫----4.刪除數(shù)據(jù)庫刪除數(shù)據(jù)庫的語法格式:DROPDATABASE[IFEXISTS]數(shù)據(jù)庫名稱;【例5.8】用DROPDATABASE命令刪除online_sales_system數(shù)據(jù)庫。IF
EXISTS:在刪除online_sales_system數(shù)據(jù)庫之前,首先判斷數(shù)據(jù)庫是否存在,若存在則刪除,否則不執(zhí)行刪除運(yùn)算;如果不做判斷直接刪除,若數(shù)據(jù)庫不存在,就會(huì)出現(xiàn)錯(cuò)誤的提示。§5.1數(shù)據(jù)庫的創(chuàng)建5.1.2管理數(shù)據(jù)庫----4.刪除數(shù)據(jù)庫【例5.9】使用DROPDATABASE語句刪除數(shù)據(jù)庫時(shí),使用IFEXISTS可選項(xiàng)和不使用IFEXISTS可選項(xiàng)兩種情況再刪除一次數(shù)據(jù)庫online_sales_system。§5.1數(shù)據(jù)庫的創(chuàng)建MySQL對(duì)象包括數(shù)據(jù)庫、表、視圖、索引、存儲(chǔ)過程或存儲(chǔ)函數(shù)等。這些對(duì)象名稱統(tǒng)稱為標(biāo)識(shí)符,標(biāo)識(shí)符必須符合一定規(guī)則或約定,各個(gè)DBMS的約定不完全相同。在MySQL中,數(shù)據(jù)表是數(shù)據(jù)庫中最重要、最基本的操作對(duì)象,是存儲(chǔ)數(shù)據(jù)的基本單位。如果把數(shù)據(jù)庫比喻成柜子,那么表就像柜子中各種規(guī)格的抽屜。一個(gè)表就是一個(gè)關(guān)系,表實(shí)質(zhì)上就是行列的集合,每一行代表一條記錄,每一列代表記錄的一個(gè)字段。每個(gè)表由若干行組成,表的第一行為各列標(biāo)題,其余行都是數(shù)據(jù)?!?.2認(rèn)識(shí)數(shù)據(jù)表1)標(biāo)識(shí)符可以由當(dāng)前字符集中的任何字母、漢字、數(shù)字字符組成,另外,還可以包括下劃線(_)和美元符號(hào)($)。但一般不建議使用漢字作為標(biāo)識(shí)符。
2)標(biāo)識(shí)符最長為64個(gè)字符。但標(biāo)識(shí)符的長度受限于所用操作系統(tǒng)限定的長度。3)標(biāo)識(shí)符應(yīng)盡可能做到“見名知義”。
4)用戶自己定義的標(biāo)識(shí)符可以直接使用,如果標(biāo)識(shí)符名與系統(tǒng)保留字(關(guān)鍵字)重名時(shí),應(yīng)該用反引號(hào)(``)括起來。但建議在給對(duì)象命名時(shí),應(yīng)避免和系統(tǒng)的保留字重名。
5)操作系統(tǒng)中的文件系統(tǒng)是否大小寫敏感,會(huì)影響到如何命名和引用數(shù)據(jù)庫對(duì)象。如果文件系統(tǒng)大小寫敏感(如UNIX),名字為tbl_items、TBL_items和tbl_ITEMS是三個(gè)不同的標(biāo)識(shí)符。如果文件系統(tǒng)大小寫不敏感(如Windows),那么這三個(gè)名字指的是一個(gè)標(biāo)識(shí)符,也就是對(duì)應(yīng)一個(gè)對(duì)象。標(biāo)識(shí)符的命名規(guī)則如下:§5.2認(rèn)識(shí)數(shù)據(jù)表1.表的名稱在當(dāng)前數(shù)據(jù)庫中操作數(shù)據(jù)表時(shí),表名之前的數(shù)據(jù)庫名限定可以省略,只有在處理屬于兩個(gè)不同數(shù)據(jù)庫中的數(shù)據(jù)表時(shí),才需要用完整的數(shù)據(jù)表名。數(shù)據(jù)庫名.表名完整的數(shù)據(jù)表名稱應(yīng)該由數(shù)據(jù)庫名和表名兩部分組成,其格式如下:§5.2認(rèn)識(shí)數(shù)據(jù)表2.數(shù)據(jù)表MySQL的表擁有列(Column)和行(Row)。列即是字段(Field),而每一行中的各個(gè)字段的數(shù)據(jù)構(gòu)成一條數(shù)據(jù)記錄(Record)。數(shù)據(jù)表表的結(jié)構(gòu)表的內(nèi)容(數(shù)據(jù)、記錄)§5.2認(rèn)識(shí)數(shù)據(jù)表【例5.10】顯示客戶表customers的數(shù)據(jù),了解表的構(gòu)成。2.數(shù)據(jù)表字段字段字段字段第一行是表的結(jié)構(gòu)記錄記錄記錄§5.2認(rèn)識(shí)數(shù)據(jù)表記錄3.表的結(jié)構(gòu)表的結(jié)構(gòu)定義即決定表擁有哪些字段以及這些字段的特性。所謂“字段特性”是指這些字段的名稱、數(shù)據(jù)類型、長度、精度、小數(shù)位數(shù)、是否允許空值(NULL)、設(shè)置默認(rèn)值、主碼等。【例5.11】使用DESC語句查看客戶表customers的表結(jié)構(gòu)?!?.2認(rèn)識(shí)數(shù)據(jù)表4.字段名(1)字段名最長可達(dá)64個(gè)字符。(2)字段名可包含中文、英文字母、數(shù)字、下劃線符號(hào)(_)、#字符號(hào)()、$貨幣符號(hào)。字段名可以用中文(建議盡量不要使用中文字段名)。(3)字段名應(yīng)盡可能做到“見名知義”。通過字段名稱就可以知道字段表示的屬性值的含義,從而增強(qiáng)可讀性。(4)同一個(gè)表中,各個(gè)字段的名稱不能重復(fù)。(5)字段名不能使用MySQL語言中的關(guān)鍵字,如:DROP、ALTER、INSERT、CREATE等。表可以擁有多個(gè)字段,各個(gè)字段分別用來存儲(chǔ)不同性質(zhì)的數(shù)據(jù),字段名同樣必須符合MySQL的命名規(guī)則?!?.2認(rèn)識(shí)數(shù)據(jù)表5.表間關(guān)系在關(guān)系數(shù)據(jù)庫中,一個(gè)數(shù)據(jù)庫系統(tǒng)一般都包含多個(gè)表,表間也會(huì)存在聯(lián)系。表間聯(lián)系是通過外鍵(外碼)來實(shí)現(xiàn)的,也是體現(xiàn)了關(guān)系之間的參照完整性。主表(父表)從表(子表)主表(父表)從表(子表)從表(子表)主表(父表)§5.2認(rèn)識(shí)數(shù)據(jù)表數(shù)值數(shù)據(jù)類型:包括整數(shù)類型TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,浮點(diǎn)小數(shù)類型FLOAT和DOUBLE,定點(diǎn)小數(shù)類型DECIMAL。日期/時(shí)間類型:包括YEAR、TIME、DATE、DATETIME和TIMESTAMP。字符串類型:包括CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET等。二進(jìn)制類型:包括BIT、BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。MySQL提供多種數(shù)據(jù)類型,數(shù)據(jù)類型是對(duì)數(shù)據(jù)存儲(chǔ)方式的一種約定,它能夠規(guī)定數(shù)據(jù)的操作方式和存儲(chǔ)所占空間的大小。MySQL數(shù)據(jù)庫使用不同的數(shù)據(jù)類型存儲(chǔ)數(shù)據(jù),主要根據(jù)實(shí)際需求(數(shù)據(jù)值的內(nèi)容、大小、精度)來選擇合適的數(shù)據(jù)類型。§5.3數(shù)據(jù)類型5.3.1數(shù)值類型MySQL支持所有的ANSI/ISOSQL92數(shù)字類型,包括整數(shù)和小數(shù)。其中整數(shù)用整數(shù)類型表示;小數(shù)用浮點(diǎn)數(shù)類型和定點(diǎn)數(shù)類型表示。數(shù)據(jù)類型字節(jié)數(shù)無符號(hào)數(shù)的取值范圍有符號(hào)數(shù)的取值范圍TINYINT10~255-128~127SMALLINT20~65535-32768~32767MEDIUMINT30~16777215-8388608~8388607INT或INTEGER40~4294967295-2147483648~2147483647BIGINT80~18446744073709551615-9223372036854775808~9223372036854775807MySQL的整數(shù)類型表—----整數(shù)類型§5.3數(shù)據(jù)類型5.3.1數(shù)值類型——整數(shù)類型注:MySQL允許指定整數(shù)值的顯示寬度,INT(M)表示該整數(shù)值最大有效顯示寬度為M。例如INT(10)表示最大顯示寬度為10。在MySQL8.x及以后版本不再支持設(shè)置顯示寬度。顯示寬度與存儲(chǔ)大小、類型包含的值的范圍無關(guān);實(shí)際數(shù)據(jù)位數(shù)<M時(shí),由空格(或0)填充(右對(duì)齊:填在左側(cè))。實(shí)際數(shù)據(jù)位數(shù)>M時(shí),顯示完整數(shù)據(jù)。如果在定義表結(jié)構(gòu)時(shí)不指定顯示寬度,系統(tǒng)則為該字段指定默認(rèn)的顯示寬度?!?.3數(shù)據(jù)類型5.3.1數(shù)值類型——浮點(diǎn)數(shù)類型MySQL中使用浮點(diǎn)數(shù)和定點(diǎn)數(shù)表示小數(shù);其中浮點(diǎn)類型有兩種:單精度浮點(diǎn)類型FLOAT和雙精度浮點(diǎn)類型DOUBLE;定點(diǎn)數(shù)類型只有一種DECIMAL。用(M,D)來定義小數(shù),其中M稱為精度,表示總共的位數(shù);D稱為標(biāo)度,表示小數(shù)的位數(shù)。其中M和D的取值范圍是:M(1~255),D(1~30,且不能大于M-2)數(shù)據(jù)類型字節(jié)數(shù)負(fù)數(shù)的取值范圍非負(fù)數(shù)的取值范圍FLOAT4-3.402823466E+38~-1.175494351E-380和1.175494351E-38~3.402823466E+38DOUBLE8-1.7976931E+308~-2.2250738E-3080和2.2250738E-308~1.7976931E+308MySQL的浮點(diǎn)數(shù)類型表§5.3數(shù)據(jù)類型5.3.1數(shù)值類型——定點(diǎn)數(shù)類型定點(diǎn)數(shù)類型DECIMAL實(shí)際是以字符串存儲(chǔ)的。DECIMAL可能的最大取值范圍與DOUBLE一樣;但其有效的取值范圍由M和D決定。M固定,則其取值范圍將隨著D的變大而變小,但精度增加;D固定,則其取值范圍將隨著M的變大而變大。DECIMAL的存儲(chǔ)空間不是固定的,由M和D決定:若M>D,則字節(jié)數(shù)為M+2;若D>M,則字節(jié)數(shù)為D+2。數(shù)據(jù)類型字節(jié)數(shù)負(fù)數(shù)的取值范圍非負(fù)數(shù)的取值范圍DEC(M,D)、DECIMAL(M,D)如果M>D為M+2,否則為D+2-1.7976931E+308~-2.2250738E-3080和2.2250738E-308~1.7976931E+308MySQL的定點(diǎn)數(shù)類型表§5.3數(shù)據(jù)類型5.3.1數(shù)值類型
1)在能夠容納所有數(shù)據(jù)的前提下,盡可能選擇最小的可用類型。例如年齡,正常的值在0到120之間,則可以使用TINYINT,這樣數(shù)據(jù)占用內(nèi)存少,數(shù)據(jù)處理也更簡單。2)在需要表示的精度要求比較高的時(shí)候,比如貨幣、用于科學(xué)計(jì)算用的數(shù)據(jù)等,優(yōu)先選擇定點(diǎn)數(shù)類型DECIMAL。
3)不論定點(diǎn)類型還是浮點(diǎn)類型,如果用戶指定的精度值超過系統(tǒng)定義的精度范圍,則會(huì)進(jìn)行四舍五入。4)因?yàn)楦↑c(diǎn)數(shù)存在誤差,也盡量避免兩個(gè)數(shù)值相近的浮點(diǎn)數(shù)進(jìn)行大小比較。在創(chuàng)建表時(shí),數(shù)字類型的選擇應(yīng)遵循一下原則:§5.3數(shù)據(jù)類型5.3.2日期時(shí)間類型MySQL支持5種日期類型:包括YEAR、DATE、TIME、DATETIME和TIMESTAMP。日期時(shí)間類型字節(jié)數(shù)范圍格式用途DATE41000-01-01~9999-12-31YYYY-MM-DD日期值TIME3-838:59:59~838:59:59HH:MM:SS時(shí)間值YEAR11901~2155YYYY年份值DATETIME81000-01-0100:00:00~9999-12-3123:59:59YYYY-MM-DDHH:MM:SS混合日期和時(shí)間值TIMESTAMP419700101080001~2038年的某一時(shí)刻YYYYMMDDHHMMSS時(shí)間戳§5.3數(shù)據(jù)類型5.3.2日期時(shí)間類型(1)DATE類型的字段一般使用函數(shù)CURRENT_DATE()或NOW()插入計(jì)算機(jī)系統(tǒng)的當(dāng)前日期;(2)在給DATETIME類型的字段賦值時(shí),可以使用字符串類型或者數(shù)值類型,只需符合DATETIME格式;(3)DATETIME和TIMESTAMP的顯示格式相同,顯示寬度為19個(gè)字符;但TIMESTAMP的取值范圍小;(4)DATETIME按實(shí)際輸入的格式存儲(chǔ),和時(shí)區(qū)無關(guān);(5)TIMESTAMP是以UTC(世界標(biāo)準(zhǔn)時(shí)間)格式存儲(chǔ),在進(jìn)行查詢時(shí),根據(jù)讀者所在時(shí)區(qū)不同,顯示的日期時(shí)間值是不同的。形式上,日期類型的表示方法與字符串的表示方法相同,使用單引號(hào)括起來;本質(zhì)上,日期類型的數(shù)據(jù)是一個(gè)數(shù)值類型,可以參與簡單的加、減運(yùn)算;每種日期類型都有取值范圍,當(dāng)插入不合法的值時(shí),系統(tǒng)會(huì)將“0”插入該字段?!?.3數(shù)據(jù)類型5.3.3字符串類型MySQL支持2種字符串類型:文本字符串和二進(jìn)制字符串。字符串類型指的是CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。字符串類型的數(shù)據(jù)又可以分為普通的文本字符串類型(CHAR和VARCHAR)、可變類型(TEXT和BLOB)和特殊類型(SET和ENUM)VARCHAR和TEXT類型是變長類型,它們的存儲(chǔ)需求取決于值的實(shí)際長度,而不是取決于類型的最大可能程度。例如。一個(gè)VARCHAR(10)字段能保存最大長度為10個(gè)字符的一個(gè)字符串,實(shí)際的存儲(chǔ)需求是字符串的長度加上1個(gè)字節(jié)來記錄字符串的長度。例如,字符串’welcome’,字符個(gè)數(shù)是7而存儲(chǔ)需求是8個(gè)字節(jié)?!?.3數(shù)據(jù)類型5.3.3字符串類型字符串類型大小用途字符串類型大小用途CHAR0~255B定長字符串VARCHAR0~255B變長字符串TINYBLOB0~255B不超過255個(gè)字符的二進(jìn)制字符串YINYTEXT0~255B短文本字符串BLOB0~65535B二進(jìn)制的長文本數(shù)據(jù)TEXT0~65535B長文本數(shù)據(jù)MEDIUMBLOB0~16777215B二進(jìn)制形式的中等長度文本數(shù)據(jù)MEDIUMTEXT0~16777215B中等長度文本數(shù)據(jù)LONGBLOB0~4294967295B二進(jìn)制形式的極大文本數(shù)據(jù)LONGTEXT0~4294967295B極大文本數(shù)據(jù)§5.3數(shù)據(jù)類型5.3.3字符串類型(1)CHAR和VARCHAR類型CHAR(M)為固定長度字符串,M表示該字段中存儲(chǔ)的字符串長度,取值范圍在0~255,輸入的字符串長度不足M時(shí),右側(cè)用空格填滿,當(dāng)查詢到CHAR的值時(shí),尾部的空格被刪除。VARCHAR(M)為長度可變的字符串,M表示最大的字符串長度,取值范圍在0~65535,VARCHAR的最大實(shí)際長度由最長字段的大小和使用的字符集確定。例如:VARCHAR(50)定義一個(gè)最長為50的字符串,如果輸入的字符串只有20個(gè)字符,那么實(shí)際存儲(chǔ)的字符串的長度為21,20個(gè)字符+一個(gè)字符串結(jié)束符。VARCHAR在值存儲(chǔ)和查詢時(shí)尾部的空格仍保留?!?.3數(shù)據(jù)類型5.3.3字符串類型(2)TEXT類型TEXT字段保存非二進(jìn)制字符串,如文章內(nèi)容、評(píng)論、留言等,當(dāng)保存或查詢TEXT字段值時(shí),不刪除尾部空格。TEXT類型分為4種:TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT。不同的TEXT類型所需的存儲(chǔ)空間和數(shù)據(jù)長度都有所不同。§5.3數(shù)據(jù)類型5.3.4二進(jìn)制類型MySQL支持7種二進(jìn)制類型:BINARY、VARBINARY、BIT、TINYBLOB、BLOB、MEDIUBLOB、LONGBLOB。二進(jìn)制類型的主要用于存儲(chǔ)由‘0’、‘1’組成的字符串,從某種意義上講,二進(jìn)制類型的數(shù)據(jù)是一種特殊格式的字符串。二進(jìn)制類型與字符型的區(qū)別在于,字符串類型的數(shù)據(jù)按字符為單位進(jìn)行存儲(chǔ),因此有多種字符集和多種字符序;除了BIT數(shù)據(jù)類型按位為單位進(jìn)行存儲(chǔ),其他二進(jìn)制類型的數(shù)據(jù)都是按字節(jié)為單位存儲(chǔ),僅存在二進(jìn)制字符集binary。§5.3數(shù)據(jù)類型5.3.5枚舉類型其中“字段名”指將要定義的字段名稱;“值n”指的是枚舉列表中的第n個(gè)值,枚舉列表中最多可以有65535個(gè)值,列表中的每個(gè)值的尾部空格自動(dòng)被刪除。ENUM類型的字段在取值時(shí),只能在指定的枚舉列表中取,而且只能取一個(gè)值。ENUM值在計(jì)算機(jī)中用整數(shù)表示,每個(gè)枚舉列表中的值都有一個(gè)索引值,列表值從1開始。ENUM值依照索引順序排列,空字符串排在非空字符串之前,NULL值排在其他所有枚舉值之前。如果ENUM類型的字段聲明為允許NULL,NULL則為該字段的有效值,也是默認(rèn)值;否則默認(rèn)值為枚舉列表中的第1個(gè)值。ENUM是一種字符串類型,創(chuàng)建表時(shí),通過枚舉方式(一個(gè)個(gè)的值列出來)為字段顯式指定枚舉列表。語法格式:字段名ENUM(‘值1’,’值2’,…,’值n’)§5.3數(shù)據(jù)類型5.3.5枚舉類型【例5.12】使用CREATE語句創(chuàng)建一張加班記錄表tbl_work_overtime包含INT類型的序號(hào)id、CHAR(4)類型的職工編號(hào)employee_id、ENUM類型的周幾weekday三個(gè)字段。weekday字段沒有設(shè)置默認(rèn)值,允許為NULL。
CREATETABLEtbl_work_overtime1(idINT,employee_idCHAR(4),weekdayENUM('monday','tuesday','wednesday','thursday','friday','saturday','sunday'));首先,創(chuàng)建表允許為空§5.3數(shù)據(jù)類型5.3.5枚舉類型【例5.12】使用CREATE語句創(chuàng)建一張加班記錄表tbl_work_overtime包含INT類型的序號(hào)id、CHAR(4)類型的職工編號(hào)employee_id、ENUM類型的周幾weekday三個(gè)字段。weekday字段沒有設(shè)置默認(rèn)值,允許為NULL。
INSERTINTOtbl_work_overtime1(id,employee_id)VALUES(1,'1001');INSERTINTOtbl_work_overtime1VALUES(2,'1002','sunday'),(3,'1003','wednesday');其次,插入數(shù)據(jù)§5.3數(shù)據(jù)類型5.3.5枚舉類型【例5.12】使用CREATE語句創(chuàng)建一張加班記錄表tbl_work_overtime包含INT類型的序號(hào)id、CHAR(4)類型的職工編號(hào)employee_id、ENUM類型的周幾weekday三個(gè)字段。weekday字段沒有設(shè)置默認(rèn)值,允許為NULL。
SELECT*FROMtbl_work_overtime1;最后,查看記錄內(nèi)容§5.3數(shù)據(jù)類型5.3.5枚舉類型【例5.13】使用CREATE語句創(chuàng)建一張加班記錄表tbl_work_overtime2包含INT類型的序號(hào)id、CHAR(4)類型的職工編號(hào)employee_id、ENUM類型的周幾weekday三個(gè)字段。并為weekday字段設(shè)置默認(rèn)值'saturday'。
CREATETABLEtbl_work_overtime2(idINT,employee_idCHAR(4),weekdayENUM('monday','tuesday','wednesday','thursday','friday','saturday','sunday')DEFAULT'saturday');首先,創(chuàng)建表設(shè)置默認(rèn)值§5.3數(shù)據(jù)類型5.3.5枚舉類型INSERTINTOtbl_work_overtime2(id,employee_id)VALUES(1,'1001');INSERTINTOtbl_work_overtime2VALUES(2,'1002','sunday'),(3,'1003','wednesday');其次,插入數(shù)據(jù)
SELECT*FROMtbl_work_overtime2;最后,查看記錄內(nèi)容§5.3數(shù)據(jù)類型5.3.5枚舉類型【例5.14】使用CREATE語句創(chuàng)建一張加班記錄表tbl_work_overtime3包含INT類型的序號(hào)id、CHAR(4)類型的職工編號(hào)employee_id、ENUM類型的周幾weekday三個(gè)字段。并為weekday字段設(shè)置NOTNULL。
CREATETABLEtbl_work_overtime3(idINT,employee_idCHAR(4),weekdayENUM('monday','tuesday','wednesday','thursday','friday','saturday','sunday')NOTNULL);首先,創(chuàng)建表設(shè)置NOTNULL、沒有默認(rèn)值§5.3數(shù)據(jù)類型5.3.5枚舉類型INSERTINTOtbl_work_overtime3(id,employee_id)VALUES(1,'1001');INSERTINTOtbl_work_overtime3VALUES(2,'1002','sunday'),(3,'1003','wednesday');其次,插入數(shù)據(jù)
SELECT*FROMtbl_work_overtime3;最后,查看記錄內(nèi)容§5.3數(shù)據(jù)類型枚舉類型的字段不允許為NULL、沒有設(shè)置默認(rèn)值,如果插入數(shù)據(jù)時(shí)省略,則取枚舉類型定義的第一個(gè)值。5.3.6集合類型SET類型也屬于字符串類型,在創(chuàng)建表的時(shí)候,通過列舉方式(一個(gè)個(gè)的值列出來)為字段顯式指定集合列表。語法格式:字段名SET(‘值1’,’值2’,…,’值n’)§5.3數(shù)據(jù)類型5.3.6集合類型與ENUM類型相同的是:SET值在內(nèi)部用整數(shù)表示,列表中每個(gè)值都有一個(gè)索引編號(hào)。創(chuàng)建表時(shí),SET成員的尾部空格被自動(dòng)刪除。與ENUM類型不同的是:ENUM類型的字段只能在指定的枚舉列表中選擇一個(gè)值;而SET類型的字段可以從定義的列表中選擇多個(gè)值。如果插入SET字段中的值有重復(fù),則MySQL自動(dòng)刪除多余的重復(fù)值;插入SET字段的值的順序不重要,系統(tǒng)在存入數(shù)據(jù)庫時(shí)會(huì)按照SET定義的順序存儲(chǔ)和顯示;如果插入非法數(shù)據(jù)則被忽視,并給出警告。枚舉類型與集合類型的比較:§5.3數(shù)據(jù)類型5.3.6集合類型【例5.15】使用CREATE語句創(chuàng)建一張學(xué)生興趣愛好的表tbl_hobbies包含CHAR(10)類型的學(xué)號(hào)stud_id、VARCHAR(10)類型的姓名name、SET類型的興趣愛好hobby三個(gè)字段。其中興趣愛好包括:音樂、唱歌、跳遠(yuǎn)、跳高、乒乓球、籃球、攝影、素描。
CREATETABLEtbl_hobbies(stud_idCHAR(10),nameVARCHAR(10),hobbySET('音樂','唱歌','跳遠(yuǎn)','跳高','乒乓球','籃球','攝影','素描'));首先,創(chuàng)建表§5.3數(shù)據(jù)類型5.3.6集合類型INSERTINTOtbl_hobbies(stud_id,name)VALUES('2021010566','楊欣悅');INSERTINTOtbl_hobbies(stud_id,name,hobby)VALUES('2021010567','孫穆晨','攝影,唱歌'),('2021010567','鄭澤龍','籃球,乒乓球,攝影');其次,插入數(shù)據(jù)
SELECT*FROMtbl_hobbies;最后,查看記錄內(nèi)容§5.3數(shù)據(jù)類型5.3.6集合類型枚舉類型與集合類型的比較:ENUM類型的字段只允許從一個(gè)集合中取一個(gè)值,類似于單選按鈕。例如,性別只能從|‘男’,‘女’|中取一個(gè)值。SET類型的字段允許從一個(gè)集合中取多個(gè)值,類似于復(fù)選框。例如,興趣愛好可以從|‘購物’,‘旅游’,‘游泳’,‘唱歌’,‘運(yùn)動(dòng)’|中取多個(gè)值。一個(gè)SET類型的數(shù)據(jù)最多可以包含64個(gè)元素;一個(gè)ENUM類型的數(shù)據(jù)最多可以包含65535個(gè)元素。§5.3數(shù)據(jù)類型運(yùn)算符是用來連接表達(dá)式中各個(gè)操作數(shù)據(jù)的符號(hào)。用來指明對(duì)操作數(shù)據(jù)所進(jìn)行的運(yùn)算。MySQL支持算術(shù)運(yùn)算符、比較運(yùn)算符、邏輯運(yùn)算符和位運(yùn)算符四種類型。5.4.1
算術(shù)運(yùn)算符運(yùn)算符作用+加法,返回相加后的值-減法,返回相減后的值*乘法,返回相乘后的值/,DIV取整,返回相除后的商%,MOD求余,返回相除后的余數(shù)§5.4運(yùn)算符【例5.16】在MySQL中使用SELECT可以顯示表達(dá)式的值。
SELECT5+2,5-2,5*2,5/2,5DIV2,5/0,5%2,5MOD2,5MOD0;5.4.1
算術(shù)運(yùn)算符§5.4運(yùn)算符5.4.2比較運(yùn)算符運(yùn)算符作用運(yùn)算符作用=、<、<=、>、>=等于、小于、小于等于、大于、大于等于IN(value1,value2,…)存在于集合(value1,value2,…)中<>或!=不等于ISNULL為NULL<=>當(dāng)兩個(gè)操作數(shù)都為NULL時(shí)返回1IS
NOT
NULL不為NULLBETWEENminANDmax判斷操作數(shù)在min和max之間REGEXP或RLIKE正則表達(dá)式匹配LIKE通配符匹配?!?”匹配任意數(shù)目的字符,包括零字符,“_”只匹配一個(gè)字符比較運(yùn)算符有很多,比較結(jié)果為真返回1,為假返回0為NULL?!?.4運(yùn)算符5.4.2比較運(yùn)算符數(shù)值比較時(shí)的規(guī)則(1)若有一個(gè)或兩個(gè)參數(shù)為NULL,則比較運(yùn)算符的結(jié)果為NULL。(2)若同一個(gè)比較運(yùn)算符中的兩個(gè)參數(shù)都是字符串,則按照字符串進(jìn)行比較(不區(qū)分大小寫)。(3)若兩個(gè)參數(shù)均為整數(shù),則按照整數(shù)進(jìn)行比較。(4)若兩個(gè)參數(shù)均為數(shù)字,則按浮點(diǎn)數(shù)進(jìn)行比較。(5)若一個(gè)字符串和一個(gè)數(shù)字進(jìn)行相等比判斷,則MySQL可以自動(dòng)將字符串轉(zhuǎn)換為數(shù)字,然后按數(shù)字進(jìn)行比較?!?.4運(yùn)算符【例5.17】使用比較運(yùn)算符進(jìn)行比較運(yùn)算。
SELECT1=0,'2'=2,1+5=3+3,'ab'='ad',5=NULL,NULL=NULL,NULL<=>NULL;5.4.2比較運(yùn)算符----比較大小運(yùn)算符§5.4運(yùn)算符【例5.18】使用BETWEENAND和NOTBETWEENAND進(jìn)行區(qū)間判斷。SELECT6BETWEEN1AND6,6BETWEEN10+5AND1,'f'BETWEEN'a'AND'z',16BETWEEN1AND10,16NOTBETWEEN1AND10;5.4.2比較運(yùn)算符----[NOT]BETWEENAND運(yùn)算符語法格式:表達(dá)式
[NOT]BETWEENminANDmax§5.4運(yùn)算符【例5.19】使用LEAST和GREATEST運(yùn)算符求最值。
SELECTLEAST(5,12),LEAST('ab','abc'),LEAST(10,NULL),GREATEST(5,12,8),GREATEST(10,NULL);5.4.2比較運(yùn)算符----LEAST和GREATEST運(yùn)算符語法格式:LEAST|GREATEST(值1,值2,…,值n)§5.4運(yùn)算符【例5.20】使用ISNULL(ISNULL)和ISNOTNULL判斷NULL值和非NULL值。
SELECTNULLISNULL,ISNULL(NULL),ISNULL(1),1ISNULL,1ISNOTNULL,NULLISNOTNULL;5.4.2比較運(yùn)算符----IS[NOT]NULL(ISNULL)運(yùn)算符語法格式:表達(dá)式
IS[NOT]NULL§5.4運(yùn)算符【例5.21】使用IN和NOTIN進(jìn)行判斷。
SELECT5IN(1,5,'sql'),'sql'NOTIN(1,2,'sql'),NULLIN(1,5,'sql'),NULLIN(1,5,NULL),NULLNOTIN(1,5,NULL);5.4.2比較運(yùn)算符----IN和NOTIN運(yùn)算符語法格式:表達(dá)式
[NOT]IN(值1,值2,…,值n)§5.4運(yùn)算符?'%',可以匹配任意n個(gè)字符,n>=0;?'_',只能匹配一個(gè)字符;
SELECT'lucky'LIKE'l%','lucky'LIKE'%y','lucky'LIKE'l_cky','lucky_lily'LIKE'lucky/_%'ESCAPE'/','luckylily'LIKE'lucky/_%'ESCAPE'/';5.4.2比較運(yùn)算符----LIKE運(yùn)算符語法格式:表達(dá)式
LIKE匹配條件通配符:【例5.22】使用LIKE運(yùn)算符進(jìn)行字符匹配?!?.4運(yùn)算符5.4.3邏輯運(yùn)算符運(yùn)算符作用NOT或!邏輯非AND或&邏輯與OR或||邏輯或XOR邏輯異或邏輯運(yùn)算也成為布爾運(yùn)算,在SQL中,所有邏輯表達(dá)式的結(jié)果均為TRUE或FALSE或NULL,在MySQL中分別顯示為1、0、NULL?!?.4運(yùn)算符5.4.3.邏輯運(yùn)算符(1)NOT或者?。罕硎井?dāng)操作數(shù)為零時(shí),返回值為1,當(dāng)操作數(shù)為1時(shí),返回值為0,當(dāng)操作數(shù)為NULL時(shí),返回值為NULL。(2)AND或者&:表示當(dāng)所有操作數(shù)均為非零值,并且不為NULL時(shí),返回值為1,當(dāng)一個(gè)或多個(gè)操作數(shù)為零時(shí),返回值為0,其余情況返回值為NULL。(3)OR或者||:表示當(dāng)兩個(gè)操作數(shù)均不為NULL,且任意一個(gè)操作數(shù)為非零,使結(jié)果為1,否則結(jié)果為0。當(dāng)有一個(gè)操作數(shù)為NULL,且另一個(gè)操作數(shù)為非零值,則結(jié)果為1,否則結(jié)果為NULL;當(dāng)兩個(gè)操作數(shù)均為NULL時(shí),則所得結(jié)果為NULL。(4)XOR:當(dāng)任意一個(gè)操作數(shù)為NULL時(shí),返回值為NULL,對(duì)于非NULL的操作數(shù),如果兩個(gè)操作數(shù)都是非0值或者都是0值,則返回值結(jié)果為0,如果一個(gè)為0,另一個(gè)為非0值,返回值結(jié)果為1。§5.4運(yùn)算符【例5.23】使用邏輯非運(yùn)算符進(jìn)行邏輯運(yùn)算。
SELECTNOT0,NOT10,!0,!0,!-10,NOT10+1,!10+1,!0+1,NOTNULL,!NULL;5.4.3.邏輯運(yùn)算符§5.4運(yùn)算符【例5.24】使用AND、OR、XOR進(jìn)行邏輯運(yùn)算。
SELECT10AND-8,0AND10,0ANDNULL,10ANDNULL,10OR0,10ORNULL,0ORNULL,10XOR0,10XORNULL;5.4.3.邏輯運(yùn)算符§5.4運(yùn)算符在創(chuàng)建完數(shù)據(jù)庫之后,接下來就要在數(shù)據(jù)庫中創(chuàng)建數(shù)據(jù)表。所謂創(chuàng)建數(shù)據(jù)表,指的是在已經(jīng)創(chuàng)建好的數(shù)據(jù)庫中建立新表。創(chuàng)建數(shù)據(jù)表的過程是規(guī)定數(shù)據(jù)列的屬性的過程,同時(shí)也是實(shí)施數(shù)據(jù)完整性(實(shí)體完整性、參照完整性和用戶定義完整性)約束的過程。數(shù)據(jù)表屬于數(shù)據(jù)庫,在創(chuàng)建數(shù)據(jù)表之前,要使用“USE數(shù)據(jù)庫名”指定操作是在哪個(gè)數(shù)據(jù)庫中進(jìn)行,如果沒有選擇具體的數(shù)據(jù)庫直接建表,系統(tǒng)會(huì)顯示錯(cuò)誤信息:“Nodatabaseselected”5.5.1創(chuàng)建數(shù)據(jù)表結(jié)構(gòu)語句§5.5表結(jié)構(gòu)的創(chuàng)建CREATETABLE[IFNOTEXISTS]表名(字段名1數(shù)據(jù)類型[列級(jí)別約束條件][默認(rèn)值],字段名2數(shù)據(jù)類型[列級(jí)別約束條件][默認(rèn)值],……[表級(jí)別約束條件]);5.5.1創(chuàng)建表結(jié)構(gòu)語句語法格式:§5.5表結(jié)構(gòu)的創(chuàng)建數(shù)據(jù)表屬于數(shù)據(jù)庫,在創(chuàng)建數(shù)據(jù)表之前,要使用“USE數(shù)據(jù)庫名”指定操作是在哪個(gè)數(shù)據(jù)庫中進(jìn)行,如果沒有選擇具體的數(shù)據(jù)庫直接建表,系統(tǒng)會(huì)顯示錯(cuò)誤信息:“Nodatabaseselected”1)
IFNOTEXISTS:如果數(shù)據(jù)庫中已經(jīng)存在表名的表,再來使用CREATETABLE創(chuàng)建一個(gè)同名的表時(shí),系統(tǒng)會(huì)給出錯(cuò)誤信息,為了避免系統(tǒng)給出錯(cuò)誤信息的提示,可以在創(chuàng)建表的前面加上這個(gè)判斷,只有該表目前不存在時(shí)才執(zhí)行CREATETABLE操作。2)表名和字段名要符合MySQL的命名規(guī)則,不區(qū)分大小寫,不能使用MySQL中的關(guān)鍵字,如ALTER、CREATE、TABLE、DROP等;3)語法格式中“[]”表示可選項(xiàng);4)創(chuàng)建表時(shí),必須定義表的每一個(gè)字段的名稱和數(shù)據(jù)類型,如果包含多個(gè)字段,要用逗號(hào)隔開,但最后的右側(cè)小括號(hào)的前面不能有逗號(hào)。§5.5表結(jié)構(gòu)的創(chuàng)建字段名數(shù)據(jù)類型[NOTNULL|NULL][DEFAULT默認(rèn)值][AUTO_INCREMENT][UNIQUE|KEY][[PRIMARY]KEY][COMMENT注釋名稱][REFERENCE外鍵][INDEX索引名][CHARSET字符集][COLLATE校驗(yàn)規(guī)則]5)字段的定義包括指定字段名、數(shù)據(jù)類型以及約束條件。約束條件包括:是否允許空值,指定默認(rèn)值、主鍵約束、唯一性約束、注釋字段名、是否為外鍵以及字段類型的屬性等。5.5.1創(chuàng)建表結(jié)構(gòu)語句§5.5表結(jié)構(gòu)的創(chuàng)建1)NOTNULL或NULL,表示字段是否可以為NULL值,NULL不同于零、空白或長度為零的字符串,NULL值意味著此值是未知的或不可用的。2)DEFAULT,用來指定字段的默認(rèn)值;3)AUTO_INCREMENT,設(shè)置自增屬性,只有整數(shù)類型才能設(shè)置該屬性;4)UNIQUEKEY,對(duì)字段指定唯一性約束,該字段不能有重復(fù)值,但可以有一個(gè)NULL值。5)PRIMARYKEY,對(duì)字段指定主鍵約束,該字段不能有重復(fù)值,也不能為NULL。6)COMMENT,對(duì)字段指定注釋名稱,即給字段起一個(gè)別名。7)REFERENCE,指定外鍵約束;8)INDEX,為表的相關(guān)字段設(shè)置索引。5.5.1創(chuàng)建數(shù)據(jù)表NULL不同于零、空白或長度為零的字符串,NULL值意味著此值是未知的或不可用的。§5.5表結(jié)構(gòu)的創(chuàng)建MySQL支持的常用約束條件有6種:主鍵約束(PRIMARYKEY)、外鍵約束(FOREIGNKEY)、非空約束(NOTNULL)、唯一性約束(UNIQUE)、默認(rèn)值約束(DEFAULT)和自增約束(AUTO_INCREMENT)。
1)實(shí)體完整性:保證表中每條記錄都是可以識(shí)別和唯一的。參照完整性:? 不能在相關(guān)表中的外鍵字段中輸入不存在于主表中的主鍵中的值。? 如果在相關(guān)表中存在匹配記錄,則不能在主表中刪除該記錄,也不能修改其主鍵的值。用戶定義完整性:用戶指明表中的字段的取值范圍。5.5.2數(shù)據(jù)完整性約束§5.5表結(jié)構(gòu)的創(chuàng)建5.5.3使用主鍵約束----單字段主鍵方式一的語法格式:字段名數(shù)據(jù)類型[CONSTRAINT約束名]PRIMARYKEY【例5.25】在online_sales_system數(shù)據(jù)庫中,根據(jù)下面表的表結(jié)構(gòu)創(chuàng)建商品表items。方式二的語法格式:[CONSTRAINT約束名]
PRIMARYKEY(字段名1[,字段名2,…])§5.5表結(jié)構(gòu)的創(chuàng)建首先使用USE語句將online_sales_system數(shù)據(jù)庫設(shè)置為當(dāng)前數(shù)據(jù)庫。USEonline_sales_system;
字段名說明數(shù)據(jù)類型是否允許NULL主鍵item_id商品編號(hào)char(4)NOTNULL是item_name商品名稱varchar(45)NOTNULL
category類別varchar(10)
cost成本價(jià)格decimal(10,2)
price銷售價(jià)格decimal(10,2)inventory庫存intIs_online是否上架tinyintitems(商品表)的結(jié)構(gòu)5.5.3使用主鍵約束----單字段主鍵§5.5表結(jié)構(gòu)的創(chuàng)建5.5.3使用主鍵約束----單字段主鍵CREATETABLEIFNOTEXISTSitems1(item_idCHAR(4),item_nameVARCHAR(45),categoryVARCHAR(10),costDECIMAL(10,2),priceDECIMAL(10,2),inventoryINT,is_onlineTINYINT,PRIMARYKEY(item_id));CREATETABLEIFNOTEXISTSitems(item_idCHAR(4)PRIMARYKEY,item_nameVARCHAR(45),categoryVARCHAR(10),costDECIMAL(10,2),priceDECIMAL(10,2),inventoryINT,is_onlineTINYINT);沒有逗號(hào)列級(jí)約束表級(jí)約束§5.5表結(jié)構(gòu)的創(chuàng)建5.5.3使用主鍵約束----多字段主鍵【例5.26】在online_sales_system數(shù)據(jù)庫中,根據(jù)下面表的表結(jié)構(gòu)創(chuàng)建訂單明細(xì)表order_details表。字段名說明數(shù)據(jù)類型是否允許NULL主鍵order_id訂單編號(hào)intNOTNULL是item_id商品編號(hào)char(4)NOTNULL
是quantity數(shù)量int
discount折扣decimal(5,2)
訂單明細(xì)表order_details的表結(jié)構(gòu)§5.5表結(jié)構(gòu)的創(chuàng)建5.5.3使用主鍵約束----多字段主鍵CREATETABLEIFNOTEXISTSorder_details(order_idINT,item_idCHAR(4),quantityINT,discountDECIMAL(5,2),
CONSTRAINT
ord_item
PRIMARYKEY(order_id,item_id));沒有逗號(hào)由多個(gè)字段聯(lián)合作為表的主鍵,則只能使用表級(jí)約束設(shè)置主鍵?!?.5表結(jié)構(gòu)的創(chuàng)建5.5.4使用非NULL約束語法格式:字段名數(shù)據(jù)類型NOTNULL【例5.27】在online_sales_system數(shù)據(jù)庫中,根據(jù)下表的表結(jié)構(gòu)創(chuàng)建訂單表orders?!?.5表結(jié)構(gòu)的創(chuàng)建字段名說明數(shù)據(jù)類型是否允許NULL主鍵order_id訂單編號(hào)intNOTNULL是customer_id客戶編號(hào)char(3)NOTNULL
address配送地址varchar(45)
city城市varchar(10)
order_date訂單時(shí)間datetimeShipping_date發(fā)貨時(shí)間datetimeorders表的結(jié)構(gòu)5.5.4使用非NULL約束語法格式:字段名數(shù)據(jù)類型NOTNULL【例5.27】在online_sales_system數(shù)據(jù)庫中,根據(jù)下表的表結(jié)構(gòu)創(chuàng)建訂單表orders。CREATETABLEIFNOTEXISTSorders(order_idINTNOTNULL,customer_idCHAR(3)NOTNULL,addressVARCHAR(45),cityVARCHAR(10),
order_dateDATETIME,shipping_dateDATETIME,
PRIMARYKEY(order_id));沒有逗號(hào)§5.5表結(jié)構(gòu)的創(chuàng)建沒有使用非NULL約束的字段可以取NULL值5.5.5使用默認(rèn)約束語法格式:字段名數(shù)據(jù)類型DEFAULT默認(rèn)值【例5.28】在online_sales_system數(shù)據(jù)庫中,根據(jù)下頁表的表結(jié)構(gòu)創(chuàng)建客戶表customers?!?.5表結(jié)構(gòu)的創(chuàng)建字段名說明數(shù)據(jù)類型是否允許NULL主鍵默認(rèn)值customer_id客戶編號(hào)char(3)NOTNULL是name姓名varchar(20)NOTNULL
gender性別ENUM('男','女')
'男'registration_date注冊(cè)時(shí)間datephone聯(lián)系電話char(11)customers表的結(jié)構(gòu)5.5.5使用默認(rèn)約束語法格式:字段名數(shù)據(jù)類型DEFAULT默認(rèn)值【例5.28】在online_sales_system數(shù)據(jù)庫中,根據(jù)下頁表的表結(jié)構(gòu)創(chuàng)建客戶表customers。CREATETABLEIFNOTEXISTScustomers(customer_idCHAR(3)NOTNULL,nameVARCHAR(20)NOTNULL,genderENUM('男','女')DEFAULT'男',registration_dateDATE,phoneCHAR(11),PRIMARYKEY(customer_id));沒有逗號(hào)§5.5表結(jié)構(gòu)的創(chuàng)建5.5.6使用唯一性約束----列級(jí)約束語法格式:字段名數(shù)據(jù)類型UNIQUE【例5.29】定義商品表items2,設(shè)置商品的名稱item_name唯一。CREATETABLEIFNOTEXISTSitems2(item_idCHAR(4)PRIMARYKEYNOTNULL,item_nameVARCHAR(45)UNIQUE,categoryVARCHAR(10),costDECIMAL(10,2),priceDECIMAL(10,2),inventoryINT,is_onlineTINYINT);列級(jí)約束§5.5表結(jié)構(gòu)的創(chuàng)建5.5.6使用唯一性約束----表級(jí)約束語法格式:[CONSTRAINT約束名]UNIQUE(字段名)【例5.30】定義商品表items3,使用表級(jí)約束設(shè)置商品的名稱item_name唯一。CREATETABLEIFNOTEXISTSitems3(item_idCHAR(4)PRIMARYKEYNOTNULL,item_nameVARCHAR(45),categoryVARCHAR(10),costDECIMAL(10,2),priceDECIMAL(10,2),inventoryINT,is_onlineTINYINT,CONSTRAINTuniq_nameUNIQUE(item_name));表級(jí)約束§5.5表結(jié)構(gòu)的創(chuàng)建5.5.6使用唯一性約束一個(gè)表中只能有一個(gè)PRIMARYKEY聲明,即一個(gè)表只能有一個(gè)主鍵,主鍵的值不能重復(fù),也不允許有NULL值;一個(gè)表中可以有多個(gè)字段設(shè)置為唯一性約束UNIQUE,設(shè)置了唯一性約束的字段值不能重復(fù),但允許有一個(gè)NULL值。UNIQUE和PRIMARYKEY的區(qū)別:§5.5表結(jié)構(gòu)的創(chuàng)建5.5.7使用自增約束語法格式:字段名稱數(shù)據(jù)類型AUTO_INCREMENT【例5.31】定義訂單表orders2,將訂單編號(hào)order_id設(shè)置為自增屬性。CREATETABLEIFNOTEXISTSorders2(order_idINTPRIMARYKEYAUTO_INCREMENT,customer_idCHAR(3)NOTNULL,addressVARCHAR(45),cityVARCHAR(10),order_dateDATETIME,shipping_dateDATETIME);列級(jí)約束§5.5表結(jié)構(gòu)的創(chuàng)建表orders2創(chuàng)建好之后,使用INSERTINTO語句插入3條記錄。SELECT*FROMorders2;§5.5表結(jié)構(gòu)的創(chuàng)建5.5.7使用自增約束主表必須已經(jīng)存在,或者是當(dāng)前正在創(chuàng)建的表。主表必須定義主鍵,并且從表中外鍵字段的數(shù)目必須和主表的主鍵字段的數(shù)目相同。主表中主鍵不能包含空值,但從表中的外鍵允許出現(xiàn)空值。從表的外鍵必須關(guān)聯(lián)主表的主鍵,并且關(guān)聯(lián)字段的數(shù)據(jù)類型必須匹配(相同或者相容),使用的字符集和檢驗(yàn)規(guī)則也要求相同,否則無法創(chuàng)建外鍵約束,系統(tǒng)會(huì)給出錯(cuò)誤提示信息。外鍵的作用是保持?jǐn)?shù)據(jù)表之間數(shù)據(jù)的一致性和完整性。5.5.8使用外鍵約束主(父)表:一方的表;從(子)表:多方的表;關(guān)聯(lián)字段主鍵外鍵§5.5表結(jié)構(gòu)的創(chuàng)建語法格式:[CONSTRAINT外鍵名]FOREIGNKEY(從表的字段列表)REFERENCES主表名稱(主鍵列表)5.5.8使用外鍵約束CONSTRAINT外鍵名:可選項(xiàng),設(shè)置外鍵約束的名稱,一個(gè)表中不能有相同名稱的外鍵約束;主表必須定義主鍵,并且從表種外鍵字段的數(shù)目必須和主表的主鍵字段的數(shù)目相同。從表的字段名列表:需要設(shè)置外鍵約束的字段列表;主表名稱:被從表外鍵依賴的主表的名稱;主鍵列表:主表中定義的主鍵字段(和從表的外鍵相關(guān)聯(lián)的主表的主鍵名稱)?!?.5表結(jié)構(gòu)的創(chuàng)建【例5.32】在創(chuàng)建訂單表orders時(shí),設(shè)置外鍵約束ky_ord_cust,使得訂單表orders中的字段customer_id與客戶表customers中的主鍵customer_id關(guān)聯(lián)。
DROPTABLEIFEXISTSorders;CREATETABLEorders(order_idINTPRIMARYKEY,customer_idCHAR(3)NOTNULL,
addressVARCHAR(45),cityVARCHAR(10),order_dateDATETIME,shipping_dateDATETIME,CONSTRAINTky_ord_custFOREIGNKEY(customer_id)REFERENCEScustomers(customer_id));5.5.8使用外鍵約束如果訂單表orders已存在,則執(zhí)行刪除訂單表,否則不執(zhí)行刪除操作?!?.5表結(jié)構(gòu)的創(chuàng)建5.5.9存儲(chǔ)引擎、字符集和校驗(yàn)規(guī)則的設(shè)置ENGINE=存儲(chǔ)引擎類型DEFAULTCHARSET=字符集類型COLLATE=校驗(yàn)規(guī)則字段名數(shù)據(jù)類型[CHARSET字符集類型][COLLATE校驗(yàn)規(guī)則]1.對(duì)整個(gè)表設(shè)置存儲(chǔ)引擎、字符集和校驗(yàn)規(guī)則,語法格式如下:2.在字段定義部分添加字符集和校驗(yàn)規(guī)則,語法格式如下:§5.5表結(jié)構(gòu)的創(chuàng)建【例5.33】創(chuàng)建訂單表orders2,并為orders2表設(shè)置存儲(chǔ)引擎為InnoDB、字符集為utf8mb4和校驗(yàn)規(guī)則為utf8mb4_0900_ai_ci。DROPTABLEIFEXISTSorders2;CREATETABLEorders2(order_idINTPRIMARYKEY,customer_idCHAR(3)NOTNULL,addressVARCHAR(45),cityVARCHAR(10),order_dateDATETIME,shipping_dateDATETIME)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_0900_ai_ci;如果訂單表orders2已存在,則執(zhí)行刪除訂單表,否則不執(zhí)行刪除操作。5.5.9存儲(chǔ)引擎、字符集和校驗(yàn)規(guī)則的設(shè)置§5.5表結(jié)構(gòu)的創(chuàng)建【例5.34】創(chuàng)建訂單表orders2,并為字段customer_id和address設(shè)置字符集gbk和校驗(yàn)規(guī)則gbk_chinese_ci。DROPTABLEIFEXISTSorders2;CREATETABLEorders2(order_idINTPRIMARYKEY,customer_idCHAR(3)CHARSETgbkCOLLATEgbk_chinese_ciNOTNULL,addressVARCHAR(45)CHARSETgbkCOLLATEgbk_chinese_ci,cityVARCHAR(10),order_dateDATETIME,shipping_dateDATETIME);5.5.9存儲(chǔ)引擎、字符集和校驗(yàn)規(guī)則的設(shè)置§5.5表結(jié)構(gòu)的創(chuàng)建使用語句SHOWCREATETABLEorders2\G查看的結(jié)果表信息如下:5.5.9存儲(chǔ)引擎、字符集和校驗(yàn)規(guī)則的設(shè)置city字段使用的是系統(tǒng)的默認(rèn)值utf8mb4和utf8mb4_0900_ai_ci在同一個(gè)數(shù)據(jù)表中不同的字段可以使用不同的字符集和校驗(yàn)規(guī)則§5.5表結(jié)構(gòu)的創(chuàng)建5.5.10創(chuàng)建表用到的約束條件總結(jié)1.列級(jí)完整性約束條件,語法格式如下:字段名數(shù)據(jù)類型[列級(jí)約束條件]1)PRIMARYKEY:設(shè)置該字段為主鍵。2)NULL/NOTNULL:設(shè)置的字段允許為空/不允許為空,如果沒有約束條件,則默認(rèn)為NULL。3)UNIQUE:設(shè)置字段取值唯一,即每條記錄的指定字段的值不能重復(fù)。4)DEFAULT
默認(rèn)值:設(shè)置字段的默認(rèn)值。5)AUTO_INCREMENT:設(shè)置字段的值自動(dòng)增加。6)CHARSET:設(shè)置字段使用的字符集。7)COLLATE:設(shè)置字段使用的校驗(yàn)規(guī)則。§5.5表結(jié)構(gòu)的創(chuàng)建5.5.10創(chuàng)建表用到的約束條件總結(jié)2.表級(jí)完整性約束條件如下:1)PRIMARYKEY用于定義表級(jí)主鍵約束,語法格式如下:[CONSTRAINT約束名]PRIMARYKEY(字段名1,字段名2,…,字段名n)2)FOREIGNKEY用于設(shè)置參照完整性規(guī)則,即指定某字段為外鍵,語法格式如下:[CONSTRAINT約束名]FOREIGNKEY(外鍵)REFERENCES被參照表(主鍵)3)UNIQUE既可用于列級(jí)完整性約束,也可用于表級(jí)完整性約束,語法格式如下:[CONSTRAINT約束名]UNIQUE(字段名)4)存儲(chǔ)引擎的設(shè)置,語法格式如下:ENGINE=存儲(chǔ)引擎類型5)字符集和校驗(yàn)規(guī)則的設(shè)置:DEFAULTCHARSET=字符集類型COLLATE=校驗(yàn)規(guī)則§5.5表結(jié)構(gòu)的創(chuàng)建使用MySQL語句創(chuàng)建好數(shù)據(jù)表之后,可以用SHOWTABLES語句顯示數(shù)據(jù)庫中所有的數(shù)據(jù)表的名稱;(前面介紹過了)也可以查看表的結(jié)構(gòu),以確定表的定義是否正確,查看表結(jié)構(gòu)可以使用DESCRIBE
和SHOWCREATETABLE語句。5.5.11查看表的結(jié)構(gòu)§5.5表結(jié)構(gòu)的創(chuàng)建5.5.11查看表的結(jié)構(gòu)1.使用DESCRIBE查看表結(jié)構(gòu)。語法格式如下:
DESCRIBE表名;
【例5.35】查看客戶表customers的表結(jié)構(gòu)。§5.5表結(jié)構(gòu)的創(chuàng)建DESC表名;
等價(jià)于5.5.11查看表的結(jié)構(gòu)2.
使用SHOWCREATETABLE語句查看表結(jié)構(gòu)。語法格式如下:SHOWCREATETABLE表名\G【例5.36】使用SHOWCREATETABLE語句查看客戶表customers的表結(jié)構(gòu)。SHOWCREATETABLEcustomers\G§5.5表結(jié)構(gòu)的創(chuàng)建\G和;基本等價(jià),在使用SHOWCREATETABLE語句時(shí),使用\G的顯示格式要比;更簡介修改表指的是修改數(shù)據(jù)庫中已經(jīng)存在的數(shù)據(jù)表的結(jié)構(gòu)。修改表的操作包括:修改表名、修改字段數(shù)據(jù)類型或字段名、增加和刪除字段、修改字段的排列位置、更改表的存儲(chǔ)引擎、刪除表的外鍵約束等。MySQL使用ALTERTABLE語句。在修改表結(jié)構(gòu)時(shí)可以使用DESC語句查看修改是否成功?!?.6數(shù)據(jù)表的修改ALTERTABLE表名{[ADD新字段名
數(shù)據(jù)類型[列級(jí)完整性約束條件][FIRST|AFTER已存在字段名]]|[MODIFY字段名1新數(shù)據(jù)類型[列級(jí)完整性約束條件][FIRST|AFTER字段名2]]|[CHANGE舊字段名
新字段名
新數(shù)據(jù)類型]|[DROP字段名|完整性約束名]|[RENAME[TO]新表名]|[ENGINE=更改后的存儲(chǔ)引擎名]};為指定的表添加一個(gè)新字段對(duì)指定表中字段的數(shù)據(jù)類型或完整性約束條件進(jìn)行修改對(duì)指定表中的字段名進(jìn)行改名對(duì)指定表中不需要的字段或完整性約束進(jìn)行刪除對(duì)指定表的表名進(jìn)行重命名對(duì)指定表的存儲(chǔ)引擎進(jìn)行修改有數(shù)據(jù)類型的都不能省§5.6數(shù)據(jù)表的修改5.6.1修改數(shù)據(jù)表的名稱ALTERTABLE舊表名
RENAME[TO]新表名;【例5.37】將客戶表customers改名為cust1。ALTERTABLEcustomersRENAMETOcust1;§5.6數(shù)據(jù)表的修改ALTERTABLE表名
MODIFY字段名數(shù)據(jù)類型;5.6.2修改字段的數(shù)據(jù)類型【例5.38】修改數(shù)據(jù)表cust1中姓名name的長度改為VARCHAR(30)。ALTERTABLEcust1MODIFYnameVARCHAR(30);不同類型的數(shù)據(jù)在機(jī)器中存儲(chǔ)的方式及長度各不相同,修改數(shù)據(jù)類型可能會(huì)影響到數(shù)據(jù)表中已有的數(shù)據(jù)記錄。由原來的VARCHAR(20)修改為VARCHAR(30)§5.6數(shù)據(jù)表的修改5.6.3修改字段名ALTERTABLE表名
CHANGE舊字段名新字段名新數(shù)據(jù)類型;【例5.39】把cust1表的name(姓名)字段名改為cname,類型改為varchar(20)。ALTERTABLEcust1CHANGEnamecnameVARCHAR(20);CHANGE也可以只修改數(shù)據(jù)類型,實(shí)現(xiàn)M
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 合伙人撤資合同
- 2024年甘肅客運(yùn)從業(yè)資格證實(shí)操考試題庫及答案
- 論電子商務(wù)的發(fā)展論文
- 追加訴訟請(qǐng)求申請(qǐng)書4篇
- 2024中山市勞動(dòng)合同范文
- 2024個(gè)人貸款抵押房屋保險(xiǎn)合同
- 2024勞務(wù)合同范本樣本勞務(wù)合同范本大全
- 2024的國際貨物買賣合同解釋與分析
- 規(guī)劃課題申報(bào)范例:“三教”改革背景下教材改革的實(shí)踐研究(附可修改技術(shù)路線圖)
- 深圳大學(xué)《游泳俱樂部》2021-2022學(xué)年第一學(xué)期期末試卷
- 耐壓絕緣測(cè)試報(bào)告
- 野獸派 beast 花店 調(diào)研 設(shè)計(jì)-文檔資料
- 水泵房每日巡視檢查表
- 杭州市區(qū)汽車客運(yùn)站臨時(shí)加班管理規(guī)定
- 墊片沖壓模具設(shè)計(jì)畢業(yè)設(shè)計(jì)論文
- 冷庫工程特點(diǎn)施工難點(diǎn)分析及對(duì)策
- Python-Django開發(fā)實(shí)戰(zhàn)
- 小學(xué)道法小學(xué)道法1我們的好朋友--第一課時(shí)ppt課件
- 路由和波長分配PPT課件
- 光伏組件開路電壓測(cè)試記錄
- 配電箱安裝規(guī)范
評(píng)論
0/150
提交評(píng)論