MySQL數(shù)據(jù)庫教程(視頻指導(dǎo)版)全套課件_第1頁
MySQL數(shù)據(jù)庫教程(視頻指導(dǎo)版)全套課件_第2頁
MySQL數(shù)據(jù)庫教程(視頻指導(dǎo)版)全套課件_第3頁
MySQL數(shù)據(jù)庫教程(視頻指導(dǎo)版)全套課件_第4頁
MySQL數(shù)據(jù)庫教程(視頻指導(dǎo)版)全套課件_第5頁
已閱讀5頁,還剩415頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第1章MySQL初步1.1數(shù)據(jù)庫基本概念1.2MySQL數(shù)據(jù)庫1.3MySQL常用界面工具第1章MySQL初步.pptx第2章MySQL數(shù)據(jù)庫和表.pptx第3章MySQL查詢和視圖.pptx第4章MySQL索引與完整性約束.pptx第5章MySQL語言.pptx第6章MySQL存儲過程函數(shù)觸發(fā)器事件.pptx第7章MySQL數(shù)據(jù)庫備份與恢復(fù).pptx第8章MySQL用戶權(quán)限維護(hù).pptx第9章MySQL事務(wù)管理.pptx1.1

數(shù)據(jù)庫基本概念1.數(shù)據(jù)庫數(shù)據(jù)庫(DB)是存放數(shù)據(jù)的倉庫,而且這些數(shù)據(jù)存在一定的關(guān)聯(lián),并按一定的格式存放在計算機(jī)上存儲介質(zhì)上。學(xué)生成績管理數(shù)據(jù)庫:學(xué)生基本信息、課程信息、學(xué)生成績信息等數(shù)據(jù)2.數(shù)據(jù)模型數(shù)據(jù)模型主要有層次模型、網(wǎng)狀模型和關(guān)系模型。關(guān)系模型以記錄組或二維數(shù)據(jù)表的形式組織數(shù)據(jù)。學(xué)生成績管理數(shù)據(jù)庫:“學(xué)生”、“課程”和“成績”三個表中。學(xué)生表:學(xué)號、姓名、性別、出生時間、專業(yè)、總學(xué)分、備注;課程表:課程號、課程名、開課學(xué)期、學(xué)時和學(xué)分;成績表:學(xué)號、課程號和成績。1.1

數(shù)據(jù)庫基本概念學(xué)

號姓

名性

別出生時間專

業(yè)總

學(xué)

分備

注081101王林男1990-02-10計算機(jī)50

081103王燕女1989-10-06計算機(jī)50

081108林一帆男1989-08-05計算機(jī)52已提前修完一門課081202王林男1989-01-29通信工程40有一門課不及格,待補(bǔ)考081204馬琳琳女1989-02-10通信工程42

號課

名開課學(xué)期學(xué)

時學(xué)

分0101計算機(jī)基礎(chǔ)18050102程序設(shè)計與語言26840206離散數(shù)學(xué)4684學(xué)

號課

號成

績學(xué)

號課

號成

績08110110180081108101850811011027808110810264081101206760811082068708110310162081202101650811031027008120410191表1.3“成績”表表1.2“課程”表表1.1“學(xué)生”表1.1

數(shù)據(jù)庫基本概念表格中的一行稱為一個記錄,一列稱為一個字段,每列的標(biāo)題稱為字段名。關(guān)系表的結(jié)構(gòu):關(guān)系表名(字段名1,…,字段名n)學(xué)生關(guān)系模式:XSB(學(xué)號,姓名,性別,出生時間,專業(yè),總學(xué)分,備注)。課程關(guān)系模式:KCB(課程號,課程名,開課學(xué)期,學(xué)時,學(xué)分)。成績關(guān)系模式:CJB(學(xué)號,課程號,成績,學(xué)分)。1.1

數(shù)據(jù)庫基本概念3.數(shù)據(jù)庫管理系統(tǒng)數(shù)據(jù)庫管理系統(tǒng)(DBMS)是管理數(shù)據(jù)庫的系統(tǒng),它按一定的數(shù)據(jù)模型組織數(shù)據(jù)。提供如下功能:定義數(shù)據(jù)庫中的對象對數(shù)據(jù)庫包含對象進(jìn)行操作保證輸入的數(shù)據(jù)滿足相應(yīng)的約束條件保證只有具有權(quán)限的用戶才能訪問數(shù)據(jù)庫中的數(shù)據(jù)、使多個應(yīng)用程序可在同一時刻訪問數(shù)據(jù)庫的數(shù)據(jù)、數(shù)據(jù)庫備份和恢復(fù)功能、能夠在網(wǎng)絡(luò)環(huán)境下訪問數(shù)據(jù)庫的功能和數(shù)據(jù)庫信息的接口和工具。數(shù)據(jù)庫系統(tǒng)管理員(DBA):通過DBMS提供的工具對數(shù)據(jù)庫進(jìn)行管理。數(shù)據(jù)庫應(yīng)用程序:通過DBMS的數(shù)據(jù)庫的接口編寫操作數(shù)據(jù)庫。1.1

數(shù)據(jù)庫基本概念4.關(guān)系型數(shù)據(jù)庫語言SQL(StructuredQueryLanguage,結(jié)構(gòu)化查詢語言)是用于關(guān)系數(shù)據(jù)庫查詢的結(jié)構(gòu)化語言。SQL的功能:數(shù)據(jù)查詢、數(shù)據(jù)操縱、數(shù)據(jù)定義和數(shù)據(jù)控制4部分。DBA可通過DBMS發(fā)送SQL命令,命令執(zhí)行結(jié)果在DBMS界面上顯示。用戶通過應(yīng)用程序界面表達(dá)如何操作數(shù)據(jù)庫,應(yīng)用程序把其轉(zhuǎn)換為SQL命令發(fā)送給DBMS,再將操作結(jié)果在應(yīng)用程序界面顯示出來。1.1

數(shù)據(jù)庫基本概念5.數(shù)據(jù)庫系統(tǒng)數(shù)據(jù)、數(shù)據(jù)庫、數(shù)據(jù)庫管理系統(tǒng)與操作數(shù)據(jù)庫的應(yīng)用程序,加上支撐它們的硬件平臺、軟件平臺和與數(shù)據(jù)庫有關(guān)的人員一起構(gòu)成了一個完整的數(shù)據(jù)庫系統(tǒng)。1.2MySQL數(shù)據(jù)庫1.2.1概述MySQL是一個小型關(guān)系數(shù)據(jù)庫管理系統(tǒng),開發(fā)者為瑞典MySQLAB公司。網(wǎng)站構(gòu)架方式是LAMP(Linux+Apache+MySQL+PHP):即使用Linux作為操作系統(tǒng);Apache作Web服務(wù)器;MySQL作為數(shù)據(jù)庫DBMS;PHP作服務(wù)器端腳本解釋器。因這4款軟件都遵循GPL開放源碼授權(quán),故使用這種組合的解決方案不用花一分錢就可以建立起一個穩(wěn)定、免費的網(wǎng)站系統(tǒng)。1.2.2安裝運行1.MySQL下載安裝(1)雙擊會彈出歡迎窗口,單擊“InstallMySQLProducts”文字鏈接,會彈出“LicenseAgreement”窗口,該窗口列出即用戶許可協(xié)議。選中“Iacceptthelicenseterms”復(fù)選框,然后單擊“Next”按鈕。(2)進(jìn)入安裝類型(ChoosingaSetupType)選擇界面。1.2.2安裝運行(3)系統(tǒng)進(jìn)入“SelectProductsandFeatures”(選擇安裝項目)窗口。1.2.2安裝運行(4)“Installation”窗口列出用戶在上一個窗口選擇的安裝項目,選擇“Back”按鈕可返回上一個窗口重新選擇,按“Next”按鈕進(jìn)入下一個窗口。(5)系統(tǒng)開始安裝程序并會彈出如圖窗口。1.2.2安裝運行2.MySQL服務(wù)器配置(1)進(jìn)入服務(wù)器配置窗口(ProductConfiguration),單擊“Next”按鈕,出現(xiàn)第一個配置窗口(TypeandNetworking-ServerConfigurationType),配置MySQL服務(wù)器運行的參數(shù)。1.2.2安裝運行其中:ConfigType下拉列表項用來配置當(dāng)前服務(wù)器的類型??梢赃x擇:DevelopmentMachine(開發(fā)者機(jī)器):使用最少的系統(tǒng)資源。ServerMachine(服務(wù)器):使用適當(dāng)比例的系統(tǒng)資源。DedicatedMySQLServerMachine(專用MySQL服務(wù)器):配置所有可用系統(tǒng)資源。

