版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第3章MySQL數(shù)據(jù)定義功能主講:何廣贏時間:2026/01/01Contents目錄3.1數(shù)據(jù)庫MySQL簡介·存儲引擎·創(chuàng)建·查看·修改·刪除3.2數(shù)據(jù)表表的基本概念·創(chuàng)建·查看·修改·刪除·完整性約束3.3索引索引概述·分類·設計原則·查看·創(chuàng)建·刪除3.4視圖視圖概述·創(chuàng)建·查看·修改·更新數(shù)據(jù)·刪除3.5本章小結核心知識點回顧與學習建議3.1數(shù)據(jù)庫013.1.1MySQL數(shù)據(jù)庫簡介Workbench工作界面安裝并配置好MySQL8.0數(shù)據(jù)庫后,使用自帶的Workbench操作數(shù)據(jù)庫。打開Workbench連接已配置好的遠程數(shù)據(jù)庫,工作界面包含以下幾個核心模塊:Navigator模塊數(shù)據(jù)庫對象導航和管理Information模塊數(shù)據(jù)庫信息和狀態(tài)顯示SQL語句文件編輯器編寫和執(zhí)行SQL語句OutPut模塊執(zhí)行結果和日志輸出系統(tǒng)默認數(shù)據(jù)庫打開左側導航Schemas后,系統(tǒng)默認使用的數(shù)據(jù)庫包括:information_schema存儲數(shù)據(jù)庫元數(shù)據(jù)信息mysql存儲用戶權限和系統(tǒng)信息performance_schema存儲性能監(jiān)控數(shù)據(jù)sakila示例數(shù)據(jù)庫(電影租賃)sys簡化性能監(jiān)控視圖world示例數(shù)據(jù)庫(世界城市)數(shù)據(jù)定義語言DDL數(shù)據(jù)定義語言DDL,主要用于維護存儲數(shù)據(jù)的結構,包括數(shù)據(jù)庫、表、索引、視圖等。DDL中包含幾個核心指令:CCREATE創(chuàng)建數(shù)據(jù)庫和數(shù)據(jù)庫對象DDROP刪除數(shù)據(jù)庫、表、索引、視圖AALTER修改數(shù)據(jù)庫表的定義及屬性3.1.2存儲引擎概述存儲引擎存儲引擎決定了表在計算機中的存儲方式。存儲引擎定義了在數(shù)據(jù)庫中存儲數(shù)據(jù)、為存儲的數(shù)據(jù)建立索引和更新、查詢數(shù)據(jù)等技術的實現(xiàn)方法。在關系數(shù)據(jù)庫中的數(shù)據(jù)是以表的形式存儲的,因而存儲引擎也可以稱為表的類型。MySQL的核心就是存儲引擎,MySQL提供了多種存儲引擎,用戶可以根據(jù)不同的需求選擇不同的存儲引擎查看存儲引擎可以通過SHOWENGINES命令查看MySQL支持的所有存儲引擎:SHOWENGINES;--查看MySQL支持的所有存儲引擎MySQL支持的存儲引擎IInnoDB默認存儲引擎,支持事務MMyISAM高速查詢,不支持事務MMEMORY內存存儲,速度快以及CSV、ARCHIVE、BLACKHOLE、FEDERATED、PERFORMANCE_SCHEMA等存儲引擎信息存儲引擎在MySQL中可以從是否支持、解釋說明、是否支持事務處理、所支持的分布式是否符合XA規(guī)范、是否支持保存點等方面進行描述3.1.2存儲引擎對比分析特性InnoDBMyISAMMEMORY事務安全?支持?不支持?不支持存儲限制64TB256TB(理論)取決于max_heap_table_size鎖機制行鎖表鎖表鎖空間使用高低低內存使用高低高對外鍵的支持?支持?不支持?不支持批量插入速度低高高數(shù)據(jù)可壓縮?不支持?支持?不支持InnoDB事務處理應用首選:要求較高的事務處理時選擇InnoDB存儲引擎MyISAM頻繁查詢場景:表會被頻繁查詢時選擇MyISAM存儲引擎MEMORY臨時查詢應用:用于查詢的臨時表可選擇MEMORY存儲引擎3.1.3創(chuàng)建數(shù)據(jù)庫CREATEDATABASE語法--創(chuàng)建數(shù)據(jù)庫的基本語法CREATE{DATABASE|SCHEMA}[IFNOTEXISTS]db_name[[DEFAULT]CHARACTERSETcharset][[DEFAULT]COLLATEcollation];1{}必選項大括號中用分隔符|隔開的內容為必選項,必選其中的一項2[]可選項中括號中的內容為可選項,可以根據(jù)需要選擇使用3IFNOTEXISTS若數(shù)據(jù)庫名已存在,帶上此選項則不執(zhí)行任何操作,避免報錯4CHARACTERSET&COLLATE指定默認的字符集和校對規(guī)則,控制字符存儲和比較方式MMS醫(yī)療信息管理數(shù)據(jù)庫在本節(jié)中,將創(chuàng)建一個含有患者表P(Patients)、醫(yī)生表D(Doctors)、預約表A(Appointments)等醫(yī)療管理數(shù)據(jù)庫MMS。案例背景MMS數(shù)據(jù)庫是本書的案例數(shù)據(jù)庫,后續(xù)的相關操作都將基于此數(shù)據(jù)庫進行演示。創(chuàng)建實例--例3.1:創(chuàng)建MMS數(shù)據(jù)庫CREATEDATABASEIFNOTEXISTSMMSDEFAULTCHARACTERSETgb2312DEFAULTCOLLATEgb2312_chinese_ci;數(shù)據(jù)庫名:MMS(醫(yī)療信息管理數(shù)據(jù)庫)字符集:GB2312(支持中文)校對規(guī)則:gb2312_chinese_ci(中文不區(qū)分大小寫)3.1.4查看與選擇數(shù)據(jù)庫使用SHOW語句查看數(shù)據(jù)庫使用SHOW可查看當前MySQL中已存在的數(shù)據(jù)庫,這是了解數(shù)據(jù)庫服務器中已有數(shù)據(jù)庫的基本操作。SHOWDATABASES;--查看已有數(shù)據(jù)庫列表執(zhí)行效果執(zhí)行SHOWDATABASES命令后,MySQL會返回一個包含所有數(shù)據(jù)庫名稱的列表,包括系統(tǒng)數(shù)據(jù)庫和用戶創(chuàng)建的數(shù)據(jù)庫。選擇數(shù)據(jù)庫當數(shù)據(jù)庫創(chuàng)建完成以后,該數(shù)據(jù)庫不會自動成為當前數(shù)據(jù)庫,需要使用USE命令指定當前數(shù)據(jù)庫。USEMMS;--將MMS作為當前數(shù)據(jù)庫操作說明執(zhí)行以上代碼后,進入你剛才所建立的數(shù)據(jù)庫MMS。后續(xù)的所有表操作都將在此數(shù)據(jù)庫中進行。3.1.5修改數(shù)據(jù)庫ALTERDATABASE語法--修改數(shù)據(jù)庫的語法格式ALTER{DATABASE|SCHEMA}[db_name]MODIFYNAME=new_name[[DEFAULT]CHARACTERSETcharset][[DEFAULT]COLLATEcollation];1數(shù)據(jù)庫名稱可省略省略表示修改當前默認的數(shù)據(jù)庫2MODIFYNAME修改數(shù)據(jù)庫為新名稱3字符集和校對規(guī)則與創(chuàng)建數(shù)據(jù)庫語句相同的作用修改實例--例3.4:修改MMS數(shù)據(jù)庫ALTERDATABASEMMSDEFAULTCHARACTERSETutf8DEFAULTCOLLATEutf8_general_ci;參數(shù)說明數(shù)據(jù)庫MMS字符集utf8(支持更多字符)校對規(guī)則utf8_general_ci(不區(qū)分大小寫)注意事項修改數(shù)據(jù)庫不會影響到已有的表數(shù)據(jù),但新創(chuàng)建的表將使用新的字符集和校對規(guī)則3.1.6刪除數(shù)據(jù)庫DROPDATABASE語法--刪除數(shù)據(jù)庫的語法格式DROP{DATABASE|SCHEMA}[IFEXISTS]db_name;當數(shù)據(jù)庫不再使用時,可以刪除數(shù)據(jù)庫。刪除數(shù)據(jù)庫時,數(shù)據(jù)庫中的所有表、數(shù)據(jù)、索引等都將被永久刪除,此操作不可逆,請謹慎使用。IFEXISTS選項若數(shù)據(jù)庫不存在,帶上此選項則不執(zhí)行任何操作,避免報錯刪除實例--例3.5:刪除MMS數(shù)據(jù)庫DROPDATABASEMMS;--查看現(xiàn)有數(shù)據(jù)庫驗證SHOWDATABASES;驗證刪除結果執(zhí)行SHOWDATABASES命令后,從返回的數(shù)據(jù)庫列表可知,MMS數(shù)據(jù)庫已被成功刪除,列表中已經沒有名為MMS的數(shù)據(jù)庫了。刪除影響刪除數(shù)據(jù)庫會同時刪除該數(shù)據(jù)庫中的所有表、數(shù)據(jù)、索引、視圖等對象,且無法恢復。3.2數(shù)據(jù)表的定義與完整性約束023.2.1表的基本概念在日常生活中,表是經常使用的一種表示數(shù)據(jù)及其關系的形式,表必須建立在某一數(shù)據(jù)庫中,不能單獨存在,它是數(shù)據(jù)庫存放數(shù)據(jù)的對象。在關系數(shù)據(jù)庫中,每一個關系都可使用一張二維表,表中的數(shù)據(jù)的組織成類似于Excel表格,由行、列、表頭構成。使用表來存儲和操作數(shù)據(jù)的邏輯結構,表是數(shù)據(jù)庫中最重要的數(shù)據(jù)對象。1表結構每張表具有一定的結構,表結構包含一組固定的列,列由列名、數(shù)據(jù)類型、長度、允許空值、鍵、默認值等組成2記錄每個表包含若干行數(shù)據(jù),表中的一行成為一個記錄(Record),記錄是表中的完整數(shù)據(jù)單元3字段表中每個列稱為字段(Field),每個記錄由若干個數(shù)據(jù)項(列)構成,構成記錄的每個數(shù)據(jù)項就稱為字段4空值空值(NULL)表示未知、不可用或以后添加的數(shù)據(jù),與空字符串或0不同5主鍵如果表中記錄的某一列或列組合能唯一標識記錄,則該列或列組合成為候選鍵。若表中有多個候選鍵,則選擇其中一個為主鍵(PRIMARYKEY)6默認值表中插入數(shù)據(jù)時,當沒有明確給出某列的值,系統(tǒng)為此列指定一個值。在MySQL中,默認值使用關鍵字DEFAULT完整性約束完整性約束條件包括實體完整性約束(PRIMARYKEY、UNIQUE等)、參照完整性約束(FOREIGNKEY)和用戶定義完整性約束(NOTNULL、DEFAULT、CHECK約束等)列列級完整性約束直接定義在列上,直接跟在列定義之后,用空格分開,無需指定列名NOTNULL/NULLUNIQUEDEFAULTCHECKPRIMARYKEYFOREIGNKEY注意:NOTNULL/NULL和DEFAULT只能用于列級約束表表級完整性約束與列的定義相互獨立,不包含在列定義中,必須指出要約束的列的名稱PRIMARYKEYFOREIGNKEYUNIQUECHECK常用于對多個列一起進行約束3.2.1列級與表級完整性約束列級完整性約束列級完整性約束是直接定義在列上,直接跟在列定義之后,用空格分開,無需指定列名。列級約束主要有NOTNULL/NULL、UNIQUE、DEFAULT、CHECK、PRIMARYKEY、FOREIGNKEY等。--列級約束示例CREATETABLEexample(idINTPRIMARYKEY,--列級主鍵約束nameVARCHAR(50)NOTNULL,--列級非空約束emailVARCHAR(100)UNIQUE--列級唯一約束);只能用于列級的約束NOTNULL指定列值不能為空DEFAULT為列指定默認值特點簡潔直觀,直接在列后定義適用于單一列的約束定義不能約束多個列的組合表級完整性約束表級完整性約束與列的定義相互獨立,不包含在列定義中,通??梢约s束表中一個或任意多個列,與定義用逗號(,)分開,必須指出要約束的列的名稱。常用于對多個列一起進行約束。--表級約束示例CREATETABLEexample(idINT,nameVARCHAR(50),CONSTRAINTpk_examplePRIMARYKEY(id)--表級主鍵約束);可用于表級的約束PRIMARYKEYFOREIGNKEYUNIQUECHECK表級約束的優(yōu)勢可以為約束命名,便于后續(xù)管理可以約束多個列的組合更清晰的約束定義方式3.2.2創(chuàng)建表-語法詳解CREATETABLE基本語法--創(chuàng)建表的基本語法CREATE[TEMPORARY]TABLE[IFNOTEXISTS]table_name(column_definition1[column_level_constraints1],column_definition2[column_level_constraints2],...,column_definitionN[column_level_constraintsN],[table_level_constraints])[table_options];1指定數(shù)據(jù)庫數(shù)據(jù)表屬于數(shù)據(jù)庫,在創(chuàng)建表之前應使用USE語句指定創(chuàng)建數(shù)據(jù)庫2IFNOTEXISTS只有該表目前不存在時才執(zhí)行CREATETABLE操作,避免表已存在無法再新建的錯誤3表名命名規(guī)則名稱必須符合標識符的命名規(guī)則,不區(qū)分大小寫,不能使用SQL語言中的關鍵字列定義格式--列定義格式column_namedata_type[NOTNULL|NULL][DEFAULTdefault_value][AUTO_INCREMENT][UNIQUE[KEY]|[PRIMARYKEY]][COMMENT'string'][reference_definition]NOTNULL|NULL:指定該列為非空或者允許為空DEFAULT:為列指定默認值AUTO_INCREMENT:設置自增屬性,只有整型列才能設置UNIQUEKEY:設置該列為唯一性約束PRIMARYKEY:設置該列為主鍵約束table_options--表選項格式[ENGINE=engine_name][DEFAULTCHARSET=charset_name][COLLATE=collation_name]ENGINE:存儲引擎CHARSET:默認字符集COLLATE:校對規(guī)則3.2.2創(chuàng)建表實例-Patients表Patients患者表結構--創(chuàng)建Patients表的SQL語句CREATETABLEPatients(PatientIDCHAR(4)PRIMARYKEY,PatientNameCHAR(8)NOTNULL,DateOfBirthDATE,GenderCHAR(1),PhoneNumberVARCHAR(15),AddressVARCHAR(50));PatientID-主鍵CHAR(4)類型,使用PRIMARYKEY定義為主鍵,唯一標識每位患者PatientName-非空CHAR(8)類型,使用NOTNULL定義為非空,確保每位患者都有姓名其他字段-無約束DateOfBirth、Gender、PhoneNumber、Address等字段允許為空表3.2數(shù)據(jù)結構列名數(shù)據(jù)類型約束條件PatientIDCHAR(4)主鍵PatientNameCHAR(8)非空DateOfBirthDATE無約束GenderCHAR(1)無約束PhoneNumberVARCHAR(15)無約束AddressVARCHAR(50)無約束設計要點主鍵選擇:PatientID作為主鍵,確保每位患者唯一標識非空約束:PatientName使用NOTNULL,確?;颊咝彰靥铎`活性:其他字段允許為空,提供數(shù)據(jù)錄入的靈活性3.2.2創(chuàng)建表實例-Doctors表Doctors醫(yī)生表結構--創(chuàng)建Doctors表的SQL語句CREATETABLEDoctors(DoctorIDCHAR(4)PRIMARYKEY,DoctorNameCHAR(8)NOTNULL,GenderCHAR(1)CHECK(Genderin('F','M')),SpecializationVARCHAR(100),WorkingYearsINT);CHECK約束詳解GenderCHAR(1)CHECK(Genderin('F','M'))這行代碼定義了一個檢查約束,限制Gender列的取值只能是'F'(Female)或'M'(Male),確保性別數(shù)據(jù)的有效性。--CHECK約束語法CHECK(GenderIN('F','M'))DoctorID-主鍵CHAR(4)類型,主鍵約束DoctorName-非空CHAR(8)類型,非空約束表結構列名數(shù)據(jù)類型約束條件DoctorIDCHAR(4)主鍵DoctorNameCHAR(8)非空GenderCHAR(1)取值范圍:['F','M']SpecializationVARCHAR(100)無約束WorkingYearsINT無約束數(shù)據(jù)完整性保障主鍵約束:DoctorID唯一標識每位醫(yī)生非空約束:DoctorName確保醫(yī)生姓名必填檢查約束:Gender限制為'F'或'M',保證數(shù)據(jù)有效性3.2.2復制已有表復制表語法使用直接復制數(shù)據(jù)庫中已有表的結構和數(shù)據(jù)來快速創(chuàng)建一個表。這種方式可以快速創(chuàng)建與現(xiàn)有表結構相同的新表。--復制表的語法格式CREATETABLE[IFNOTEXISTS]table_name{[(]LIKEold_table_name[)]|AS(SELECT_statement)};LIKE方式使用LIKE關鍵字創(chuàng)建一個與"源表名"相同結構的新表,但是表的內容不會復制--只復制結構CREATETABLEnew_tableLIKEold_table;AS方式使用AS可以復制表的內容,但是索引和完整性約束不會復制--復制結構和數(shù)據(jù)CREATETABLEnew_tableASSELECT*FROMold_table;復制實例--例3.7:復制Patients表USEMMS;CREATETABLEPatients1ASSELECT*FROMPatients;操作說明首先使用USEMMS選擇數(shù)據(jù)庫,然后使用AS方式創(chuàng)建Patients1表,復制Patients表的所有數(shù)據(jù)兩種方式對比LIKE方式復制表結構不復制數(shù)據(jù)保留索引和約束AS方式復制表結構和數(shù)據(jù)不復制索引和約束3.2.3查看表-查看表名與表結構查看表名使用SHOWTABLES可查看數(shù)據(jù)庫中的所有表名,這是了解數(shù)據(jù)庫中包含哪些表的基本操作。SHOWTABLES;--查看當前數(shù)據(jù)庫中的所有表指定數(shù)據(jù)庫也可以查看指定數(shù)據(jù)庫中的表:SHOWTABLESFROMdb_name;查看表的基本結構使用SHOWCOLUMNS或DESCRIBE/DESC可以查看表的基本結構,包括列名、數(shù)據(jù)類型、長度、是否為空、是否是主鍵、是否有默認值等詳細信息。SHOWCOLUMNSFROMtable_name;--查看指定表的列信息DESCRIBEtable_name;--簡寫形式:DESCtable_name;功能說明SHOWCOLUMNS和DESCRIBE功能完全相同,DESCRIBE更簡潔,SHOWCOLUMNS更符合SQL標準3.2.3查看表示例例3.9:查看Patients表結構--使用SHOWCOLUMNS查看SHOWCOLUMNSFROMPatients;返回信息返回表中每個列的詳細信息,包括Field(列名)、Type(數(shù)據(jù)類型)、Null(是否允許為空)、Key(鍵類型)、Default(默認值)、Extra(額外信息)查看表的創(chuàng)建語句--例3.10:查看完整創(chuàng)建語句SHOWCREATETABLEPatients;使用SHOWCREATETABLE可以查看創(chuàng)建表的完整SQL語句,包括所有約束、索引等定義信息示例輸出--SHOWCOLUMNS輸出示例+-------------+-------------+------+-----+---------+-------+|Field|Type|Null|Key|Default|Extra|+-------------+-------------+------+-----+---------+-------+|PatientID|char(4)|NO|PRI|NULL|||PatientName|char(8)|NO||NULL|||DateOfBirth|date|YES||NULL|||Gender|char(1)|YES||NULL|||PhoneNumber|varchar(15)|YES||NULL|||Address|varchar(50)|YES||NULL||+-------------+-------------+------+-----+---------+-------+字段說明Field:列名Type:數(shù)據(jù)類型Null:是否允許為空(NO/YES)Key:鍵類型(PRI=主鍵)Default:默認值Extra:額外信息3.2.4修改表-語法詳解ALTERTABLE基本語法由于應用環(huán)境和應用需求的變化,修改表是對數(shù)據(jù)庫中已經存在的表做進一步的結構修改和調整。修改表使用ALTERTABLE語句。--ALTERTABLE基本語法ALTERTABLEtable_nameADD[COLUMN]col_nametype[constraints]|/*添加列*/CHANGECOLUMNold_colnew_coltype|/*列重命名*/ALTERCOLUMNcol_name{SETDEFAULTval|DROPDEFAULT}|/*修改默認值*/MODIFYCOLUMNcol_nametype|/*修改列類型*/DROPCOLUMNcol_name|/*刪除列*/RENAMETOnew_table_name|/*重命名表*/CHARACTERSETcharset|/*修改字符集*/DROPCONSTRAINTconstraint_name;ADD方式用于增加新列和完整性約束DROP方式用于刪除列和完整性約束修改列的子句ALTERCOLUMN修改或刪除表中指定列的默認值CHANGECOLUMN同時修改表中指定列的名稱和數(shù)據(jù)類型MODIFYCOLUMN修改表中指定列的數(shù)據(jù)類型和位置ALTERCOLUMN限制不能改變列名不能將含空值的列改為NOTNULL不能修改已創(chuàng)建索引的列若列中有數(shù)據(jù),不能減少寬度或改變類型3.2.4修改表實例-修改表名與添加列修改表名--例3.11:將Patients表名改成Patients1ALTERTABLEPatientsRENAMETOPatients1;語法說明使用RENAMETO子句可以將表重命名。此外,還可以在MySQLWorkbench左側管理窗格中,選擇表右鍵中選擇AlterTable,在打開的窗口中修改表名。--簡寫形式ALTERTABLEold_nameRENAMEnew_name;添加列--例3.12:在Patients表中添加列ALTERTABLEPatientsADDCOLUMNcommentvarchar(10);操作說明在MMS數(shù)據(jù)庫的Patients表中最后位置增加一列comment,數(shù)據(jù)類型為varchar(10)。添加列后可以再使用DESC語句查看表的結構驗證修改結果。--查看修改后的表結構DESCPatients;3.2.4修改表實例-修改列與刪除列使用CHANGE修改列--例3.13:修改comment列ALTERTABLEPatientsCHANGECOLUMNcommentcommvarchar(20)DEFAULT'普通';修改內容列名從comment修改為comm數(shù)據(jù)類型從varchar(10)改為varchar(20)設置默認值為'普通'使用MODIFY修改列--使用MODIFY修改數(shù)據(jù)類型ALTERTABLEPatientsMODIFYCOLUMNcommvarchar(30);除了使用CHANGE可以修改列名和數(shù)據(jù)類型,可以使用MODIFY關鍵字只修改數(shù)據(jù)類型,保持列名不變。MODIFY不能修改列名,但可以修改列的位置。刪除列--例3.14:刪除comm列ALTERTABLEPatientsDROPCOLUMNcomm;注意事項刪除列時,該列中的所有數(shù)據(jù)都將被永久刪除,且此操作無法恢復,請謹慎操作。三種修改方式對比CHANGECOLUMN可修改列名和數(shù)據(jù)類型MODIFYCOLUMN只能修改數(shù)據(jù)類型和位置ALTERCOLUMN只能修改或刪除默認值3.2.5刪除表DROPTABLE語法--刪除表的語法格式DROPTABLE[IFEXISTS]table_name[,table_name2,...];當數(shù)據(jù)表不需要的時候,可以將其刪除。刪除表時表的結構定義、數(shù)據(jù)、表的索引約束等都被刪除,此操作不可逆,請謹慎操作。注意事項只能刪除自己建立的表,不能刪除其他用戶所建的表。刪除表會同時刪除該表中的所有數(shù)據(jù)、索引、約束等對象。刪除實例--例3.15:刪除Patients1表DROPTABLEPatients1;執(zhí)行結果執(zhí)行DROPTABLE語句后,Patients1表及其所有數(shù)據(jù)和索引都被永久刪除。可以使用SHOWTABLES命令驗證表是否已被刪除。IFEXISTS選項如果指定IFEXISTS選項,當要刪除的表不存在時,MySQL不會報錯,而是發(fā)出一個警告后繼續(xù)執(zhí)行。--安全的刪除方式DROPTABLEIFEXISTStable_name;3.2.6數(shù)據(jù)的完整性約束概述數(shù)據(jù)完整性數(shù)據(jù)完整性是衡量數(shù)據(jù)庫質量的標準之一,使用該機制防止無效的數(shù)據(jù)進入數(shù)據(jù)表。在MySQL中數(shù)據(jù)的完整性包括實體完整性約束、參照完整性約束和用戶自定義約束等。重要性合理使用數(shù)據(jù)的完整性約束,可以提高數(shù)據(jù)庫的可靠性、可維護性和可擴展性,保證數(shù)據(jù)的準確性和一致性。1實體完整性約束實體完整性要求表中有一個主鍵,其值不能為空且唯一標識對應的記錄,又稱行級完整性PRIMARYKEY主鍵約束UNIQUE唯一性約束2參照完整性約束參照完整性保證被參照表中的數(shù)據(jù)與參照表中數(shù)據(jù)的一致性,又稱引用完整性FOREIGNKEY外鍵約束3用戶自定義約束通過檢查約束、非空約束來實現(xiàn),限制輸入值,保證數(shù)據(jù)的完整性CHECK檢查約束NOTNULL非空約束3.2.6實體完整性約束-主鍵約束主鍵約束特點唯一性:一個表中只能有一個PRIMARYKEY約束非空性:主鍵列不能取空值(NOTNULL)自動創(chuàng)建索引:創(chuàng)建主鍵約束時系統(tǒng)會自動產生PRIMARYKEY索引唯一標識:不允許列存在重復值,唯一標識每條記錄表級主鍵約束實例--例3.16:表級約束方式定義主鍵CREATETABLEPatients1(PatientIDchar(4),PatientNameCHAR(8),DateOfBirthDATE,GenderCHAR(1),PhoneNumberVARCHAR(15),AddressVARCHAR(50),CONSTRAINTPK_PatientIDPRIMARYKEY(PatientID));在表級上定義主鍵約束,并指定約束名為PK_PatientID,以便后續(xù)需要對完整性約束進行修改或刪除時更加方便。列級主鍵約束--列級約束方式CREATETABLEPatients(PatientIDchar(4)PRIMARYKEY,...);直接在列定義后添加PRIMARYKEY關鍵字,簡潔直觀,適用于單列主鍵的情況。兩種方式對比列級約束簡潔直觀適用于單列主鍵無法命名約束表級約束可以為約束命名支持多列組合主鍵便于后續(xù)管理3.2.6實體完整性約束-唯一性約束唯一性約束特點為保證一個表中非主鍵列不輸入重復值,可在列定義UNIQUE約束,稱為唯一性約束。創(chuàng)建時可以有多個UNIQUE約束,可以取空值,創(chuàng)建時系統(tǒng)自動產生UNIQUE索引,不允許存在重復值。與主鍵的相同點不允許重復值自動創(chuàng)建索引與主鍵的不同點可以有多個UNIQUE約束可以取空值不強制非空--例3.17:為PatientName創(chuàng)建唯一約束ALTERTABLEPatients1ADDCONSTRAINTUK_PatientNameUNIQUE(PatientName);ALTERTABLE創(chuàng)建唯一約束--基本語法ALTERTABLEtable_nameADD[CONSTRAINTconstraint_name]UNIQUE(column_name);說明為PatientName列創(chuàng)建唯一性約束,并指定唯一約束名UK_PatientName。運行后使用DESC語句可查看結果。刪除唯一性約束在ALTERTABLE語句下刪除唯一性約束時,MySQL實際上使用的是DROPINDEX子句刪除唯一性約束。--刪除唯一約束ALTERTABLEtable_nameDROPINDEXconstraint_name;3.2.6參照完整性約束-外鍵概念參照完整性參照完整性保證被參照表中的數(shù)據(jù)與參照表中數(shù)據(jù)的一致性,又稱引用完整性。外鍵是一個表中的一列或多列的組合,它不是這個表的主鍵,但它對應另外一個表的主鍵。外鍵的主要作用外鍵主要保證數(shù)據(jù)引用的完整性,確保引用表中的外鍵值必須存在于被參照表的主鍵中,或者為NULL。相關術語參照表外鍵所在的表稱為參照表(子表),包含指向其他表的外鍵列被參照表相關聯(lián)的主鍵所在的表稱為被參照表(父表),被外鍵引用的表參照完整性規(guī)則參照完整性規(guī)則是外鍵跟主鍵之間的引用規(guī)則,即外鍵的取值為空值,或等于被參照表中某一主鍵的值。規(guī)則說明外鍵可以為NULL,表示該行數(shù)據(jù)暫時沒有關聯(lián)外鍵如果有值,則必須是父表中存在的主鍵值保證引用關系的有效性定義外鍵應遵循的原則1被參照表必須已經存在或是當前正在創(chuàng)建的表2必須為被參照表定義主鍵或唯一性約束3主鍵不能有空值,但外鍵可以出現(xiàn)空值4外鍵對應列的數(shù)目必須和主鍵對應的數(shù)目相同5外鍵對應列的數(shù)據(jù)類型必須和主鍵對應的數(shù)據(jù)類型保持一致3.2.6參照完整性約束-外鍵創(chuàng)建與刪除創(chuàng)建外鍵約束--表級外鍵約束語法[CONSTRAINTconstraint_name]FOREIGNKEY(column1[,column2,...])REFERENCESparent_table(column1[,column2,...])--例3.18:創(chuàng)建Appointments表及外鍵CREATETABLEAppointments(AppointmentIDINTAUTO_INCREMENTPRIMARYKEY,PatientIDchar(4),DoctorIDchar(4),ConditionsVARCHAR(50),AppointmentDateDATE,AppointmentTimeTIME,FOREIGNKEY(PatientID)REFERENCESPatients(PatientID),CONSTRAINTFK_DoctorIDFOREIGNKEY(DoctorID)REFERENCESDoctors(DoctorID));為Appointments表創(chuàng)建兩個外鍵:PatientID引用Patients表的PatientID,DoctorID引用Doctors表的DoctorID。其中DoctorID外鍵指定了約束名FK_DoctorID。刪除外鍵約束--刪除外鍵約束語法ALTERTABLEtable_nameDROPFOREIGNKEYconstraint_name;--例3.19:刪除FK_DoctorID外鍵ALTERTABLEAppointmentsDROPFOREIGNKEYFK_DoctorID;可以使用修改表的方式重新在Appointments表上定義外鍵約束(FK_DoctorID)。修改表時創(chuàng)建外鍵--修改表時添加外鍵ALTERTABLEtable_nameADD[CONSTRAINTname]FOREIGNKEY(col)REFERENCESparent_table(col);3.2.6用戶自定義完整性約束-檢查約束檢查約束(CHECK)用戶定義完整性約束是通過檢查約束來實現(xiàn),檢查約束對輸入列或整個表中的值設置檢查條件,以限制輸入值,保證數(shù)據(jù)的完整性。1使用CREATETABLE時創(chuàng)建--語法格式CHECK(constraint_equation)2使用ALTERTABLE時創(chuàng)建--語法格式ALTERTABLEtable_nameADD[CONSTRAINTname]CHECK(condition);3刪除檢查約束--語法格式ALTERTABLEtable_nameDROPCHECKconstraint_name;檢查約束實例--例3.20:為Gender列設置檢查約束ALTERTABLEPatientsADDCONSTRAINTCK_GenderCHECK(GenderIN('F','M'));約束說明為Patients表中Gender列設置檢查約束,取值只有"F"或"M",約束名指定為CK_Gender。這樣當插入或更新數(shù)據(jù)時,如果Gender列的值不是'F'或'M',操作將被拒絕。應用場景限制數(shù)值范圍(如年齡>0)限制取值集合(如性別、狀態(tài))確保數(shù)據(jù)符合業(yè)務規(guī)則提高數(shù)據(jù)質量和可靠性3.2.6用戶自定義完整性約束-非空約束非空約束(NOTNULL)非空約束是指列值不能為空??罩抵?不存在"、"未知"、"無意義的值",與空字符串或0不同。NOTNULL約束確保該列在插入或更新數(shù)據(jù)時必須有值。定義方式MySQL中可以使用CREATETABLE或者ALTERTABLE語句定義非空約束,定義列的時候直接在后面加上關鍵字NOTNULL作為限定詞。創(chuàng)建時定義非空約束--例3.6:創(chuàng)建Patients表時定義非空CREATETABLEPatients(PatientIDCHAR(4)PRIMARYKEY,PatientNameCHAR(8)NOTNULL,...);在創(chuàng)建Patients表時,在PatientName列后添加了非空約束以確保該列不能為空值。Doctors表的非空約束--Doctors表創(chuàng)建語句CREATETABLEDoctors(DoctorIDCHAR(4)PRIMARYKEY,DoctorNameCHAR(8)NOTNULL,...);同樣在Doctors表中,DoctorName列也使用了NOTNULL約束,確保醫(yī)生姓名不能為空。應用場景必填字段(如姓名、用戶名)關鍵業(yè)務信息防止數(shù)據(jù)不完整3.3索引033.3.1索引概述索引的概念在日常生活中我們會經常使用索引,例如圖書的目錄、詞典的檢索表等。借助索引,人們能夠很快地找到需要的東西。索引是對表中一列或多列的值進行排序,建立索引表的一種數(shù)據(jù)結構,使用索引可以快速訪問表中的特定記錄。工作原理索引文件只有兩個列:一個是排序后索引列,用于快速查找;另一個是該記錄在數(shù)據(jù)表中的記錄號,用于定位讀取。索引的自動管理索引一旦創(chuàng)建,將由數(shù)據(jù)庫自動管理和維護。比如,向數(shù)據(jù)表中插入、修改和刪除數(shù)據(jù)時,數(shù)據(jù)庫自動在索引中作出相應的修改。使用說明在編寫SQL查詢語句時,具有索引的表與普通沒有索引的表無任何差別,索引只是提供了一種快速訪問指定記錄的方法。索引的作用1加快數(shù)據(jù)檢索速度這是索引最重要的作用,通過索引可以快速定位到符合條件的數(shù)據(jù)2保證列值的唯一性唯一索引可以確保列中沒有重復值3提高排序和分組速度在使用ORDERBY和GROUPBY時可以提高執(zhí)行速度4查詢優(yōu)化依靠索引起作用查詢優(yōu)化器依靠索引來提高查詢性能兩種檢索方式全表全表掃描,逐行檢查索引使用索引快速定位3.3.2索引的分類-按用途分普通索引INDEX普通索引是MySQL中的基本索引類型。使用關鍵字KEY或INDEX定義,可以創(chuàng)建在任何數(shù)據(jù)類型中,而且它允許索引列有重復值和空值。特點:最基本的索引類型,沒有任何限制唯一索引UNIQUE唯一索引與普通索引不同的是索引列值不能重復、唯一,可以是空值。特點:值唯一,可有空值主鍵索引PRIMARYKEY主鍵索引是一種特殊的唯一索引。創(chuàng)建表時定義主鍵后自動創(chuàng)建,一張表只能有一個主鍵索引,而且索引列值不能為空。特點:特殊的唯一索引,不能為空全文索引FULLTEXT全文索引是在定義索引的列上按照值的全文查找,允許索引列值重復和空值,但是它只能創(chuàng)建在CHAR、VARCHAR或TEXT等字符類型的列上。特點:用于全文搜索,支持文本字段空間索引SPATIAL空間索引是對空間數(shù)據(jù)類型GEOMETRY、POINT、LINESTRING、POLYGON等列上建立的索引,但是建立空間索引的列必須NOTNULL。特點:用于空間數(shù)據(jù),列必須非空使用建議根據(jù)實際需求選擇合適的索引類型。普通索引用于基本加速查詢;唯一索引用于保證數(shù)據(jù)唯一性;主鍵索引自動創(chuàng)建;全文索引用于文本搜索;空間索引用于地理信息數(shù)據(jù)。3.3.2索引的分類-按索引個數(shù)與物理順序按索引的個數(shù)分單列索引單列索引指在表中單一列上創(chuàng)建的索引。它可以是普通索引、唯一索引或者全文索引,一個表上可以建立多個單列索引,但一個單列索引只包含表中的一個列。特點:確保該索引只對應一個列即可多列索引多列索引指在表中多個列上創(chuàng)建的索引,也稱為組合索引或復合索引。需要注意的是只有在查詢條件中使用了這些列中的第一個列時,該索引才會被使用。特點:遵循最左前綴原則按物理順序分聚簇索引聚簇索引是數(shù)據(jù)存儲的物理順序,保證索引值相近的記錄行所存儲的物理位置也相近。一張表只能有一個聚簇索引。特點:索引順序與物理順序相同非聚簇索引非聚簇索引順序與數(shù)據(jù)表的物理順序無關。非聚簇索引就是普通索引,僅對列創(chuàng)建相應的索引,不影響整個數(shù)據(jù)表的物理存儲順序。特點:索引順序與物理順序無關組合索引使用建議對于組合索引,查詢條件中必須包含索引的第一個列(最左列),否則索引不會被使用。例如,在(col1,col2,col3)上創(chuàng)建的組合索引,只有在查詢條件中包含col1時才會使用該索引。3.3.3索引設計原則索引設計的五項原則使用索引可以提高系統(tǒng)的性能,加快檢索速度,但是也存在一定的缺點,比如增加存儲空間、降低更新表中數(shù)據(jù)的速度等。因而在使用時應考慮以下原則:1限制表中索引的數(shù)量對經常查詢的列應該建立索引,但要避免對不必要的列建立索引。過多的索引會占用大量存儲空間,并降低更新操作的速度。2避免對經常更新的表建立過多的索引需要經常更新數(shù)據(jù)的表應該避免建立過多的索引,并且索引中的列要盡可能少,這樣系統(tǒng)消耗在索引維護上的代價才小。3數(shù)據(jù)量小的表不建議使用索引對于數(shù)據(jù)量很小的表,全表掃描可能比使用索引更快,因為使用索引還需要額外的查找開銷。4避免在重復率大的列上建索引在取值重復率較大的列上不要建立索引。例如"Patients表"中的"Gender"列,其取值基本只有"男"和"女"兩個值,這樣的列就無須建立索引。原因在這種低選擇性的列上創(chuàng)建索引,索引的過濾效果很差,幾乎無法提高查詢效率5為排序分組連接查詢的列建索引在關系數(shù)據(jù)中進行排序、分組和連接查詢時,需要進行大量的查找比較運算,所以應該為頻繁進行排序或分組的列和經常進行連接查詢的列創(chuàng)建索引。適用場景?ORDERBY子句中頻繁使用的列?GROUPBY子句中頻繁使用的列?JOIN操作中連接條件的列3.3.4查看索引查看索引的三種方法在MySQL中使用SHOWCREATETABLE語句可以查看表的結構,同時也能查看表中存在哪些索引。使用EXPLAIN語句可以查看在執(zhí)行SQL查詢時索引的使用情況。使用SHOWINDEXFROM可以查看索引相關信息。--查看索引的語法SHOW{INDEX|INDEXS|KEYS}{FROM|IN}table_name[{FROM|IN}database_name];查看實例--例3.21:查看Patients表的索引SHOWINDEXFROMPatients;返回信息說明Table:表名Key_name:索引名Column_name:列名Collation:排序方式(A/D)Cardinality:基數(shù)(唯一值數(shù)量)Sub_part:前綴長度3.3.5創(chuàng)建索引-三種方式概述1CREATEINDEX使用CREATEINDEX語句在已經存在的表上創(chuàng)建索引,這是最常用的創(chuàng)建索引的方式。--基本語法CREATE[UNIQUE|FULLTEXT|SPATIAL]INDEXindex_nameONtable_name(column);適用于已有表語法清晰直觀最常用的方式2ALTERTABLE使用ALTERTABLE語句在已經存在的表上創(chuàng)建索引,與CREATEINDEX作用完全相同。--基本語法ALTERTABLEtable_nameADD[UNIQUE|FULLTEXT|SPATIAL]INDEXindex_name(column);與CREATEINDEX等效可同時修改表結構便于批量操作3CREATETABLE在使用CREATETABLE語句創(chuàng)建表時同時創(chuàng)建索引,適合在創(chuàng)建表時就規(guī)劃好索引的情況。--基本語法CREATETABLEtable_name(column1type,INDEXindex_name(column));創(chuàng)建表時一并創(chuàng)建便于統(tǒng)一管理適合初始設計3.3.5使用CREATEINDEX創(chuàng)建索引CREATEINDEX語法詳解--CREATEINDEX基本語法CREATE[UNIQUE|FULLTEXT|SPATIAL]INDEXindex_nameONtable_name(column_name[length])[ASC|DESC][,...];UNIQUE|FULLTEXT|SPATIAL可選項,指定索引類型index_name索引名,在表中必須唯一table_name要建立索引的表名稱column_name要創(chuàng)建索引的列名length可選項,使用列前多少個字符ASC|DESC可選項,升序或降序,默認ASC--例3.22:創(chuàng)建降序普通索引CREATEINDEXIDX_PatientIDONPatients(PatientIDDESC);執(zhí)行說明在MMS數(shù)據(jù)庫中Patients表的PatientID創(chuàng)建一個名為IDX_PatientID,按降序排序的普通索引。驗證結果運行以上代碼后并使用SHOWINDEXFROMPatients語句查看所創(chuàng)建的索引。圖中第1行是創(chuàng)建主鍵約束時,系統(tǒng)默認創(chuàng)建的一個唯一索引,第2行的IDX_PatientID是用戶創(chuàng)建的索引,collation列值為D表示降序排序。注意事項索引名在表中必須唯一可以指定升序(ASC)或降序(DESC)可以為前綴列創(chuàng)建索引適用于已有表3.3.5使用ALTERTABLE創(chuàng)建索引ALTERTABLE創(chuàng)建索引使用ALTERTABLE語句在已經存在的表上創(chuàng)建索引,這種方式創(chuàng)建索引與使用CREATEINDEX語句的作用完全一樣。--ALTERTABLE創(chuàng)建索引語法ALTERTABLEtable_nameADD[UNIQUE|FULLTEXT|SPATIAL][INDEX|KEY]index_name(column_name[length][ASC|DESC]);實例--例3.23:使用ALTERTABLE創(chuàng)建索引ALTERTABLEPatientsADDINDEXIDX_PatientID(PatientIDDESC);這種方式創(chuàng)建索引與使用CREATEINDEX語句的作用完全一樣,可以根據(jù)個人習慣和具體場景選擇使用哪種方式。兩種方式對比CREATEINDEX語法簡潔,專注于索引創(chuàng)建ALTERTABLE可同時修改表結構,功能更強結論:兩種方式功能等效,根據(jù)個人習慣選擇3.3.5使用CREATETABLE創(chuàng)建索引CREATETABLE創(chuàng)建索引語法--創(chuàng)建表時創(chuàng)建索引的語法[UNIQUE|FULLTEXT|SPATIAL]INDEX|KEY[alias](col_name[(length)][ASC|DESC])UNIQUE可選參數(shù),表示創(chuàng)建唯一索引FULLTEXT可選參數(shù),表示創(chuàng)建全文索引SPATIAL可選參數(shù),表示創(chuàng)建空間索引INDEX|KEY創(chuàng)建索引的關鍵詞,二者選一alias可選參數(shù),用于給索引另取名ASC|DESC可選參數(shù),升序或降序排列--例3.24:創(chuàng)建Doctors1表及組合索引CREATETABLEDoctors1(DoctorIDCHAR(4),DoctorNameCHAR(8),GenderCHAR(1),SpecializationVARCHAR(100),WorkingYearsINT,PRIMARYKEY(DoctorID,DoctorName),INDEXIDX_GS(GenderASC,SpecializationDESC));組合索引實例在MMS數(shù)據(jù)庫中,創(chuàng)建新表Doctor1表,主鍵為DoctorID、DoctorName,同時在Gender、Specialization列上創(chuàng)建普通組合索引。組合索引特點創(chuàng)建的組合索引IDX_GS排序時,先按照Gender升序排序;若Gender值相同,再按照Specialization降序排序。--查看創(chuàng)建的索引SHOWINDEXFROMDoctors1;使用建議適合在創(chuàng)建表時就規(guī)劃好索引可以同時創(chuàng)建主鍵、唯一索引和普通索引便于統(tǒng)一管理表的所有索引3.3.6刪除索引刪除索引的必要性由于索引會占用一定的系統(tǒng)資源,因此,為了避免影響數(shù)據(jù)庫性能,應該及時刪除不再使用的索引。MySQL中有兩種方法刪除索引。占用存儲空間每個索引都需要占用磁盤空間影響更新速度增刪改數(shù)據(jù)時需維護索引使用DROPINDEX刪除索引--例3.25:刪除IDX_PatientID索引DROPINDEXIDX_PatientIDONPatients;語法:DROPINDEXindex_nameONtable_name;使用ALTERTABLE刪除索引--例3.26:刪除IDX_GS組合索引ALTERTABLEDoctors1DROPINDEXIDX_GS;語法:ALTERTABLEtable_nameDROPINDEXindex_name;注意事項刪除索引是不可逆操作刪除后需要重新創(chuàng)建才能使用主鍵索引不能直接用DROPINDEX刪除定期清理不再使用的索引3.4視圖043.4.1視圖概述視圖的概念視圖是從一個或幾個基表(或視圖)中導出的表,是一種虛表。用于產生視圖的表叫作該視圖的基表。它可以來源于一個或多個基表的行或列構成的子集,也可以是基表的統(tǒng)計匯總,或是視圖與基表的組合。核心特點由SELECT語句定義的視圖實際上并不存儲真實數(shù)據(jù),而是存儲了查詢邏輯。數(shù)據(jù)庫中僅存放了視圖的定義,不存放視圖對應的數(shù)據(jù)。通過視圖看到的數(shù)據(jù)實際只是執(zhí)行視圖中定義的數(shù)據(jù)查詢命令而查詢出的存放在基表中的數(shù)據(jù)。數(shù)據(jù)同步當基表中的數(shù)據(jù)發(fā)生變化,視圖中的數(shù)據(jù)也就會隨之改變。視圖的數(shù)據(jù)是實時從基表查詢得到的,保證了數(shù)據(jù)的一致性。說明視圖不存儲數(shù)據(jù),每次查詢視圖時都會執(zhí)行定義視圖的SELECT語句視圖的來源可以來源于一個或多個基表可以是基表的統(tǒng)計匯總可以是視圖與基表的組合可以是行或列的子集3.4.1視圖的功能與優(yōu)點視圖的三大功能1篩選數(shù)據(jù)篩選出基表中的頻繁操作的數(shù)據(jù)供用戶簡單地按視圖名訪問。用戶無需關心復雜的查詢語句,只需要查詢視圖即可獲得所需數(shù)據(jù)。2安全保護只提供必要的數(shù)據(jù)視圖,防止未經許可的用戶訪問敏感數(shù)據(jù)。通過視圖可以控制用戶只能看到其有權查看的數(shù)據(jù)列和行。3邏輯抽象將多個物理數(shù)據(jù)表抽象為一個邏輯數(shù)據(jù)表。用戶可以通過一個視圖查詢多個表的數(shù)據(jù),而不需要了解表之間的復雜關系。視圖的四大優(yōu)點簡化用戶的操作視圖能夠簡化用戶的操作,用戶只需查詢視圖而無需編寫復雜的SQL語句多角度看待數(shù)據(jù)視圖使用戶能從多種角度看待同一數(shù)據(jù),不同用戶可以有不同的視圖實現(xiàn)邏輯獨立性視圖能夠實現(xiàn)數(shù)據(jù)庫的邏輯獨立性,當基表結構變化時視圖可以保持不變提供安全保護視圖能夠對機密數(shù)據(jù)提供安全保護,限制用戶訪問敏感信息應用場景為不同部門創(chuàng)建不同視圖隱藏表之間的復雜關聯(lián)簡化報表查詢保護敏感數(shù)據(jù)列3.4.2創(chuàng)建視圖CREATEVIEW語法--CREATEVIEW基本語法CREATE[ORREPLACE]VIEWview_name[(column_list)]ASSELECTstatement[WITHCHECKOPTION];1ORREPLACE可選項,若存在同名的視圖時,原視圖將被新創(chuàng)建的視圖覆蓋。該子句使得新建視圖命令同時也具備了修改視圖的功能。2column_list可選項,指定視圖查詢結果的列名,如果沒有此選項,視圖查詢結果的列名和SELECT子句中的列名一致。3WITHCHECKOPTION使用該子句后,在更新視圖時對新插入或修改的數(shù)據(jù)進行檢查,確保視圖數(shù)據(jù)的更新要使得視圖定義里的查詢語句中的WHERE子句的結果為"真"。實例--例3.27:創(chuàng)建性別為F的患者視圖USEMMS;CREATEVIEWp_f_viewASSELECT*FROMPatientsWHEREGender='F';在MMS數(shù)據(jù)庫中創(chuàng)建一個基于Patients表的Gender值為"F"信息的視圖,視圖名為p_f_view。說明視圖定義存儲在數(shù)據(jù)庫中視圖不存儲實際數(shù)據(jù)查詢視圖時執(zhí)行SELECT語句3.4.2創(chuàng)建視圖實例-自定義列名方式一:在CREATEVIEW后指定列名--指定列名列表CREATEVIEWp_info_view(患者號,姓名,性別,出生日期,聯(lián)系方式)ASSELECTPatientID,PatientName,Gender,DateOfBirth,PhoneNumberFROMPatients;在CREATEVIEW后指定列名列表,將視圖中的列名設置為中文名稱,方便用戶理解和使用。方式二:在SELECT中使用別名--使用AS指定別名CREATEVIEWp_info_viewASSELECTPatientIDAS患者號,PatientNameAS姓名,GenderAS性別,DateOfBirthAS出生日期,PhoneNumberAS聯(lián)系方式FROMPatients;在SELECT語句中使用AS關鍵字為列指定別名,這種方式更加靈活,可以在別名中使用表達式或函數(shù)。3.4.3查看視圖-四種方法查看視圖的四種方法在MySQL中,視圖實際上是被當作特殊表來處理的,所以查看視圖的方法與查看表的方法類似。--方法1:SHOWTABLESSHOWTABLES;--方法2:DESCDESCview_name;--方法3:SHOWTABLESTATUSSHOWTABLESTATUSLIKE'view_name';--方法4:SHOWCREATEVIEWSHOWCREATEVIEWview_name;四種方法說明SHOWTABLES查看數(shù)據(jù)庫中的所有表和視圖名稱DESC查看視圖的列信息(列名、數(shù)據(jù)類型等)SHOWTABLESTATUS查看視圖的詳細信息(引擎、版本、行數(shù)等)SHOWCREATEVIEW查看視圖的創(chuàng)建代碼和字符集3.4.3查看視圖實例查看視圖列表--查看所有表和視圖SHOWTABLES;執(zhí)行SHOWTABLES命令后,返回結果中會包含表和視圖的名稱。在MySQL中,視圖被視為特殊表,所以可以用SHOWTABLES命令查看。--查看p_info_view的列信息DESCp_info_view;查看視圖創(chuàng)建代碼--查看視圖的創(chuàng)建語句SHOWCREATEVIEWp_f_view;使用SHOWCREATEVIEW可以查看視圖的完整創(chuàng)建代碼,包括SELECT語句、字符集等信息。查詢視圖數(shù)據(jù)--查詢p_f_view中的數(shù)據(jù)SELECT*FROMp_f_view;查詢視圖就像查詢普通表一樣,MySQL會自動執(zhí)行視圖定義中的SELECT語句并返回結果。3.4.4修改視圖修改視圖的兩種方式在MySQL中,可以通過兩種方式來修改視圖。第一種是使用CREATEORREPLACEVIEW,如果視圖不存在則創(chuàng)建,如果存在則覆蓋原有視圖。第二種是使用ALTERVIEW語句。1CREATEORREPLACE--語法CREATEORREPLACEVIEWview_nameASSELECT...;若存在同名視圖則覆蓋,否則創(chuàng)建新視圖2ALTERVIEW--語法ALTERVIEWview_nameASSELECT...;修改已存在的視圖定義修改實例--修改p_info_view視圖CREATEORREPLACEVIEWp_info_viewASSELECTPatientID,PatientName,Gender,DateOfBirth,PhoneNumber,AddressFROMPatientsWHEREGender='F';--或使用ALTERVIEWALTERVIEWp_info_viewASSELECTPatientID,PatientName,Gender,DateOfBirth,PhoneNumber,AddressFROMPatientsWHEREGender='F';以上兩種方式都將p_info_view視圖修改為只包含女性患者的信息,并增加了Address列。使用建議CREATEORREPLACE更常用,可同時用于創(chuàng)建和修改ALTERVIEW只能修改已存在的視圖修改視圖不會影響基表的數(shù)據(jù)3.4.5利用視圖更新數(shù)據(jù)通過視圖更新數(shù)據(jù)的原理對視圖的更新操作(INSERT、UPDATE、DELETE)最終會轉換成對基表數(shù)據(jù)的更新操作。當通過視圖更新數(shù)據(jù)時,實際上是在更新定義視圖的基表中的數(shù)據(jù)。INSERT-插入數(shù)據(jù)通過視圖向基表中插入新行數(shù)據(jù)UPDATE-更新數(shù)據(jù)通過視圖修改基表中已有行的數(shù)據(jù)DELETE-刪除數(shù)據(jù)通過視圖刪除基表中的行數(shù)據(jù)實例--例3.28:通過視圖插入數(shù)據(jù)INSERTINTOp_info_view(PatientID,PatientName,Gender,DateOfBirth,PhoneNumber,Address)VALUES('P008','陳麗萍','F','1990-05-15',,'北京市朝陽區(qū)');通過p_info_view視圖給Patients表新增一位名叫'陳麗萍'的女患者。執(zhí)行該語句后,數(shù)據(jù)實際上被插入到Patients基表中。數(shù)據(jù)同步視圖更新→基表更新基表變化→視圖數(shù)據(jù)變化視圖不存儲數(shù)據(jù),實時查詢3.4.5視圖更新限制與WITHCHECKOPTION視圖更新的限制并非所有的視圖都可以更新。如果視圖包含以下情況,則無法將更新命令準確轉換成對基表的更新:包含GROUPBY分組統(tǒng)計使用了GROUPBY、HAVING、DISTINCT等子句包含聚合函數(shù)如COUNT、SUM、AVG、MAX、MIN等包含UNION、UNIONALL多個SELECT語句的并集操作包含子查詢復雜的嵌套查詢結構限制實例--創(chuàng)建統(tǒng)計不同性別人數(shù)的視圖CREATEVIEWp_cnt_viewASSELECTGender,COUNT(*)AScntFROMPatientsGROUPBYGender;--嘗試更新會失敗UPDATEp_cnt_viewSETcnt=10WHEREGender='F';由于p_cnt_view包含GROUPBY和COUNT聚合函數(shù),無法通過該視圖更新數(shù)據(jù),因為無法確定如何修改基表中的具體行。WITHCHECKOPTION--語法CREATEVIEW...ASSELECT...WHEREconditionWITHCHECKOPTION;確保更新時數(shù)據(jù)仍滿足WHERE條件防止插入不滿足條件的數(shù)據(jù)保證視圖數(shù)據(jù)的一致性3.4.6刪除視圖DROPVIEW語法--刪除視圖的語法格式DROPVIEW[IFEXISTS]view_name[,view_name2,...];當視圖不再使用時,可以將其刪除。刪除視圖只是刪除視圖的定義,不會影響基表中的數(shù)據(jù)。IFEXISTS選項若視圖不存在,帶上此選項則不執(zhí)行任何操作,避免報錯刪除實例--例3.29:刪除p_f_view視圖DROPVIEWp_f_view;執(zhí)行DROPVIEW語句后,p_f_view視圖的定義被刪除。可以使用SHOWTABLES命令驗證視圖是否已被刪除。注意事項刪除視圖只是刪除定義,不影響基表數(shù)據(jù)刪除基表后,建立在該表上的視圖不會自動刪除刪除基表后視圖無法再使用,需要手動刪除3.5本章小結053.5本章核心知識點回顧數(shù)據(jù)庫數(shù)據(jù)庫是存儲在一起集中管理的相關數(shù)據(jù)的集合。通過CREATEDATABASE創(chuàng)建數(shù)據(jù)庫,使用SHOWDATABASES查看,USE選擇數(shù)據(jù)庫,ALTERDATABASE修改,DROPDATABASE刪除。存儲引擎:選擇合適的存儲引擎(InnoDB、MyISAM、MEMORY)對數(shù)據(jù)庫性能至關重要數(shù)據(jù)表表必須建立在某一數(shù)據(jù)庫中,不能單獨存在,它是數(shù)據(jù)庫存放數(shù)據(jù)的對象。通過CREATETABLE創(chuàng)建表,使用SHOWTABLES、DESC查看,ALTERTABLE修改,DROPTABLE刪除。設計要點:合理設計表結構和完整性約束是保證數(shù)據(jù)質量的基礎完整性約束數(shù)據(jù)完整性是衡量數(shù)據(jù)庫質量的標準之一,包括實體完整性、參照完整性和用戶自定義完整性三大類,通過PRIMARYKEY、UNIQUE、FOREIGNKEY、CHECK、NOTNULL等約束實現(xiàn)。重要性:完整性約束保證數(shù)據(jù)的準確性和一致性索引索引是一種特殊的數(shù)據(jù)對象,可以提高對表中數(shù)據(jù)的訪問
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026浙江嘉興市嘉善縣江南幼兒園食堂從業(yè)人員招聘1人筆試備考試題及答案解析
- 2026年洛陽欒川公益崗招聘120人筆試參考題庫及答案解析
- 2026新疆雙河新賽生物蛋白科技有限公司招聘1人筆試參考題庫及答案解析
- 雅安經濟技術開發(fā)區(qū)公開招聘匯達服務公司副總經理考試備考試題及答案解析
- 2026上半年貴州事業(yè)單位聯(lián)考省文學藝術界聯(lián)合會所屬事業(yè)單位招聘4人考試參考題庫及答案解析
- 2026年中材科技(酒泉)風電葉片有限公司招聘44人筆試模擬試題及答案解析
- 2026年寧德周寧縣消防救援大隊專職消防員招聘1人筆試備考題庫及答案解析
- 2026山東濟南中國十九冶集團有限公司招聘筆試參考題庫及答案解析
- 2026年淮南高新區(qū)中心幼兒園面向社會公開招聘服務崗位教師14名考試備考試題及答案解析
- 2026年房地產市場分析工具與技巧
- 江蘇省連云港市2024-2025學年第一學期期末調研考試高二歷史試題
- 生成式人工智能與初中歷史校本教研模式的融合與創(chuàng)新教學研究課題報告
- 2025年湖北煙草專賣局筆試試題及答案
- 文化館安全生產制度
- (2025年)保安員(初級)證考試題庫及答案
- 2026年浙江省軍士轉業(yè)崗位履職能力考點練習題及答案
- GB/T 17727-2024船用法蘭非金屬墊片
- 低壓線路改造項目可行性研究報告
- JJF(機械) 1064-2021 運動場地材料沖擊吸收和垂直變形試驗機校準規(guī)范
- PPAP全尺寸檢測報告
- 化工工藝安全與風險評估
評論
0/150
提交評論