作為初學(xué)者,選擇“DevelopmentMachine”。Connectivity下包含連接MySQL的參數(shù)。

啟用TCP/IP網(wǎng)絡(luò);默認(rèn)端口為3306(該端口號必須沒有被占用);

打開通過網(wǎng)絡(luò)存取數(shù)據(jù)庫防火墻功能。

不選命名管道和共享內(nèi)存功能。高級配置。選擇“ShowAdvancedOptions”可打開選項。對于初學(xué)者默認(rèn)配置即可。單擊“Next”按鈕進(jìn)入下一個窗口。1.2.2安裝運行(2)系統(tǒng)顯示“AccountsandRoles”窗口,配置root賬戶和角色root用戶的密碼,在MySQLRootPassword(輸入新密碼)

RepeatPassword(確認(rèn)密碼)密碼:njnu123456。AddUser:創(chuàng)建新的用戶,設(shè)置有關(guān)角色。1.2.2安裝運行(3)系統(tǒng)顯示W(wǎng)indowsService窗口,配置作為Windows程序運行參數(shù)。1.2.2安裝運行(4)配置插件連接MySQL數(shù)據(jù)庫參數(shù):包含協(xié)議、文檔、端口號和是否打開防火墻。1.2.2安裝運行(5)ApplyServerConfogtion:應(yīng)用服務(wù)配置過程窗口1.2.2安裝運行(6)系統(tǒng)顯示“ProductConfiguration”窗口,其中顯示“MySQLServer”配置已經(jīng)完成,系統(tǒng)開始配置“SamplesandExmples”。(7)系統(tǒng)顯示“ConnectToServer”連接到MySQL服務(wù)器窗口。1.2.2安裝運行3.MySQL數(shù)據(jù)庫試運行為了驗證上述的安裝和配置是否成功,先來運行MySQL數(shù)據(jù)庫。(1)啟動MySQL服務(wù)安裝配置完成后,打開Windows任務(wù)管理器,可以看到MySQL服務(wù)進(jìn)程mysqld.exe已經(jīng)啟動了。使用MySQL之前,必須確保進(jìn)程mysqld.exe已經(jīng)啟動。在Windows管理器中啟動,或者進(jìn)入MySQL安裝目錄C:\ProgramFiles(x86)\MySQL\MySQLServer5.7\bin(讀者請進(jìn)入自己安裝MySQL的bin目錄),雙擊mysqld.exe即可。

1.2.2安裝運行(2)登錄MySQL數(shù)據(jù)庫進(jìn)入Windows命令行,輸入:C:\...>cdC:\ProgramFiles(x86)\MySQL\MySQLServer5.7\bin進(jìn)入MySQL可執(zhí)行程序目錄,再輸入:C:\ProgramFiles\MySQL\MySQLServer5.7\bin>mysql-uroot-p按“Enter”后,輸入密碼(讀者請用之前安裝時自己設(shè)置的密碼):Enterpassword:njnu1234561.2.2安裝運行(3)設(shè)置MySQL字符集為了讓MySQL數(shù)據(jù)庫能夠支持中文,必須設(shè)置系統(tǒng)字符集編碼。輸入命令:showvariableslike‘char%’;可查看當(dāng)前聯(lián)接系統(tǒng)的參數(shù)。1.2.2安裝運行然后輸入:setcharacter_set_database=’gbk’;setcharacter_set_server=‘gbk’;將數(shù)據(jù)庫和服務(wù)器的字符集均設(shè)為gbk(中文)。最后輸入命令:status;1.2.2安裝運行(4)定義初學(xué)者,為了在操作MySQL由于不同操作系統(tǒng)默認(rèn)的權(quán)限差異不能使用有些功能,建議進(jìn)行設(shè)置操作權(quán)限。輸入命令:usemysql;grantallprivilegeson*.*to‘root’@’%’identifiedby‘njnu123456’withgrantoption;flushprivileges;1.2.3命令初步1.創(chuàng)建、查看數(shù)據(jù)庫(1)查看系統(tǒng)數(shù)據(jù)庫查看MySQL系統(tǒng)的已有的數(shù)據(jù)庫,輸入命令:showdatabases;系統(tǒng)會列出已有的數(shù)據(jù)庫3個。information_schema、mysql和performance_schema,它們都是MySQL安裝時系統(tǒng)自動創(chuàng)建的,MySQL把有關(guān)DBMS自身的管理信息都保存在這幾個數(shù)據(jù)庫中。如果安裝時選擇安裝實例數(shù)據(jù)庫,則系統(tǒng)還有另外2個實例數(shù)據(jù)庫sakila和world。1.2.3命令初步(2)創(chuàng)建用戶數(shù)據(jù)庫在mysql>提示符后輸入“CREATEDATABASE”(大小寫不限)語句:createdatabasemytest;創(chuàng)建了一個用于測試的數(shù)據(jù)庫mytest;使用showdatabases語句查看一下,執(zhí)行結(jié)果列表中多了一項mytest,就是用戶剛剛創(chuàng)建的數(shù)據(jù)庫。1.2.3命令初步數(shù)據(jù)庫創(chuàng)建后,在安裝MySQL時確定的數(shù)據(jù)庫數(shù)據(jù)文件制定路徑下就會產(chǎn)生以數(shù)據(jù)庫名作為目錄名的目錄。在該目錄下生成的一個“db.opt”文件,在該文件中記錄了數(shù)據(jù)庫的特征信息。1.2.3命令初步2.在數(shù)據(jù)庫中創(chuàng)建表(1)切換當(dāng)前數(shù)據(jù)庫usemytestUSE為少數(shù)幾個不需要終結(jié)符(;)的語句之一,當(dāng)然,加上終結(jié)符也不會出錯。1.2.3命令初步(2)創(chuàng)建表createtable

user(idintauto_incrementnotnullprimarykey,

usernamevarchar(10)notnull,

passwordvarchar(10)notnull);其中:user表包含id、username和password列。id列標(biāo)志字段,整型(int),字段數(shù)據(jù)系統(tǒng)增一(auto_increment),并將其設(shè)置為主鍵(primarykey);username和password列分別存放不超過10個字符(varchar(10))用戶名和密碼,記錄中這三個字段不允許空(notnull)。1.2.3命令初步數(shù)據(jù)庫中創(chuàng)建了一個表,在該數(shù)據(jù)庫目錄下就會生成主文件名為表名的2個文件。1.2.3命令初步(3)查看表信息現(xiàn)在來檢驗一下mytest數(shù)據(jù)庫中是否創(chuàng)建了user表。在命令行輸入:showtables;系統(tǒng)顯示數(shù)據(jù)庫中已經(jīng)有了一個user表describeuser;還可詳細(xì)查看user表的結(jié)構(gòu)、字段類型等信息。1.2.3命令初步3.向表中加入記錄通常,用INSERT語句向表中插入記錄。例如:insertinto

user

values(1,'Tom','19941216');insertintouservalues(2,'周何駿','19960925');VALUES表必須包含表中每一列的值,并且按表中列的存放次序給出。在MySQL中,字符串串值需要用單引號或雙引號括起來。select*fromuser;可使用DROPDATABASE命令刪除用戶自己創(chuàng)建的數(shù)據(jù)庫:dropdatabasemytest;1.2.3命令初步4.MySQL命令說明(1)在描述命令格式時,用[]表示可選項。(2)MySQL命令不區(qū)分大小寫,但本書為了讀者閱讀方便,在本書描述命令格式和命令實例時,命令關(guān)鍵字用大寫表示,其他用小寫表示。但在實際對MySQL操作時為了避免大小寫頻繁切換,一般都用小寫。(3)命令關(guān)鍵字可以只寫前面4個字符。describeuser;與descruser;效果是一樣的。1.2.3命令初步(4)修改命令結(jié)束符號在MySQL中,服務(wù)器處理語句的時候是以分號為結(jié)束標(biāo)志的。使用DELIMITER命令將MySQL語句的結(jié)束標(biāo)志修改為其他符號。例如,將MySQL結(jié)束符修改為兩個斜杠“/”符號。DELIMITER//說明:執(zhí)行完這條命令后,程序結(jié)束的標(biāo)志就換為雙斜杠符號“//”了。要想恢復(fù)使用分號“;”作為結(jié)束符,運行下面命令即可:OPDELIMITER;1.3MySQL常用界面工具1.圖形化客戶端這類工具采用C/S架構(gòu),用戶通過安裝在桌面計算機(jī)上的客戶端軟件連接并操作后臺的MySQL數(shù)據(jù)庫,客戶端是圖形化用戶界面(GUI)。

除了MySQL官方提供的管理工具M(jìn)ySQLAdministrator和MySQLWorkbench,還有很多第三方開發(fā)的優(yōu)秀工具,比較著名的有:Navicat、SequelPro、HeidiSQL、SQLMaestroMySQLToolsFamily、SQLWave、dbForgeStudio、DBToolsManager、MyDBStudio、AquaDataStudio、SQLyog、MYSQLFront和SQLBuddy等。1.3MySQL常用界面工具2.基于Web的管理工具這類工具采用B/S架構(gòu),用戶計算機(jī)上無須再安裝客戶端,管理工具運行于Web服務(wù)器上。第2章MySQL數(shù)據(jù)庫和表2.1MySQL數(shù)據(jù)庫

2.2MySQL表

2.3表記錄的操作

2.1MySQL數(shù)據(jù)庫

2.1.1創(chuàng)建數(shù)據(jù)庫使用CREATEDATABASE或CREATESCHEMA命令可以創(chuàng)建數(shù)據(jù)庫。語法格式:CREATE[IFNOTEXISTS]數(shù)據(jù)庫名[DEFAULT]CHARACTERSET字符集|[DEFAULT]COLLATE校對規(guī)則名其中:IFNOTEXISTS:在創(chuàng)建數(shù)據(jù)庫前進(jìn)行判斷,只有該數(shù)據(jù)庫目前尚不存在時才執(zhí)行CREATEDATABASE操作。用此選項可以避免出現(xiàn)數(shù)據(jù)庫已經(jīng)存在而再新建的錯誤。CHARACTERSET:指定數(shù)據(jù)庫字符采用的默認(rèn)字符集。COLLATE:指定字符集的校對規(guī)則。2.1.1創(chuàng)建數(shù)據(jù)庫【例2.1】創(chuàng)建學(xué)生成績數(shù)據(jù)庫,數(shù)據(jù)庫名稱xscj。mysql>createdatabasexscj使用IFNOTEXISTS選項從句可不顯示錯誤信息。創(chuàng)建了數(shù)據(jù)庫之后使用USE命令可指定當(dāng)前數(shù)據(jù)庫。USE數(shù)據(jù)庫名;例如:指定當(dāng)前數(shù)據(jù)庫為學(xué)生成績數(shù)據(jù)庫(xscj)。mysql>usexscj注意:在MySQL中,每一條SQL語句都以“;”作為結(jié)束標(biāo)志。2.1.2修改數(shù)據(jù)庫數(shù)據(jù)庫創(chuàng)建后,如果需要修改數(shù)據(jù)庫的參數(shù),可以使用ALTERDATABASE命令?!纠?.2】修改學(xué)生成績數(shù)據(jù)庫(xscj)默認(rèn)字符集和校對規(guī)則。2.1.3刪除數(shù)據(jù)庫已經(jīng)創(chuàng)建的數(shù)據(jù)庫需要刪除,使用DROPDATABASE命令。語法格式:DROPDATABASE[IFEXISTS]數(shù)據(jù)庫名還可以使用IFEXISTS子句,避免刪除不存在的數(shù)據(jù)庫時出現(xiàn)MySQL錯誤信息。注意:這個命令必須小心使用,因為它將刪除指定的整個數(shù)據(jù)庫,該數(shù)據(jù)庫的所有表(包括其中的數(shù)據(jù))也將永久刪除。2.2MySQL表

2.2.1創(chuàng)建表1.全新創(chuàng)建從頭創(chuàng)建一個全新的表,使用CREATETABLE命令。語法格式:CREATETABLE[IFNOTEXISTS]表名(

[列定義]...

|[表索引定義])[表選項][select語句];說明:列定義:包括列名、數(shù)據(jù)類型,可能還有一個空值聲明和一個完整性約束。表索引項定義:主要定義表的索引、主鍵、外鍵等,具體定義將在第5章中討論。select語句:用于在一個已有表的基礎(chǔ)上創(chuàng)建表。2.2.1創(chuàng)建表【例2.3】在學(xué)生成績數(shù)據(jù)庫(xscj)中也創(chuàng)建一個學(xué)生情況表,表名xs。(1)輸入以下命令:usexscjcreatetablexs(學(xué)號 char(6) notnullprimarykey,姓名 char(8) notnull,專業(yè)名 char(10) null,性別 tinyint(1) notnulldefault1,出生日期 date notnull,總學(xué)分 tinyint(1)null,照片 blob null,備注 text null);2.2.1創(chuàng)建表其中:“學(xué)號”列:字符型,長度6,不能為空,為本表主鍵(主碼)?!靶彰绷校鹤址?,長度8,不能為空。“專業(yè)名”列:字符型,長度10,可空?!靶詣e”列:短整型,1個字節(jié),不能為空,默認(rèn)值為1?!俺錾掌凇绷校喝掌谛停荒転榭??!翱倢W(xué)分”列:短整型,1個字節(jié),可空?!罢掌绷校憾M(jìn)制型,可空?!皞渥ⅰ绷校何谋拘停煽?。2.2.1創(chuàng)建表(2)用showtables命令顯示xscj數(shù)據(jù)庫中產(chǎn)生了學(xué)生(xs)表,用describexs命令可以顯示xs表的結(jié)構(gòu)。2.2.1創(chuàng)建表2.復(fù)制現(xiàn)成的表語法格式:CREATETABLE[IFNOTEXISTS]表名[LIKE已有表名]|[AS(復(fù)制表記錄)];LIKE關(guān)鍵字后面表名應(yīng)該已經(jīng)存在。AS后為可以復(fù)制表的內(nèi)容。例如,可以是一條SELECT語句,SELECT語句為查詢表記錄。注意,索引和完整性約束是不會復(fù)制的。2.2.1創(chuàng)建表【例2.4】在mytest數(shù)據(jù)庫中,用復(fù)制的方式創(chuàng)建一個名為user_copy1的表,表結(jié)構(gòu)直接取自user表;另再創(chuàng)建一個名為user_copy2的表,其結(jié)構(gòu)和內(nèi)容(數(shù)據(jù))都取自user表。usemytestcreatetableuser_copy1likeuser;createtableuser_copy2as(select*fromuser);2.2.1創(chuàng)建表查詢user_copy1表中沒有記錄,而user_copy2表中包含user表中所有記錄。2.2.2修改表1.修改表結(jié)構(gòu)ALTERTABLE用于更改原有表的結(jié)構(gòu)。例如,可以增加(刪減)列、創(chuàng)建(取消)索引、更改原有列的類型、重新命名列或表,還可以更改表的評注和表的類型。語法格式:ALTERTABLE表名

ADD列定義 [FIRST|AFTER列名]|

MODIFY列定義|

ALTER列名{SETDEFAULT值|DROPDEFAULT}|

CHANGE列名原列名|

DROP列名|

RENAME[TO]新表名2.2.2修改表說明:ADD子句:向表中增加新列。通過FIRST|AFTER列名指定增加列的位置,否則加在最后一列。例如,在表user中增加新的一列“班級號”:usermytestaltertableuseraddcolumn班級號tinyint(1)null;MODIFY子句:修改指定列的數(shù)據(jù)類型。例如:altertableusermodify班級號bigintnotnull;注意,若表中該列所存數(shù)據(jù)的數(shù)據(jù)類型與將要修改的列的類型沖突,則發(fā)生錯誤。例如,原來char類型的列要修改成int類型,而原來列值中有字符型數(shù)據(jù),則無法修改。

ALTER子句:修改表中指定列的默認(rèn)值,或者刪除列默認(rèn)值。CHANGE子句:修改列的名稱。DROP子句:刪除列或約束。2.2.2修改表【例2.5】在xscj數(shù)據(jù)庫的xs表中,增加“獎學(xué)金等級”一列,并將表中的“姓名”列刪除。userxscjaltertablexsadd獎學(xué)金等級tinyintnull,dropcolumn班級號;2.2.2修改表2.更改表名語法格式:RENAMETABLE老表名TO新表名...【例2.6】將mytest數(shù)據(jù)庫user_copy1表重命名為user1,user_copy2表重命名為user2。renametableuser_copy1touser1,user_copy2touser2;altertableuser2renametouserb;2.2.3刪除表需要刪除一個表時可以使用DROPTABLE語句。語法格式:DROPTABLE[IFEXISTS]表名...這個命令將表的描述、表的完整性約束、索引及和表相關(guān)的權(quán)限等一并刪除。【例2.7】刪除表uesrb。droptableifexistsuserb;2.3表記錄的操作

2.3.1插入記錄1.插入新記錄語法格式:INSERT[INTO]表名[(列名,...)]VALUES({expr|DEFAULT},...)|SET列名={expr|DEFAULT},...說明:列名:需要插入數(shù)據(jù)的列名。如果要給全部列插入數(shù)據(jù),列名可以省略。VALUES子句:包含各列需要插入的數(shù)據(jù)清單,數(shù)據(jù)的順序要與列的順序相對應(yīng)。若沒有給出列名,則在VALUES子句中要給出每一列的值。如果列值為空,則值必須置為NULL,否則會出錯。SET子句:SET子句用于給列指定值。要插入數(shù)據(jù)的列名在SET子句中指定,等號后面為指定數(shù)據(jù)。未指定的列,列值為默認(rèn)值。2.3.1插入記錄【例2.8】向?qū)W生成績數(shù)據(jù)庫(xscj)的表xs(表中列包括學(xué)號、姓名、專業(yè)名、性別、出生日期、總學(xué)分、照片、備注)中插入如下一行:081101,王林,計算機(jī),1,1994-02-10,50,NULL,NULL使用下列語句:usexscjinsertintoxsvalues('081101','王林','計算機(jī)',1,'1994-02-10',50,null,null);若表xs中專業(yè)的默認(rèn)值為“計算機(jī)”,照片、備注默認(rèn)值為NULL,插入上例那行數(shù)據(jù)也可以使用如下命令:insertintoxs(學(xué)號,姓名,性別,出生日期,總學(xué)分)values('081101','王林',1,'1994-02-10',50);也與下面這個命令的效果相同:insertintoxsvalues('081101','王林',default,1,'1994-02-10',50,null,null);2.3.1插入記錄SET子句來實現(xiàn):insertintoxsset學(xué)號='081101',姓名='王林',專業(yè)=default,性別=1,出生日期='1994-02-10',總學(xué)分=50;執(zhí)行結(jié)果:2.3.1插入記錄2.從已有表中插入新記錄INSERT[INTO]表名[(列名,...)]SELECT語句SELECT語句中返回的是一個查詢到的結(jié)果集,INSERT語句將這個結(jié)果集插入到指定表中,但結(jié)果集中每行數(shù)據(jù)的字段數(shù)、字段的數(shù)據(jù)類型要與被操作的表完全一致。2.3.1插入記錄【例2.9】將mytest數(shù)據(jù)庫user表記錄插入到user1表中。usermytestinsertintouser1select*fromuser;命令執(zhí)行前后的效果。

2.3.1插入記錄3.插入圖片MySQL還支持圖片的插入,圖片一般可以以路徑的形式來存儲,即插入圖片可以采用插入圖片的存儲路徑的方式。也可以直接插入圖片本身,只要用LOAD_FILE函數(shù)即可。【例2.10】向xs表中插入一行記錄:081102,程明,計算機(jī),1,1995-02-01,50,picture.jpg,NULL其中,照片路徑為D:\IMAGE\picture.jpg。使用如下語句:insertintoxsvalues('081102','程明','計算機(jī)',1,'1995-02-01',50,'D:\IMAGE\picture.jpg',null);2.3.1插入記錄也可使用這個語句直接存儲圖片本身:insertintoxsvalues('081102','程明','計算機(jī)',1,'1995-02-01',50,load_file('D:\IMAGE\picture.jpg'),null);執(zhí)行結(jié)果為:2.3.2修改記錄1.替換舊記錄REPLACE語句可以在插入數(shù)據(jù)之前將與新記錄沖突的舊記錄刪除,從而使新記錄能夠替換舊記錄,正常插入。REPLACE語句格式與INSERT相同?!纠?.11】若上例中的記錄行已經(jīng)插入,其中學(xué)號為主鍵(PRIMARYKEY),現(xiàn)在想再插入下列一行記錄:081101,劉華,通信工程,1,1995-03-08,48,NULL,NULL若直接使用INSERT語句,會產(chǎn)生如下錯誤:使用REPLACE語句,則可以成功插入:2.3.2修改記錄2.修改單個表語法格式:UPDATE[LOW_PRIORITY][IGNORE]表名SET列名1=expr1[,列名2=expr2...][WHERE條件]說明:若語句中不設(shè)定WHERE子句,則更新所有行。列名1、列名2…為要修改列,列值為expr,expr可以是常量、變量,列名或表達(dá)式。可以同時修改所在數(shù)據(jù)行的多個列值,中間用逗號隔開。WHERE子句:指定的刪除記錄條件。如果省略WHERE子句則刪除該表的所有行。2.3.2修改記錄【例2.12】將學(xué)生成績數(shù)據(jù)庫(xscj)的學(xué)生(xs)表中的所有學(xué)生的總學(xué)分都增加10。將姓名為“劉華”的同學(xué)的備注填寫為“輔修計算機(jī)專業(yè)”,學(xué)號改為“081250”。updatexsset總學(xué)分=總學(xué)分+10;updatexsset學(xué)號='081250',備注='輔修計算機(jī)專業(yè)'where姓名='劉華';select學(xué)號,姓名,總學(xué)分,備注fromxs;執(zhí)行結(jié)果為:2.3.2修改記錄3.修改多個表語法格式:UPDATE表名,表名...SET列名1=expr1[,列名2=expr2...][WHERE條件]【例2.13】mytest數(shù)據(jù)庫表user和表user2中都有兩個字段idint(11),passwordvarchar(10),其中id為主鍵。當(dāng)表user中id值與user2中id值相同時,將表user中對應(yīng)的password值修改為“11111111”,將表user2中對應(yīng)的password值改為“22222222”。usermytestupdateuser,user2setuser.password='11111111',user2.password='22222222'whereuser.id=user2.id;修改后的結(jié)果:2.3.3刪除記錄1.刪除滿足條件的行使用DELETE語句刪除表中滿足條件的記錄行。從單個表中刪除,語法格式:DELETEFROM表名[WHERE條件]說明:FROM子句:用于說明從何處刪除數(shù)據(jù),表名為要刪除數(shù)據(jù)的表名。WHERE子句:指定的刪除記錄條件。如果省略WHERE子句則刪除該表的所有行。2.3.3刪除記錄【例2.14】刪除mytest數(shù)據(jù)庫中user2表“周何駿”記錄刪除。usemytestdeletefrompersonwhereusername='周何駿';或者deletefromxswhereid=2;2.3.3刪除記錄2.從多個表中刪除行語法格式如下:DELETE[LOW_PRIORITY][QUICK][IGNORE]表名[.*][,表名[.*]...]FROMtable_references[WHEREwhere_definition]或:DELETE[LOW_PRIORITY][QUICK][IGNORE] FROM表名[.*][,表名[.*]...] USINGtable_references [WHEREwhere_definition]2.3.3刪除記錄【例2.15】刪除user1中id值等于user的id值的所有行和user2中id值等于user的id值的所有行,使用如下語句:DELETEuser1,user2FROMuser1,user2,userWHEREuser1.id=user.idANDuser2.id=user.id;命令執(zhí)行結(jié)果:2.3.3刪除記錄3.清除表數(shù)據(jù)使用TRUNCATETABLE語句將刪除指定表中的所有數(shù)據(jù),因此也稱其為清除表數(shù)據(jù)語句,其語法格式如下:TRUNCATETABLE表名說明:由于TRUNCATETABLE語句將刪除表中的所有數(shù)據(jù),且無法恢復(fù),因此使用時必須十分小心!第3章MySQL查詢和視圖3.1MySQL數(shù)據(jù)庫查詢3.2MySQL視圖

3.1MySQL數(shù)據(jù)庫查詢SELECT語句可以從一個或多個表中選取符合某種條件的特定的行和列,結(jié)果通常是生成一個臨時表。下面介紹SELECT語句,它是SQL的核心。語法格式如下:SELECT[ALL|DISTINCT|DISTINCTROW]列...[FROM表...] [WHERE條件] [GROUPBY{列名|表達(dá)式|position}[ASC|DESC],...][HAVING條件] [ORDERBY{列名|表達(dá)式|position}[ASC|DESC],...][PROCEDURE存儲過程名(參數(shù)...)][INTOOUTFILE'文件名'[CHARACTERSET字符集]export_options|INTODUMPFILE'文件名'|INTO變量名...][FORUPDATE|LOCKINSHAREMODE]]3.1.1選擇輸出列1.選擇指定的列使用SELECT語句選擇一個表中的某些列,各列名之間要以逗號分隔,所有列用“*”表示。SELECT*|列名,列名,...from表名【例3.1】查詢xscj數(shù)據(jù)庫的xs表中各個同學(xué)的姓名、專業(yè)名和總學(xué)分。usexscjselect姓名,專業(yè)名,總學(xué)分fromxs;3.1.1選擇輸出列2.定義列別名當(dāng)希望查詢結(jié)果中的列顯示時使用自己選擇的列標(biāo)題,可以在列名之后使用AS子句。SELECT...列名[AS列別名]【例3.2】查詢xs表中計算機(jī)專業(yè)同學(xué)的學(xué)號、姓名和總學(xué)分,結(jié)果中各列的標(biāo)題分別指定為number、name和mark。select學(xué)號asnumber,姓名asname,總學(xué)分asmarkfromxswhere專業(yè)名='計算機(jī)';執(zhí)行結(jié)果:3.1.1選擇輸出列注意:當(dāng)自定義的列標(biāo)題中含有空格時,必須使用引號將標(biāo)題括起來。例如:select學(xué)號as'studentnumber',姓名as'studentname',總學(xué)分asmarkfromxswhere專業(yè)名='計算機(jī)';說明:不允許在WHERE子句中使用列別名。這是因為執(zhí)行WHERE代碼時,可能尚未確定列值。例如,這個查詢是非法的:select性別assexfromxswheresex=0;3.1.1選擇輸出列3.替換查詢結(jié)果中的數(shù)據(jù)要替換查詢結(jié)果中的數(shù)據(jù),則要使用查詢中的CASE表達(dá)式,格式為:CASEWHEN條件1

THEN表達(dá)式1WHEN條件2THEN表達(dá)式2...ELSE表達(dá)式nEND3.1.1選擇輸出列【例3.3】查詢xs表中計算機(jī)專業(yè)各同學(xué)的學(xué)號、姓名和總學(xué)分,對總學(xué)分按如下規(guī)則進(jìn)行替換:若總學(xué)分為空值,替換為“尚未選課”;若總學(xué)分小于50,替換為“不及格”;若總學(xué)分在50~52之間,替換為“合格”;若總學(xué)分大于52,替換為“優(yōu)秀”??倢W(xué)分列的標(biāo)題更改為“等級”。select學(xué)號,姓名,casewhen總學(xué)分isnullthen'尚未選課'when總學(xué)分<50then'不及格'when總學(xué)分>=50and總學(xué)分<=52then'合格'else'優(yōu)秀'endas等級fromxswhere專業(yè)名='計算機(jī)';執(zhí)行結(jié)果如右圖所示。

3.1.1選擇輸出列4.計算列值SELECT的輸出列可使用表達(dá)式:SELECT表達(dá)式...【例3.4】按120分制重新計算成績,顯示xs_kc表中學(xué)號為081101的學(xué)生成績信息。select學(xué)號,課程號,成績*1.20as成績120fromxs_kcwhere學(xué)號='081101';執(zhí)行結(jié)果如圖所示。

3.1.1選擇輸出列5.消除結(jié)果集中的重復(fù)行可以使用DISTINCT或DISTINCTROW關(guān)鍵字消除結(jié)果集中的重復(fù)行。SELECTDISTINCT|DISTINCTROW列名...【例3.5】對xscj數(shù)據(jù)庫的xs表只選擇專業(yè)名和總學(xué)分,消除結(jié)果集中的重復(fù)行。

selectdistinct專業(yè)名,總學(xué)分fromxs;執(zhí)行結(jié)果如圖所示。3.1.1選擇輸出列6.聚合函數(shù)SELECT的輸出列還可以包含所謂的聚合函數(shù)。聚合函數(shù)常常用于對一組值進(jìn)行計算,然后返回單個值。除COUNT函數(shù)外,聚合函數(shù)都會忽略空值。函

數(shù)

名說

明COUNT求組中項數(shù),返回int類型整數(shù)MAX求最大值MIN求最小值SUM返回表達(dá)式中所有值的和AVG求組中值的平均值STD或STDDEV返回給定表達(dá)式中所有值的標(biāo)準(zhǔn)差VARIANCE返回給定表達(dá)式中所有值的方差GROUP_CONCAT返回由屬于一組的列值連接組合而成的結(jié)果BIT_AND邏輯或BIT_OR邏輯與BIT_XOR邏輯異或3.1.1選擇輸出列(1)COUNT函數(shù)COUNT函數(shù)用于統(tǒng)計組中滿足條件的行數(shù)或總行數(shù),返回SELECT語句檢索到的行中非NULL值的數(shù)目,若找不到匹配的行,則返回0。語法格式:COUNT({[ALL|DISTINCT]表達(dá)式}|*)其中,表達(dá)式的數(shù)據(jù)類型可以是除BLOB或TEXT之外的任何類型。ALL表示對所有值進(jìn)行運算,DISTINCT表示去除重復(fù)值,默認(rèn)為ALL。使用COUNT(*)時將返回檢索行的總數(shù)目,不論其是否包含NULL值。3.1.1選擇輸出列【例3.6】求學(xué)生的總?cè)藬?shù)。

selectcount(*)as'學(xué)生總數(shù)'fromxs;執(zhí)行結(jié)果如圖所示?!纠?.7】統(tǒng)計備注不為空的學(xué)生數(shù)目。

selectcount(備注)as'備注不為空的學(xué)生數(shù)目'fromxs;執(zhí)行結(jié)果如圖所示。注意:這里COUNT(備注)計算時備注為NULL的行被忽略,所以這里是7而不是22。3.1.1選擇輸出列【例3.8】統(tǒng)計總學(xué)分在50分以上的人數(shù)。selectcount(總學(xué)分)as'總學(xué)分50分以上的人數(shù)'

fromxswhere總學(xué)分>50;執(zhí)行結(jié)果如圖所示。3.1.1選擇輸出列(2)MAX和MINMAX和MIN分別用于求表達(dá)式中所有值項的最大值與最小值,語法格式為:MAX/MIN([ALL|DISTINCT]表達(dá)式)【例3.9】求選修101課程的學(xué)生的最高分和最低分。selectmax(成績),min(成績)

fromxs_kcwhere課程號='101';執(zhí)行結(jié)果如圖所示。注意:當(dāng)給定列上只有空值或檢索出的中間結(jié)果為空時,MAX和MIN函數(shù)的值也為空。3.1.1選擇輸出列(3)SUM函數(shù)和AVG函數(shù)SUM和AVG分別用于求表達(dá)式中所有值項的總和與平均值,語法格式為:SUM/AVG([ALL|DISTINCT]表達(dá)式)【例3.10】求學(xué)號081101的學(xué)生所學(xué)課程的總成績。selectsum(成績)as'課程總成績'

fromxs_kcwhere學(xué)號='081101';執(zhí)行結(jié)果如圖所示?!纠?.11】求選修101課程的學(xué)生的平均成績。selectavg(成績)as'課程101平均成績'

fromxs_kcwhere課程號='101';執(zhí)行結(jié)果如圖所示。3.1.1選擇輸出列(4)VARIANCE和STDDEV(STD)函數(shù)VARIANCE和STDDEV函數(shù)分別用于計算特定的表達(dá)式中的所有值的方差和標(biāo)準(zhǔn)差。語法格式:VARIANCE/STDDEV([ALL|DISTINCT]表達(dá)式)【例3.12】求選修101課程的成績的方差。selectvariance(成績)

fromxs_kc where課程號='101';執(zhí)行結(jié)果如圖所示。3.1.1選擇輸出列說明:方差的計算按以下幾個步驟進(jìn)行。①計算相關(guān)列的平均值;②求列中的每一個值和平均值的差;③計算差值的平方的總和;④用總和除以(列中的)值的個數(shù)得結(jié)果。STDDEV函數(shù)用于計算標(biāo)準(zhǔn)差。標(biāo)準(zhǔn)差等于方差的平均根。所以,STDDEV(…)和SQRT(VARIANCE(…))這兩個表達(dá)式是相等的。3.1.1選擇輸出列【例3.13】求選修101課程的成績的標(biāo)準(zhǔn)差。selectstddev(成績)

fromxs_kc where課程號='101';執(zhí)行結(jié)果如右圖所示。stddev可以縮寫為std,這對結(jié)果沒有影響。3.1.1選擇輸出列(5)GROUP_CONCAT函數(shù)MySQL支持一個特殊的聚合函數(shù)GROUP_CONCAT。該函數(shù)返回來自一個組指定列的所有非NULL值,這些值一個接著一個放置,中間用逗號隔開,并表示為一個長長的字符串。這個字符串的長度是有限制的,標(biāo)準(zhǔn)值是1024。語法格式:GROUP_CONCAT({[ALL|DISTINCT]表達(dá)式}|*)【例3.14】求選修了206課程的學(xué)生的學(xué)號。selectgroup_concat(學(xué)號) fromxs_kc where課程號='206';執(zhí)行結(jié)果為:3.1.1選擇輸出列(6)BIT_AND、BIT_OR和BIT_XOR與二進(jìn)制運算符|(或)、&(與)和^(異或)相對應(yīng)的聚合函數(shù)也存在,分別是BIT_OR、BIT_AND、BIT_XOR。語法格式:BIT_AND|BIT_OR|BIT_XOR({[ALL|DISTINCT]表達(dá)式}|*)【例3.15】有一個表bits,其中有一列bin_value上有3個INTEGER值:1、3、7,獲取在該列上執(zhí)行BIT_OR的結(jié)果,使用如下語句:selectbin(bit_or(bin_value))frombits;3.1.2數(shù)據(jù)來源:FROM子句1.引用一個表可以用兩種方式引用表:第一種方式是使用USE語句讓一個數(shù)據(jù)庫成為當(dāng)前數(shù)據(jù)庫,F(xiàn)ROM子句中指定表名應(yīng)該屬于當(dāng)前數(shù)據(jù)庫。第二種方式是指定表名前帶上表所屬數(shù)據(jù)庫的名字。例如,假設(shè)當(dāng)前數(shù)據(jù)庫是db1,現(xiàn)在要顯示數(shù)據(jù)庫db2里的表tb的內(nèi)容,使用如下語句:SELECT*FROMdb2.tb;3.1.2數(shù)據(jù)來源:FROM子句2.多表連接如果要在不同表中查詢數(shù)據(jù),則必須在FROM子句中指定多個表,這時就要使用到連接。將不同列的數(shù)據(jù)組合到一個表中叫做表的連接。連接的方式有以下兩種。(1)全連接將各個表用逗號分隔,就指定了一個全連接。FROM子句產(chǎn)生的中間結(jié)果是一個新表,新表是每個表的每行都與其他表中的每行交叉以產(chǎn)生所有可能的組合。這種連接方式為可能得到的行數(shù)為每個表行數(shù)之積!使用WHERE子句設(shè)定條件將結(jié)果集減少為易于管理的大小,即為等值連接。【例3.16】查找xscj數(shù)據(jù)庫中所有學(xué)生選過的課程名和課程號。使用如下語句:selectdistinctkc.課程名,xs_kc.課程號

fromkc,xs_kcwherekc.課程號=xs_kc.課程號;執(zhí)行結(jié)果如圖所示。3.1.2數(shù)據(jù)來源:FROM子句(2)JOIN連接語法格式:JOIN表ON連接條件。使用JOIN關(guān)鍵字的連接主要分為三種:①

內(nèi)連接。指定了INNER關(guān)鍵字的連接是內(nèi)連接?!纠?.17】查找xscj數(shù)據(jù)庫中所有學(xué)生選過的課程名和課程號??梢允褂靡韵抡Z句:selectdistinct課程名,xs_kc.課程號

fromkcinnerjoinxs_kcon(kc.課程號=xs_kc.課程號);它的功能合并兩個表,返回滿足條件的行。內(nèi)連接是系統(tǒng)默認(rèn)的,可以省略INNER關(guān)鍵字。使用內(nèi)連接后,F(xiàn)ROM子句中ON條件主要用來連接表。【例3.18】查找選修了206課程且成績在80分以上的學(xué)生姓名及成績。

select姓名,成績fromxsjoinxs_kconxs.學(xué)號=xs_kc.學(xué)號

where課程號='206'and成績>=80;執(zhí)行結(jié)果如圖所示。3.1.2數(shù)據(jù)來源:FROM子句【例3.19】查找選修了“計算機(jī)基礎(chǔ)”課程且成績在80分以上的學(xué)生學(xué)號、姓名、課程名及成績。selectxs.學(xué)號,姓名,課程名,成績fromxsjoinxs_kconxs.學(xué)號=xs_kc.學(xué)號joinkconxs_kc.課程號=kc.課程號where課程名='計算機(jī)基礎(chǔ)'and成績>=80;執(zhí)行結(jié)果如下:3.1.2數(shù)據(jù)來源:FROM子句【例3.20】查找xscj數(shù)據(jù)庫中課程不同、成績相同的學(xué)生的學(xué)號、課程號和成績。selecta.學(xué)號,a.課程號,b.課程號,a.成績fromxs_kcasajoinxs_kcasbona.成績=b.成績anda.學(xué)號=b.學(xué)號anda.課程號!=b.課程號;執(zhí)行結(jié)果如右圖所示。

如果要連接的表中有列名相同,并且連接的條件就是列名相等,那么ON條件也可以換成USING子句。USING(兩表中相同的列名)子句用于為一系列的列進(jìn)行命名。【例3.21】查找kc表中所有學(xué)生選過的課程名。select課程名fromkcinnerjoinxs_kcusing(課程號);說明:查詢的結(jié)果為xs_kc表中所有出現(xiàn)的課程號對應(yīng)的課程名。3.1.2數(shù)據(jù)來源:FROM子句②外連接。指定了OUTER關(guān)鍵字的連接為外連接,其中的OUTER關(guān)鍵字均可省略。外連接包括:左外連接(LEFTOUTERJOIN):結(jié)果表中除了匹配行外,還包括左表有的但右表中不匹配的行,對于這樣的行,從右表被選擇的列設(shè)置為NULL。右外連接(RIGHTOUTERJOIN):結(jié)果表中除了匹配行外,還包括右表有的但左表中不匹配的行,對于這樣的行,從左表被選擇的列設(shè)置為NULL。自然連接(NATURALJOIN):自然連接還有自然左外連接(NATURALLEFTOUTERJOIN)和自然右外連接(NATURALRIGHTOUTERJOIN)。NATURALJOIN的語義定義與使用了ON條件的INNERJOIN相同。3.1.2數(shù)據(jù)來源:FROM子句【例3.22】查找所有學(xué)生情況及他們選修的課程號,若學(xué)生未選修任何課,也要包括其情況。selectxs.*,課程號fromxsleftouterjoinxs_kconxs.學(xué)號=xs_kc.學(xué)號;說明:本例結(jié)果中返回的行中有未選任何課程的學(xué)生信息,相應(yīng)行的課程號字段值為NULL?!纠?.23】查找被選修了的課程的選修情況和所有開設(shè)的課程名。selectxs_kc.*,課程名fromxs_kcrightjoinkconxs_kc.課程號=kc.課程號;結(jié)果顯示如下:3.1.2數(shù)據(jù)來源:FROM子句

【例3.24】使用自然連接查詢xscj數(shù)據(jù)庫中所有學(xué)生選過的課程名和課程號。。select課程名,課程號fromkc where課程號in (selectdistinct課程號fromkcnaturalrightouterjoinxs_kc);說明:SELECT語句中只選取一個用來連接表的列時,可以使用自然連接代替內(nèi)連接。用這種方法,可以用自然左外連接來替換左外連接,自然右外連接替換右外連接。3.1.2數(shù)據(jù)來源:FROM子句③交叉連接。指定了CROSSJOIN關(guān)鍵字的連接是交叉連接。在不包含連接條件時,交叉連接結(jié)果表是由第一個表的每行與第二個表的每一行拼接后形成的表,因此結(jié)果表的行數(shù)等于兩個表行數(shù)之積。在MySQL中,CROSSJOIN語法上與INNERJOIN等同,兩者可以互換。【例3.25】列出學(xué)生所有可能的選課情況。select學(xué)號,姓名,課程號,課程名fromxscrossjoinkc;另外,STRAIGHT_JOIN連接用法和INNERJOIN連接基本相同。不同的是,STRAIGHT_JOIN后不可以使用USING子句替代ON條件?!纠?.26】使用STRAIGHT_JOIN連接查找xscj數(shù)據(jù)庫中所有學(xué)生選過的課程名和課程號。selectdistinct課程名,xs_kc.課程號fromkcstraight_joinxs_kcon(kc.課程號=xs_kc.課程號);3.1.3查詢條件:WHERE子句基本格式為:WHERE條件<條件>=:表達(dá)式<比較運算符>表達(dá)式 /*比較運算*/|邏輯表達(dá)式<邏輯運算符>邏輯表達(dá)式|表達(dá)式[NOT]LIKE表達(dá)式[ESCAPE'esc字符'] /*LIKE運算符*/ |表達(dá)式[NOT][REGEXP|RLIKE]表達(dá)式 /*REGEXP運算符*/ |表達(dá)式[NOT]BETWEEN表達(dá)式AND表達(dá)式 /*指定范圍*/ |表達(dá)式IS[NOT]NULL /*是否空值判斷*/ |表達(dá)式[NOT]IN(子查詢|表達(dá)式[,…n]) /*IN子句*/ |表達(dá)式<比較運算符>{ALL|SOME|ANY}(子查詢) /*比較子查詢*/ |EXIST(子查詢) /*EXIST子查詢*/WHERE子句會根據(jù)條件對FROM子句一行一行地進(jìn)行判斷,當(dāng)條件為TRUE的時候,一行就被包含到WHERE子句的中間結(jié)果中。3.1.3查詢條件:WHERE子句1.比較運算比較運算符用于比較兩個表達(dá)式值,當(dāng)兩個表達(dá)式值均不為空值(NULL)時,比較運算返回邏輯值TRUE(真)或FALSE(假);而當(dāng)兩個表達(dá)式值中有一個為空值或都為空值時,將返回UNKNOWN。MySQL支持的比較運算符有:=(等于)、<(小于)、<=(小于等于)、>(大于)、>=(大于等于)、<=>(相等或都等于空)、<>(不等于)、!=(不等于)?!纠?.27】查詢xscj數(shù)據(jù)庫xs表中學(xué)號為081101的學(xué)生的情況。select姓名,學(xué)號,總學(xué)分

fromxswhere學(xué)號='081101';執(zhí)行結(jié)果如圖所示。3.1.3查詢條件:WHERE子句【例3.28】查詢xs表中總學(xué)分大于50分的學(xué)生的情況。select姓名,學(xué)號,出生日期,總學(xué)分fromxswhere總學(xué)分>50;執(zhí)行結(jié)果如下圖所示。MySQL有一個特殊的等于運算符“<=>”,當(dāng)兩個表達(dá)式彼此相等或都等于空值時,它的值為TRUE,其中有一個空值或都是非空值但不相等,這個條件就是FALSE。沒有UNKNOWN的情況。3.1.3查詢條件:WHERE子句【例3.29】查詢xs表中備注為空的同學(xué)的情況。select姓名,學(xué)號,出生日期,總學(xué)分fromxswhere備注<=>null;可以通過邏輯運算符(AND、OR、XOR和NOT)組成更為復(fù)雜的查詢條件。查詢xs表中專業(yè)為計算機(jī),性別為女(0)的同學(xué)的情況。select姓名,學(xué)號,性別,總學(xué)分

fromxswhere專業(yè)名='計算機(jī)'and性別=0;執(zhí)行結(jié)果如圖所示。3.1.3查詢條件:WHERE子句2.模式匹配(1)LIKE運算符LIKE運算符用于指出一個字符串是否與指定的字符串相匹配,其運算對象可以是char、varchar、text、datetime等類型的數(shù)據(jù),返回邏輯值TRUE或FALSE。LIKE謂詞表達(dá)式的格式為:表達(dá)式[NOT]LIKE表達(dá)式[ESCAPE'esc字符']使用LIKE進(jìn)行模式匹配時,常使用特殊符號_和%,可進(jìn)行模糊查詢。“%”代表0個或多個字符,“_”代表單個字符。由于MySQL默認(rèn)不區(qū)分大小寫,要區(qū)分大小寫時需要更換字符集的校對規(guī)則。【例3.30】查詢xscj數(shù)據(jù)庫xs表中姓“王”的學(xué)生學(xué)號、姓名及性別。select學(xué)號,姓名,性別

fromxswhere姓名like'王%';執(zhí)行結(jié)果如圖所示。3.1.3查詢條件:WHERE子句【例3.31】查詢xscj數(shù)據(jù)庫xs表中,學(xué)號倒數(shù)第二個數(shù)字為0的學(xué)生的學(xué)號、姓名及專業(yè)名。select學(xué)號,姓名,專業(yè)名

fromxswhere學(xué)號like'%0_';執(zhí)行結(jié)果如右圖所示。如果我們想要查找特殊符號中的一個或全部(_和%),必須使用一個轉(zhuǎn)義字符?!纠?.32】查詢xs表中名字包含下畫線的學(xué)生學(xué)號和姓名。select學(xué)號,姓名fromxswhere學(xué)號like'%#_%'escape'#';3.1.3查詢條件:WHERE子句(2)REGEXP運算符REGEXP運算符用來執(zhí)行更復(fù)雜的字符串比較運算。REGEXP是正則表達(dá)式的縮寫,但它不是SQL標(biāo)準(zhǔn)的一部分。REGEXP運算符的一個同義詞是RLIKE。語法格式:表達(dá)式[NOT][REGEXP|RLIKE]表達(dá)式REGEXP運算符特殊含義的符號見表3.2。特殊字符含

義特

符含

義^匹配字符串的開始部分[abc]匹配方括號里出現(xiàn)的字符串a(chǎn)bc$匹配字符串的結(jié)束部分[a-z]匹配方括號里出現(xiàn)的a~z之間的1個字符.匹配任何一個字符(包括回車和新行)[^a-z]匹配方括號里出現(xiàn)的不在a~z之間的1個字符*匹配星號之前的0個或多個字符任何序列|匹配符號左邊或右邊出現(xiàn)的字符串+匹配加號之前的1個或多個字符的任何序列[[..]]匹配方括號里出現(xiàn)的符號(如空格、換行、括號、句號、冒號、加號、連字符等)?匹配問號之前0個或多個字符[[:<:]和[[:>:]]匹配一個單詞的開始和結(jié)束{n}匹配括號前的內(nèi)容出現(xiàn)n次的序列[[::]匹配方括號里出現(xiàn)的字符中的任意一個字符()匹配括號里的內(nèi)容

3.1.3查詢條件:WHERE子句【例3.33】查詢姓李的同學(xué)的學(xué)號、姓名和專業(yè)名。select學(xué)號,姓名,專業(yè)名

fromxswhere姓名regexp'^李';執(zhí)行結(jié)果如圖所示?!纠?.34】查詢學(xué)號里包含4、5、6的學(xué)生學(xué)號、姓名和專業(yè)名。

select學(xué)號,姓名,專業(yè)名fromxswhere學(xué)號regexp'[4,5,6]';執(zhí)行結(jié)果如圖所示。3.1.3查詢條件:WHERE子句【例3.35】查詢學(xué)號以08開頭,以08結(jié)尾的學(xué)生學(xué)號、姓名和專業(yè)名。select學(xué)號,姓名,專業(yè)名

fromxswhere學(xué)號regexp'^08.*08$';執(zhí)行結(jié)果如圖所示。3.1.3查詢條件:WHERE子句3.范圍比較用于范圍比較的關(guān)鍵字有兩個:BETWEEN和IN??梢允褂肂ETWEEN關(guān)鍵字指出查詢范圍:表達(dá)式[NOT]BETWEEN表達(dá)式1AND表達(dá)式2當(dāng)不使用NOT時,若表達(dá)式的值在表達(dá)式1與2之間(包括這兩個值),則返回TRUE,否則返回FALSE;使用NOT時,返回值剛好相反。注意:表達(dá)式1的值不能大于表達(dá)式2的值。使用IN關(guān)鍵字可以指定一個值表,值表中列出所有可能的值。當(dāng)與值表中的任一個匹配時,即返回TRUE,否則返回FALSE。表達(dá)式IN(表達(dá)式[,…n])3.1.3查詢條件:WHERE子句【例3.36】查詢xscj數(shù)據(jù)庫xs表中不在1993年出生的學(xué)生情況。select學(xué)號,姓名,專業(yè)名,出生日期fromxswhere出生日期notbetween'1993-1-1'and'1993-12-31';執(zhí)行結(jié)果如下:3.1.3查詢條件:WHERE子句【例3.37】查詢xs表中專業(yè)名為“計算機(jī)”、“通信工程”或“無線電”的學(xué)生的情況。select*fromxswhere專業(yè)名in('計算機(jī)','通信工程','無線電');該語句與下句等價:select*fromxswhere專業(yè)名='計算機(jī)'or專業(yè)名='通信工程'or專業(yè)名='無線電';說明:IN關(guān)鍵字最主要的作用是表達(dá)子查詢。3.1.3查詢條件:WHERE子句4.空值比較當(dāng)需要判定一個表達(dá)式的值是否為空值時,使用ISNULL關(guān)鍵字,格式為:表達(dá)式IS[NOT]NULL當(dāng)不使用NOT時,若表達(dá)式表達(dá)式的值為空值,返回TRUE,否則返回FALSE;當(dāng)使用NOT時,結(jié)果剛好相反。【例3.38】查詢xscj數(shù)據(jù)庫中總學(xué)分尚不定的學(xué)生情況。select*fromxswhere總學(xué)分isnull;本例即查找總學(xué)分為空的學(xué)生,結(jié)果為空。3.1.3查詢條件:WHERE子句5.子查詢在查詢條件中,可以使用另一個查詢的結(jié)果作為條件的一部分。例如,判定列值是否與某個查詢的結(jié)果集中的值相等,作為查詢條件一部分的查詢稱為子查詢。SQL標(biāo)準(zhǔn)允許SELECT多層嵌套使用,用來表示復(fù)雜的查詢。(1)IN子查詢IN子查詢用于進(jìn)行一個給定值是否在子查詢結(jié)果集中的判斷,格式為:表達(dá)式[NOT]IN(子查詢)當(dāng)表達(dá)式與子查詢結(jié)果表中的某個值相等時,IN謂詞返回TRUE,否則返回FALSE;若使用了NOT,則返回的值剛好相反。3.1.3查詢條件:WHERE子句【例3.39】查找在xscj數(shù)據(jù)庫中選修了課程號為206的課程的學(xué)生的姓名、學(xué)號。

select姓名,學(xué)號 fromxs where學(xué)號in (select學(xué)號 fromxs_kc where課程號='206' );執(zhí)行結(jié)果如圖所示。3.1.3查詢條件:WHERE子句說明:在執(zhí)行包含子查詢的SELECT語句時,系統(tǒng)先執(zhí)行子查詢,產(chǎn)生一個結(jié)果表,再執(zhí)行外查詢。本例中,先執(zhí)行子查詢:select學(xué)號fromxs_kcwhere課程號='206';得到一個只含有學(xué)號列的表,xs_kc中的每個課程名列值為206的行在結(jié)果表中都有一行。再執(zhí)行外查詢,若xs表中某行的學(xué)號列值等于子查詢結(jié)果表中的任一個值,則該行就被選擇。注意:IN子查詢只能返回一列數(shù)據(jù)。對于較復(fù)雜的查詢,可使用嵌套的子查詢。3.1.3查詢條件:WHERE子句【例3.40】查找未選修離散數(shù)學(xué)的學(xué)生的姓名、學(xué)號、專業(yè)名。select姓名,學(xué)號,專業(yè)名 fromxs

where學(xué)號notin ( select學(xué)號 fromxs_kc where課程號in (select課程號 fromkc where課程名='離散數(shù)學(xué)' ) );執(zhí)行結(jié)果如圖所示。3.1.3查詢條件:WHERE子句(2)比較子查詢這種子查詢可以認(rèn)為是IN子查詢的擴(kuò)展,它使表達(dá)式的值與子查詢的結(jié)果進(jìn)行比較運算,格式為:表達(dá)式{

溫馨提示

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

評論

0/150

提交評論