版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第5章SQL語言本章要點(diǎn)SQL的語句結(jié)構(gòu)。CREATETABLE語句的語法。INSERT、UPDATE、DELETE語句的語法。SELECT數(shù)據(jù)查詢語句的語法。SELECT語句相關(guān)的子句。SELECT語句進(jìn)行簡單查詢、連接查詢和嵌套查詢。一、SQL概述SQL(StructuredQueryLanguage,結(jié)構(gòu)化查詢語言)是用戶操作關(guān)系數(shù)據(jù)庫的通用語言。SQL雖然叫結(jié)構(gòu)化查詢語言,而且查詢操作也確實(shí)是數(shù)據(jù)庫中的主要操作,但并不是說SQL語言只支持查詢操作,它實(shí)際上包含數(shù)據(jù)定義、數(shù)據(jù)操縱和數(shù)據(jù)控制等與數(shù)據(jù)庫有關(guān)的全部功能?,F(xiàn)在所有的關(guān)系數(shù)據(jù)庫管理系統(tǒng)都支持SQL,已經(jīng)成為關(guān)系數(shù)據(jù)庫的標(biāo)準(zhǔn)語言。最早1986年10月由美國ANSI公布。SQL-89標(biāo)準(zhǔn):1989年4月,ISO提出。SQL-92標(biāo)準(zhǔn):1992年8月ISO和ANSI公布。SQL-99標(biāo)準(zhǔn):SQL3。1、SQL語言的特點(diǎn)SQL語言集數(shù)據(jù)查詢、數(shù)據(jù)操縱、數(shù)據(jù)定義和數(shù)據(jù)控制功能于一身,其主要特點(diǎn)包括:一體化高度非過程化簡潔以多種方式使用一、SQL概述2、SQL語言的組成數(shù)據(jù)定義語言(DDL),實(shí)現(xiàn)定義、刪除和修改數(shù)據(jù)庫對象的功能。數(shù)據(jù)查詢語言(DQL),實(shí)現(xiàn)查詢數(shù)據(jù)的功能。數(shù)據(jù)操縱語言(DML)實(shí)現(xiàn)對數(shù)據(jù)庫數(shù)據(jù)的增加、刪除和修改功能。數(shù)據(jù)控制語言(DCL);實(shí)現(xiàn)控制用戶對數(shù)據(jù)庫的操作權(quán)限的功能。一、SQL概述常見SQL語句語句功能語句功能數(shù)據(jù)操作SELECT從數(shù)據(jù)庫表中檢索數(shù)據(jù)ALTERDOMAIN改變域定義INSERT向數(shù)據(jù)庫表中添加數(shù)據(jù)行DROPDOMAIN從數(shù)據(jù)庫中刪除域DELETE從數(shù)據(jù)庫表中刪除數(shù)據(jù)行數(shù)據(jù)控制UPDATE更新數(shù)據(jù)庫表中的數(shù)據(jù)GRANT授予用戶訪問權(quán)限數(shù)據(jù)定義DENY拒絕用戶訪問CREATETABLE創(chuàng)建一個數(shù)據(jù)庫表REVOKE解除用戶訪問權(quán)限D(zhuǎn)ROPTABLE從數(shù)據(jù)庫中刪除表事務(wù)控制ALTERTABLE修改數(shù)據(jù)庫表結(jié)構(gòu)COMMIT結(jié)束當(dāng)前事務(wù)CREATEVIEW創(chuàng)建一個視圖ROLLBACK回滾當(dāng)前事務(wù)DROPVIEW從數(shù)據(jù)庫中刪除視圖SAVETRANSACTION在事務(wù)內(nèi)設(shè)置保存點(diǎn)CREATEINDEX為數(shù)據(jù)庫表創(chuàng)建一個索引程序化SQLDROPINDEX從數(shù)據(jù)庫中刪除索引DECLARE設(shè)定游標(biāo)CREATEPROCEDURE創(chuàng)建一個存儲過程OPEN打開一個游標(biāo)DROPPROCEDURE從數(shù)據(jù)庫中刪除存儲過程FETCH檢索一行查詢結(jié)果CREATETRIGGER創(chuàng)建一個觸發(fā)器CLOSE關(guān)閉游標(biāo)DROPTRIGGER從數(shù)據(jù)庫中刪除觸發(fā)器PREPARE為動態(tài)執(zhí)行準(zhǔn)備SQL語句CREATEDOMAIN創(chuàng)建一個數(shù)據(jù)值域EXECUTE動態(tài)執(zhí)行SQL語句3、SQL語句的結(jié)構(gòu)每條SQL語句均由一個謂詞開始,該謂詞描述這條語句要產(chǎn)生的動作。SELECTvToyNameFROMToysWHEREmToyRate>30表名字段名謂詞常量一、SQL概述4、常用的SQL語句【例5-1】查詢所有玩具的玩具號和玩具名。SELECTcToyId,vToyNameFROMToys一、SQL概述該語句從Toys表中查詢數(shù)據(jù),查詢的字段(列)是cToyId、vToyName,查詢Toys表中的所有行。4、常用的SQL語句【例5-2】查詢玩具表的所有數(shù)據(jù)。SELECT*FROMToys一、SQL概述該語句從Toys表中查詢數(shù)據(jù),SELECT后面的“*”表示所有的字段(列),返回表中所有的行。4、常用的SQL語句例5-3:查詢玩具表中玩具價格大于30元的所有玩具,并按照升序排列。SELECTvToyName,mToyRateFROMToysWHEREmToyRate>30ORDERBYmToyRate一、SQL概述該語句從Toys表中查詢數(shù)據(jù),查詢的字段是vToyName、mToyRate,返回的是Toys表中滿足WHERE后面的條件“mToyRate>30”的行,對返回的結(jié)果按mToyRate字段升序排列。2010年10月第11頁4、注釋符與運(yùn)算符(1)注釋符(Annotation)“--”:SQLServer和MySQL中用于單行注釋;
“/**/”:“/*”用于注釋文字的開頭,“*/”用于注釋文字的結(jié)尾;“#”:在MySQL中用于單行注釋;一、SQL概述2010年10月第12頁(2)運(yùn)算符(Operator)
(1)算術(shù)運(yùn)算符算術(shù)運(yùn)算符包括:+?(加)、-?(減)、*?(乘)、/(除)、%?(取余)。(2)比較運(yùn)算符比較運(yùn)算符包括:>?(大于)、<?(小于)、=(等于)、>=?(大于等于)、<=?(小于等于)、<>?(不等于)、!=?(不等于)、ISNULL(是否為NULL)、ISNOTNULL(是否不為NULL)、LIKE(模糊匹配)。在MySQL中還有REGEXP(正則表達(dá)式匹配)、<=>(嚴(yán)格比較)。(3)邏輯運(yùn)算符邏輯運(yùn)算符包括:AND(與)、OR(或)、NOT(非)。在MySQL中還可以用:&&(與)、||(或)、!(非)。(4)位運(yùn)算符位運(yùn)算符包括:&?(按位與)、|?(按位或)、~(按位非)、^?(按位異或)。4、注釋符與運(yùn)算符一、SQL概述2010年10月第13頁SQL語言使用CREATETABLE語句定義基本表,其基本格式如下:CREATETABLE<表名>(<列名><數(shù)據(jù)類型>[列級完整性約束條件][[,<列名><數(shù)據(jù)類型>[列級完整性約束條件]]……[,<表級完整性約束條件>])1、基本表的定義二、數(shù)據(jù)定義語言(DDL)(1)創(chuàng)建數(shù)據(jù)表
2010年10月第14頁【例5-4】創(chuàng)建商標(biāo)信息表ToyBrand,代碼如下:CREATETABLEToyBrand( cBrandIdCHAR(3), cBrandNameCHAR(20)
)查看表是否創(chuàng)建成功可以執(zhí)行查詢命令:SELECT*FROMToyBrand1、基本表的定義二、數(shù)據(jù)定義語言(DDL)表1-6ToyBrand(商標(biāo))列(屬性)名中文名稱類型寬度說明cBrandId商標(biāo)編號char3主鍵cBrandName商標(biāo)名稱char20NOTNULL(1)創(chuàng)建數(shù)據(jù)表
二、數(shù)據(jù)定義語言(DDL)1、基本表的定義(1)創(chuàng)建數(shù)據(jù)表
列(屬性)名中文名稱類
型寬度說
明cToyId玩具IDCHAR6主鍵vToyName玩具名稱VARCHAR20NOTNULLvToyDescription玩具描述VARCHAR250
cCategoryId種類IDCHAR3外鍵
NOTNULLmToyRate玩具價格DECIMAL(10,2)NOTNULLcBrandId商標(biāo)IDCHAR3外鍵
NOTNULLvPhotoPath照片路徑VARCHAR1000
siToyQoh數(shù)量SMALLINT
NOTNULLsiLowerAge最低年齡SMALLINT
NOTNULLsiUpperAge最大年齡SMALLINT
NOTNULLsiToyWeight玩具重量FLOAT
NOTNULLvToyImgPath玩具圖像路徑VARCHAR50表1-7
Toys(玩具)【例5-5】
創(chuàng)建玩具表Toys。CREATETABLEToys( cToyId CHAR(6), vToyName VARCHAR(20), vToyDescription VARCHAR(250), cCategoryId CHAR(3), mToyRate DECIMAL(12,2), cBrandId CHAR(3), vPhotopath VARCHAR(1000), siToyQoh SMALLINT, siLowerAge SMALLINT, siUpperAge SMALLINT, siToyWeight FLOAT, vToyImgPath VARCHAR(50))二、數(shù)據(jù)定義語言(DDL)1、基本表的定義(1)創(chuàng)建數(shù)據(jù)表
SQL語句中的ALTERTABLE語句來修改字段數(shù)據(jù)類型、添加和刪除字段等。其一般格式為:ALTERTABLE<表名>[ADD[COLUMN]<新列名><數(shù)據(jù)類型>[完整性約束][ADD<表級完整性約束>][DROP[COLUMN]<列名>][DROPCONSTRAINT<完整性約束名>][ALTERCOLUMN<列名><數(shù)據(jù)類型>];二、數(shù)據(jù)定義語言(DDL)1、基本表的定義(2)修改數(shù)據(jù)表
【例5-6】在玩具表中添加一個進(jìn)貨時間列dStockTime。命令如下:ALTERTABLEToysADDdStockTimeDATETIME【例5-8】將玩具表中的進(jìn)貨時間列刪除。命令如下:ALTERTABLEToysDROPCOLUMNdStockTime二、數(shù)據(jù)定義語言(DDL)1、基本表的定義(2)修改數(shù)據(jù)表
【例5-7】將玩具表的玩具描述列的數(shù)據(jù)類型修改為varchar(1000)。SQLServer的命令如下:ALTERTABLEToysALTERCOLUMNvToyDescriptionVARCHAR(1000)MySQL的命令如下:ALTERTABLEToysMODIFYCOLUMNvToyDescriptionVARCHAR(1000)二、數(shù)據(jù)定義語言(DDL)1、基本表的定義(2)修改數(shù)據(jù)表
DROPTABLE命令可以刪除一個表和表中的數(shù)據(jù)及其與表有關(guān)的所有索引、觸發(fā)器、約束。語法如下:DROPTABLEtable_name注意:在刪除一個表之前要先刪除與此表相關(guān)聯(lián)的表中的外關(guān)鍵字約束。【例5-9】
刪除Toys表。DROPTABLEToys二、數(shù)據(jù)定義語言(DDL)1、基本表的定義(3)刪除數(shù)據(jù)表
實(shí)體完整性是通過在表中創(chuàng)建主鍵來實(shí)現(xiàn)的。主鍵值不能取空值并且不能重復(fù)。可以在CREATETABLE語句中用PRIMARYKEY定義主鍵。二、數(shù)據(jù)定義語言(DDL)2、數(shù)據(jù)庫完整性的定義
(1)實(shí)體完整性的定義
【例5-10】創(chuàng)建玩具商標(biāo)表ToyBrand,將商標(biāo)編號定義為主鍵。CREATETABLEToyBrand( cBrandIdCHAR(3)PRIMARYKEY,/*在列級定義主鍵*/
cBrandNameCHAR(20)NOTNULL )不能使用一個定義為TEXT或IMAGE數(shù)據(jù)類型的列創(chuàng)建主關(guān)鍵字。
或者
CREATETABLEToyBrand( cBrandIdCHAR(3), cBrandNameCHAR(20)NOTNULL,PRIMARYKEY(cBrandId)/*在表級定義主鍵*/)
或者CREATETABLEToyBrand( cBrandIdCHAR(3), cBrandNameCHAR(20)NOTNULL,CONSTRAINTpkBraIdPRIMARYKEY(cBrandId)/*在表級定義主鍵*/)二、數(shù)據(jù)定義語言(DDL)2、數(shù)據(jù)庫完整性的定義
(1)實(shí)體完整性的定義
二、數(shù)據(jù)定義語言(DDL)2、數(shù)據(jù)庫完整性的定義
(1)實(shí)體完整性的定義【例5-11】創(chuàng)建訂單細(xì)節(jié)表OrderDetail,將訂單編號和玩具ID定義為主鍵(復(fù)合主鍵)。CREATETABLEOrderDetail( cOrderNoCHAR(12), cToyIdCHAR(6), mToyRateMONEYNOTNULL, siQtySMALLINTNOTNULL, cIsGiftWrapCHAR(1), cWrapperIdCHAR(3), vMessageVARCHAR(256), mToyCostDECIMAL(12,2),
PRIMARYKEY(cOrderNo,cToyId)/*在表級定義主鍵*/ )如果數(shù)據(jù)表已經(jīng)存在但沒有定義主鍵,可以使用ALTERTABLE語句對表進(jìn)行修改,添加主鍵約束,但要求主鍵列設(shè)置了NOTNULL屬性,否則不能添加?!纠?-12】將訂單表的訂單編號設(shè)置為主鍵。ALTERTABLEOrdersADDCONSTRAINTpkOrderNoPRIMARYKEY(cOrderNo)或者ALTERTABLEOrdersADDPRIMARYKEY(cOrderNo)二、數(shù)據(jù)定義語言(DDL)2、數(shù)據(jù)庫完整性的定義
(1)實(shí)體完整性的定義如果表中存在數(shù)據(jù)并且cOrderNo列中有重復(fù)數(shù)據(jù),則以上語句會執(zhí)行失??;消除重復(fù)數(shù)據(jù)后可以創(chuàng)建成功。如果要刪除主鍵約束,同樣可以使用ALTERTABLE命令。SQLServer的語句如下:ALTERTABLEOrdersDROPCONSTRAINTpkOrderNoMySQL的語句如下:ALTERTABLEtoysDROPPRIMARYKEY二、數(shù)據(jù)定義語言(DDL)2、數(shù)據(jù)庫完整性的定義
(1)實(shí)體完整性的定義
當(dāng)向表中插入或修改數(shù)據(jù)時,系統(tǒng)要對實(shí)體完整性規(guī)則自動進(jìn)行檢查,包括:檢查主鍵值是否唯一,如果不唯一則拒絕插入或修改。檢查主鍵的每一個列是否為空,只要有一個為空就拒絕插入或修改。二、數(shù)據(jù)定義語言(DDL)2、數(shù)據(jù)庫完整性的定義
(1)實(shí)體完整性的定義
在關(guān)系數(shù)據(jù)庫中用外鍵來實(shí)現(xiàn)參照完整性??梢栽贑REATETABLE語句中用FOREIGNKEY定義哪些列為外鍵,用REFERENCES指明這些外鍵參照哪些表的主鍵。其語法格式如下:[CONSTRAINT<約束名>]FOREIGNKEY(<從表A中字段名>[{,<從表A中字段名>}])REFERENCES<主表B表名>(<主表B中字段名>[{,<主表B中字段名>})[ONDELETE{RESTRICT|CASCADE|SETNULL|NOACTION}][ONUPDATE{RESTRICT|CASCADE|SETNULL|NOACTION}]其中:RESTRICT:拒絕對主表B的刪除或更新操作。若有一個相關(guān)的外碼值在從表A中,則不允許刪除或更新B表中主要碼值。CASCADE:在主表B中刪除或更新時,會自動刪除或更新從表A中對應(yīng)的記錄。SETNULL:在主表B中刪除或更新時,將從表中對應(yīng)的外碼值設(shè)置為NULL。NOACTION:NOACTION和RESTRICT相同。二、數(shù)據(jù)定義語言(DDL)2、數(shù)據(jù)庫完整性的定義
(2)參照完整性的定義【例5-13】創(chuàng)建訂單細(xì)節(jié)表OrderDetail,并定義外鍵。CREATETABLEOrderDetail(cOrderNoCHAR(12)REFERENCESOrders(cOrderNo),/*在列級定義外鍵*/cToyIdCHAR(6),mToyRateMONEYNOTNULL,siQtySMALLINTNOTNULL,cIsGiftWrapCHAR(1),cWrapperIdCHAR(3),vMessageVARCHAR(256),mToyCostDECIMAL(10,2),PRIMARYKEY(cOrderNo,cToyId),/*在表級定義主鍵*/FOREIGNKEY(cToyId)REFERENCESToys(cToyId)/*在表級定義外鍵*/)二、數(shù)據(jù)定義語言(DDL)2、數(shù)據(jù)庫完整性的定義
(2)參照完整性的定義參照表的外鍵的數(shù)據(jù)類型和長度要求與被參照表的主鍵的數(shù)據(jù)類型和長度一致。要先創(chuàng)建主鍵表才能創(chuàng)建外鍵表,被參照的列必須是主鍵。外鍵值可以為空。如果數(shù)據(jù)表已經(jīng)存在但沒有建立外鍵,可以使用ALTERTABLE語句對表進(jìn)行修改,添加外鍵約束。【例5-14】
將訂單細(xì)節(jié)表的訂單編號和玩具ID設(shè)置為外鍵。ALTERTABLEOrderDetailADDCONSTRAINTfkOrderNoFOREIGNKEY(cOrderNo)REFERENCESOrders(cOrderNo);ALTERTABLEOrderDetailADDCONSTRAINTfkToyIdFOREIGNKEY(cToyId)REFERENCESToys(cToyId);或者ALTERTABLEOrderDetailADDFOREIGNKEY(cOrderNo)REFERENCESOrders(cOrderNo);ALTERTABLEOrderDetailADDFOREIGNKEY(cToyId)REFERENCESToys(cToyId);二、數(shù)據(jù)定義語言(DDL)2、數(shù)據(jù)庫完整性的定義(2)參照完整性的定義表5-2可能破壞參照完整性的情況及違約處理被參照表(主鍵表,例如訂單)動作方向參照表(外鍵表,例如訂單細(xì)節(jié))違約處理可能破壞參照完整性
插入記錄拒絕可能破壞參照完整性
修改外鍵值拒絕刪除記錄
可能破壞參照完整性拒絕/級聯(lián)刪除/設(shè)置為空值修改主鍵值
可能破壞參照完整性拒絕/級聯(lián)更新/設(shè)置為空值二、數(shù)據(jù)定義語言(DDL)2、數(shù)據(jù)庫完整性的定義(2)參照完整性的定義對被參照表和參照表進(jìn)行增、刪、改操作時要對數(shù)據(jù)庫的參照完整性進(jìn)行自動檢查;如果破壞了參照完整性,則作相應(yīng)的處理。處理規(guī)則如下表?!纠?-15】顯示說明參照完整性的違約處理策略示例。CREATETABLEOrderDetail(cOrderNoCHAR(12)REFERENCESOrders(cOrderNo)/*在列級定義參照完整性*/
ONDELETECASCADE/*當(dāng)刪除Orders表中的記錄時,級聯(lián)刪除OrderDetail表中相關(guān)聯(lián)的記錄*/ONUPDATECASCADE,/*當(dāng)更新Orders表中的cOrderNo時,級聯(lián)更新OrderDetail表中相關(guān)聯(lián)記錄的cOrderNo*/cToyIdCHAR(6),mToyRateMONEYNOTNULL,siQtySMALLINTNOTNULL,cIsGiftWrapCHAR(1),cWrapperIdCHAR(3),vMessageVARCHAR(256),mToyCostAS(mToyRate*siQty)PERSISTED,PRIMARYKEY(cOrderNo,cToyId),/*在表級定義主鍵*/FOREIGNKEY(cToyId)REFERENCESToys(cToyId)/*在表級定義參照完整性*/ONDELETENOACTION/*當(dāng)刪除Toys表中的數(shù)據(jù)時,如果OrderDetail表中存在相關(guān)聯(lián)的記錄,則拒絕刪除*/ONUPDATENOACTION/*當(dāng)更新Toys表中的cToyId時,如果OrderDetail表中存在相關(guān)聯(lián)的記錄,則拒絕更新*/)二、數(shù)據(jù)定義語言(DDL)2、數(shù)據(jù)庫完整性的定義(2)參照完整性定義域完整性確保了只有在某一合法范圍內(nèi)的值才能存儲到一列中。可以通過限制數(shù)據(jù)類型、值的范圍和數(shù)據(jù)格式來實(shí)施域完整性。可以通過默認(rèn)(DEFAULT)約束、檢查約束(CHECK)約束、非空(NOTNULL)約束、唯一(UNIQUE)約束來實(shí)施域完整性。二、數(shù)據(jù)定義語言(DDL)(3)域完整性的定義
2、數(shù)據(jù)庫完整性的定義①默認(rèn)約束默認(rèn)約束用于為表的某列指定一個默認(rèn)的數(shù)值。當(dāng)插入數(shù)據(jù)時,如果這個設(shè)置了默認(rèn)約束的列沒有給出值,就使用默認(rèn)約束中指定的值。一列上只能創(chuàng)建一個默認(rèn)約束,且該列不能是自動增長列?!纠?-16】在學(xué)生性別列上給出一個默認(rèn)值“男”。CREATETABLEStudent(SnoCHAR(10), SnameVARCHAR(50), SsexCHAR(2)DEFAULT'男',/*創(chuàng)建默認(rèn)約束,默認(rèn)值為“男”*/ SageINT, ClassVARCHAR(50))二、數(shù)據(jù)定義語言(DDL)(3)域完整性的定義2、數(shù)據(jù)庫完整性的定義
①默認(rèn)約束如果表已經(jīng)存在,但沒有指定缺省項,則可以用ALTERTABLE命令來指定缺省項。SQLServer的語句如下:ALTERTABLEStudentADDCONSTRAINTdefSexDEFAULT'男'FORSsexMySQL的語句如下:ALTERTABLEStudentMODIFYCOLUMNssexCHAR(2)DEFAULT'男'二、數(shù)據(jù)定義語言(DDL)(3)域完整性的定義
2、數(shù)據(jù)庫完整性的定義
①默認(rèn)約束如果要刪除約束,也可以用ALTERTABLE命令。SQLServer的語句如下:ALTERTABLEStudentDROPCONSTRAINTdefSexMySQL的語句如下:ALTERTABLEStudentMODIFYCOLUMNssexCHAR(2)二、數(shù)據(jù)定義語言(DDL)(3)域完整性的定義2、數(shù)據(jù)庫完整性的定義
①默認(rèn)約束默認(rèn)約束在某些情況下是十分有用的,特別是一些數(shù)值型列上。例如4個INT型列A、B、C、D,其中D?=?A?+?B?+?C,由于NULL與任何數(shù)進(jìn)行運(yùn)算都等于NULL,如果有一個列的值為NULL,則結(jié)果為NULL,這顯然是不正確的結(jié)果。因此,在這些列上設(shè)置默認(rèn)值“0”就能簡單地解決這個問題,不然要通過程序判斷是否為NULL才能進(jìn)行計算。二、數(shù)據(jù)定義語言(DDL)(3)域完整性的定義2、數(shù)據(jù)庫完整性的定義
②檢查約束檢查約束用于限定一個列的輸入內(nèi)容必須符合約束條件。可以在一列上定義多個檢查約束。它們按照定義的次序被實(shí)施。【例5-17】學(xué)生成績表中的成績必須大于等于0并且小于等于100。CREATETABLESC(SnoCHAR(10),CnoCHAR(3),GradeintCHECK(Grade>=0ANDGrade<=100)/*創(chuàng)建檢查約束*/)
或者CREATETABLESC(SnoCHAR(10),CnoCHAR(3),GradeintCHECK(GradeBETWEEN0AND100)/*創(chuàng)建檢查約束*/)二、數(shù)據(jù)定義語言(DDL)(3)域完整性的定義2、數(shù)據(jù)庫完整性的定義
【例5-18】
學(xué)生表中的性別只能取“男”和“女”。CREATETABLEStudent(SnoCHAR(10),SnameVARCHAR(50),SsexCHAR(2)CHECK(SsexIN('男','女')))二、數(shù)據(jù)定義語言(DDL)(3)域完整性的定義2、數(shù)據(jù)庫完整性的定義
②檢查約束如果表已經(jīng)存在,但沒有指定檢查約束,則可以用ALTERTABLE命令來修改表,添加檢查約束。ALTERTABLEStudentADDCONSTRAINTcons_sexCHECK(Ssexin('男','女'))如果要刪除約束,也可以用ALTERTABLE命令:ALTERTABLEStudentDROPCONSTRAINTcons_sex二、數(shù)據(jù)定義語言(DDL)(3)域完整性的定義2、數(shù)據(jù)庫完整性的定義
②檢查約束NULL:允許為空,表示沒有數(shù)據(jù),其值不是“0”,不是空白字符,更不是字符串“NULL”。NOTNULL:不允許為空,表示字段中不允許出現(xiàn)空值。如果一個字段必須填一個值,則此字段應(yīng)該設(shè)置不允許為空。二、數(shù)據(jù)定義語言(DDL)(3)域完整性的定義2、數(shù)據(jù)庫完整性的定義
③非空約束(NOTNULL)【例5-19】學(xué)生表中的姓名不能為空。語句如下:CREATETABLEStudent(
SnoCHAR(10)
PRIMARYKEY,
SnameVARCHAR(50)
NOTNULL,
SsexCHAR(2))唯一性約束指定一個或多個列的組合值具有唯一性,以防止在列中輸入重復(fù)的值。唯一性約束指定的列可以有NULL屬性,但NULL值也不能重復(fù)。由于主關(guān)鍵字值是具有唯一性的,因此主關(guān)鍵字列不能再設(shè)定唯一性約束。二、數(shù)據(jù)定義語言(DDL)(3)域完整性的定義2、數(shù)據(jù)庫完整性的定義
④唯一約束【例5-20】
在學(xué)生表的身份證列上創(chuàng)建一個唯一約束。CREATETABLEStudent(SnoCHAR(10), SnameVARCHAR(50), SsexCHAR(2), SageINT, IdenCHAR(18)UNIQUE,/*創(chuàng)建唯一約束*/ ClassVARCHAR(50))如果表已經(jīng)存在,但沒有指定唯一約束,則可以用ALTERTABLE命令來修改表,添加唯一約束,如下:ALTERTABLECountryADDCONSTRIANTunqCountryUNIQUE(cCountry)
如果要刪除約束,也可以用ALTERTABLE命令:ALTERTABLECountryDROPCONSTRAINTunqCountry二、數(shù)據(jù)定義語言(DDL)(3)域完整性的定義2、數(shù)據(jù)庫完整性的定義④唯一約束域完整性可以認(rèn)為是用戶自定義完整性的子集,通過上面說的默認(rèn)(DEFAULT)約束、檢查約束(CHECK)約束、非空(NOTNULL)約束、唯一(UNIQUE)約束也就實(shí)施了用戶自定義完整性。除此之外,如果要實(shí)現(xiàn)如“銷售價格大于等于進(jìn)貨價格”這樣的語義要求,可以使用觸發(fā)器。二、數(shù)據(jù)定義語言(DDL)(3)用戶自定義完整性的定義
2、數(shù)據(jù)庫完整性的定義
【例5-22】
創(chuàng)建玩具表,將玩具編號設(shè)置為主鍵,商標(biāo)編號設(shè)置為外鍵,玩具名稱要求具有唯一性,玩具價格設(shè)置默認(rèn)值為0,玩具價格必須大于等于0。CREATETABLEToys( cToyId CHAR(6)PRIMARYKEY,/*設(shè)置主鍵*/ vToyName VARCHAR(20)UNIQUE,/*設(shè)置唯一約束*/ vToyDescription VARCHAR(250), cCategoryId CHAR(3), mToyRate DECIMAL(10,2)DEFAULT0CHECK(mToyRate>=0),/*默認(rèn)值為0且必須大于等于0*/ cBrandId CHAR(3)REFERENCESToyBrand(cBrandId),/*設(shè)置外鍵*/ vPhotoPath VARCHAR(1000), siToyQoh SMALLINT, siLowerAge SMALLINT, siUpperAge SMALLINT, siToyWeight FLOAT, vToyImgPath VARCHAR(50))二、數(shù)據(jù)定義語言(DDL)2、數(shù)據(jù)庫完整性的定義
綜合例子三、數(shù)據(jù)操縱語言(DML)INSERT:插入數(shù)據(jù)UPDATE:修改數(shù)據(jù)(更新數(shù)據(jù))DELETE:刪除數(shù)據(jù)2010年10月第46頁1、數(shù)據(jù)的插入INSERT語句通常有兩種形式。一種是插入一條記錄;另一種是插入子查詢的結(jié)果。后者可以一次插入多條記錄?!纠?-23】
插入數(shù)據(jù)到商標(biāo)表中。命令如下:INSERTINTOToyBrandVALUES('009','商標(biāo)1')SQLServer和MySQL都允行一次性插入多行數(shù)據(jù),語句如下:INSERTINTOToyBrandVALUES('010','商標(biāo)2'),('011','商標(biāo)3')三、數(shù)據(jù)操縱語言(DML)(1)Insert語句可以將一行的部分?jǐn)?shù)據(jù)插入到表中,這些表的某些列允許為NULL或允許分配缺省值。INSERT子句列出了要插入數(shù)據(jù)的列,只有那些允許為NULL值或者有缺省值的列不需要被列出。VALUES子句提供了指定列的值。其語法如下: INSERT[INTO]表名[列列表] VALUES缺省值|值列表|select語句1、數(shù)據(jù)的插入三、數(shù)據(jù)操縱語言(DML)(1)Insert語句【例5-24】Sales表的結(jié)構(gòu)如表5-3所示。表5-3Sales表的結(jié)構(gòu)屬性名類型長度特性cItemCode字符4NOTNULLcItemName字符20NULLiQtySold整數(shù)NULLdSaleDate日期時間8NOTNULL1、數(shù)據(jù)的插入三、數(shù)據(jù)操縱語言(DML)(1)Insert語句INSERTINTOSalesVALUES('I005','Printer',100,'2024-2-11');INSERTINTOSales(cItemCode,cItemName,iQtySold,dSaleDate)VALUES('I005','Printer',100,'2024-2-11');INSERTINTOSales(cItemName,cItemCode,iQtySold,dSaleDate)VALUES('Printer','I005',100,'2024-2-11');INSERTINTOSalesVALUES('I005',NULL,100,'2024-2-11');插入時列dSaleDate使用已經(jīng)設(shè)置好的缺省值,可以使用如下語句:INSERTINTOSalesVALUES('I005','Printer',100,DEFAULT)提示:◆數(shù)值的個數(shù)必須和表中或列列表中的屬性個數(shù)相同?!舨迦胄畔⒌拇涡虮仨毢筒迦肓斜碇辛谐龅膶傩源涡蛳嗤!?/p>
信息的數(shù)據(jù)類型必須和表列中的數(shù)據(jù)類型匹配。◆
當(dāng)插入二進(jìn)制類型的數(shù)據(jù)時,其尾部的“0”將被去掉?!?/p>
當(dāng)插入VARCHAR或TEXT類型的數(shù)據(jù)時,其后的空格將被去掉;如果插入一個只含空格的字符串,則會被認(rèn)為插入了一個長度為零的字符串?!?/p>
標(biāo)識列或自動增長列不能指定數(shù)據(jù),在VALUES列表中應(yīng)跳過此列?!?/p>
對字符類型的列,當(dāng)插入數(shù)據(jù),特別是插入字符串中含有數(shù)字字符以外的字符時,最好用引號將其括起來,否則容易出錯。1、數(shù)據(jù)的插入三、數(shù)據(jù)操縱語言(DML)(1)Insert語句
在SQLServer中可以使用SELECTINTO命令將一個表的內(nèi)容復(fù)制到另一個新表中(數(shù)據(jù)庫中不存在)。用SELECTINTO語句創(chuàng)建一個新表,并用SELECT的結(jié)果集填充該表。其語法如下:
SELECT列列表
INTO新表名
FROM表名
WHERE條件1、數(shù)據(jù)的插入三、數(shù)據(jù)操縱語言(DML)(2)SELECTINTO語句在MySQL中,可以使用“CREATETABLE...ASSELECT”命令創(chuàng)建一個新表并將數(shù)據(jù)復(fù)制到新表中。
在SQLServer中可以使用SELECTINTO命令將一個表的內(nèi)容復(fù)制到另一個新表中(數(shù)據(jù)庫中不存在)。用SELECTINTO語句創(chuàng)建一個新表,并用SELECT的結(jié)果集填充該表。其語法如下:
SELECT列列表
INTO新表名
FROM表名
WHERE條件1、數(shù)據(jù)的插入三、數(shù)據(jù)操縱語言(DML)(2)SELECTINTO語句在MySQL中,可以使用“CREATETABLE...ASSELECT”命令創(chuàng)建一個新表并將數(shù)據(jù)復(fù)制到新表中。1、數(shù)據(jù)的插入三、數(shù)據(jù)操縱語言(DML)(2)SELECTINTO語句【例5-25】根據(jù)Toys表創(chuàng)建一個叫NewToys的新表,將玩具價格大于等于30的數(shù)據(jù)插入到新表中。SQLServer的命令是:SELECT*INTO
newtoysFROM
ToysWHERE
mToyRate
>=
30MySQL的命令是:CREATETABLEnewtoysASSELECT*FROMToysWHEREmToyRate>=30可以使用INSERTINTO命令,從一個表向另一個已經(jīng)存在的表添加數(shù)據(jù)。語法如下:INSERT[INTO]表名1SELECT列名)FROM表名2[WHERE條件]1、數(shù)據(jù)的插入三、數(shù)據(jù)操縱語言(DML)(3)INSERT…SELECT語句
【例5-26】
將表Toys表中玩具價格大于20且小于30的數(shù)據(jù)插入到newtoys表中。INSERTINTOnewtoysSELECT*FROMToysWHEREmToyRate>20ANDmToyRate<30這條語句要求newtoys的表結(jié)構(gòu)與toys的表結(jié)構(gòu)一致。如果表結(jié)構(gòu)不一致,可以指定要求插入的列和數(shù)據(jù)的來源列,并讓他們一一對應(yīng),語句如下:INSERTINTOnewtoys(cToyid,vToyName,mToyRate,siToyQoh,siLowerAge,siUpperAge)SELECTcToyid,vToyName,mToyRate,siToyQoh,siLowerAge,siUpperAgeFROMToysWHEREmToyRate>20ANDmToyRate<301、數(shù)據(jù)的插入三、數(shù)據(jù)操縱語言(DML)(3)INSERT…SELECT語句
SQL提供了UPDATE語句來進(jìn)行數(shù)據(jù)修改。一行中的一欄是更新的最小單元。數(shù)據(jù)更新的語法如下:2、數(shù)據(jù)的更新三、數(shù)據(jù)操縱語言(DML)UPDATE表名SET列名=值[,列名=值][WHERE條件]表5-4商品商品編號商品名稱價格數(shù)量I001Monitor5000100I002Keyboards3000200I003Mouse150050【例5-27】更新商品編號為?'I003'?的物品的數(shù)量,將它改為80。UPDATE商品SET數(shù)量=80WHERE商品編號?=?'I003'【例5-28】
將所有商品的價格增加5%。UPDATE商品SET價格=價格*1.05【例5-29】
將商品編號為I001的商品的價格改為5500,數(shù)量改為150。UPDATE商品SET價格=5500,數(shù)量=150WHERE商品編號='I001'提示:◆
同一時刻只能對一張表進(jìn)行更新?!?/p>
如果一次更新違背了完整性約束,則所有的更新都將被回滾;也就是說,表沒有發(fā)生任何變化?!?/p>
使用UPDATE更新數(shù)據(jù)時,會將被更新的原數(shù)據(jù)存放到事務(wù)處理日志中。如果所更新的表特別大,則有可能在命令尚未執(zhí)行完時,就將事務(wù)處理日志填滿了。這時會生成錯誤信息,并將更新過的數(shù)據(jù)返回原樣。解決此問題有兩種辦法:一種是加大事務(wù)處理日志的存儲空間,但這似乎不大合算;另一種是分解更新語句的操作過程,并及時清理事務(wù)處理日志。2、數(shù)據(jù)的更新三、數(shù)據(jù)操縱語言(DML)數(shù)據(jù)庫中執(zhí)行刪除操作的最小單元是行,SQL語言中通過DELETE語句刪除數(shù)據(jù),其基本語法格式如下:DELETE[FROM]<表名>[WHERE<條件>]各參數(shù)說明如下:
表名:指定要刪除行的表的名字。
條件:指定了要刪除的行應(yīng)符合的條件,如果沒有指定條件則刪除表中全部行。3、數(shù)據(jù)的刪除三、數(shù)據(jù)操縱語言(DML)【例5-30】從商品表中刪除商品編號為‘I002’的商品。DELETEFROM商品
WHERE商品編號
='I002'【例5-31】刪除玩具(Toys)表中所有的記錄:
DELETEFROMToys如果要刪除表中的所有數(shù)據(jù),那么使用TRUNCATETABLE命令比用DELETE命令快得多。因?yàn)镈ELETE命令除了刪除數(shù)據(jù)外,還會對所刪除的數(shù)據(jù)在事務(wù)處理日志中作記錄,以防止刪除失敗時可以使用事務(wù)處理日志來恢復(fù)數(shù)據(jù);而TRUNCATETABLE則只做刪除與表有關(guān)的所有數(shù)據(jù)頁的操作。TRUNCATETABLE命令功能上相當(dāng)于使用不帶WHERE子句的DELETE命令。但是TRUNCATETABLE命令不能用于被別的表的外關(guān)鍵字依賴的表。TRUNCATETABLE命令語法如下:
TRUNCATETABLEtable_name
注意:由于TRUNCATETABLE命令不會對事務(wù)處理日志進(jìn)行數(shù)據(jù)刪除記錄操作,因此不能激活觸發(fā)器。3、數(shù)據(jù)的刪除三、數(shù)據(jù)操縱語言(DML)查詢語句SELECT在SQLServer中使用頻率最高的語句,可以說SELECT語句是SQL語言的靈魂,SELECT語句具有強(qiáng)大的查詢功能,由一系列靈活的子句組成,這些子句共同確定檢索哪些數(shù)據(jù)。四、數(shù)據(jù)查詢語言(DQL)1、SELECT語句的語法結(jié)構(gòu)及其順序主要子句可歸納如下:
SELECTselect_list /*選擇列表*/ FROMtable_source /*選擇數(shù)據(jù)源*/ [WHEREsearch_condition] /*根據(jù)什么條件*/ [GROUPBYgroup_by_expression]/*分組依據(jù)表達(dá)式*/ [HAVINGsearch_condition] /*分組選擇條件*/ [ORDERBYorder_expression[ASC|DESC]]/*排序依據(jù)表達(dá)式*/四、數(shù)據(jù)查詢語言(DQL)在這幾個子句中,SELECT子句和FROM子句是必需的,其他子句是可選的。還有,如果同時出現(xiàn)幾個子句,它們是有順序的。順序就是按照上面的順序,不能亂序。2、簡單查詢語句(1)查詢所有行和所有列用SELECT子句檢索單個表中所有的列和行的語法是:
SELECT*FROM表名提示:你可以用星號(*)來指定所有列?!纠?-32】
顯示數(shù)據(jù)庫ToyUniverse的表Toys中所有的數(shù)據(jù)。USEToyUniverse--使用ToyUniverse數(shù)據(jù)庫,后面沒有此句都代表該數(shù)據(jù)庫
SELECT*FROMToys注意:在使用“*”通配符時要慎重,一般很少情況用到要查詢所有行和列的數(shù)據(jù),以免占用過多的系統(tǒng)資源和網(wǎng)絡(luò)資源。
四、數(shù)據(jù)查詢語言(DQL)(2)顯示一張表上指定列的所有數(shù)據(jù)從單個表中檢索指定列、所有行的SELECT子句的語法是:
SELECT列名[,列名]…FROM表名提示:列名也可以是經(jīng)過計算的值。包括幾個列的組合。例5-33:現(xiàn)在需要一張包含所有接受者(Recipient)的姓名、城市、電話號碼的報表。SELECTvFirstName,vLastName,cCity,cPhoneFROMRecipient注意:在指定列的查詢中,結(jié)果集顯示的順序是由SELECT子句中select_list指定,與數(shù)據(jù)表中的存儲順序無關(guān)。多列時用“,”隔開即可。2、簡單查詢語句四、數(shù)據(jù)查詢語言(DQL)(3)顯示指定的、帶用戶友好的列標(biāo)題的列
有時,帶屬性名的輸出結(jié)果對用戶來講,不一定是友好的。為了使輸出更加友好,可以在查詢中指定自己的列標(biāo)題,即給列取一個別名。其語法如下:
方法1:SELECT列名AS列標(biāo)題[,列名…]FROM表名
方法2:SELECT列名列標(biāo)題[,列名…]FROM表名2、簡單查詢語句四、數(shù)據(jù)查詢語言(DQL)【例5-34】
現(xiàn)在需要一張包含所有購物者(Shopper)姓名、城市、電話號碼的報表。SELECTvShopperNameas姓名,vCityas城市,cPhoneas電話FROMShopper或者:SELECTvShopperName姓名,vCity城市,cPhone電話FROMShopper2、簡單查詢語句四、數(shù)據(jù)查詢語言(DQL)(4)選擇結(jié)果中帶運(yùn)算的列在數(shù)據(jù)查詢時,經(jīng)常需要對表中的列進(jìn)行計算,才能獲得所需要的結(jié)果。在SELECT子句中可以使用各種運(yùn)算符和函數(shù)對指定列進(jìn)行運(yùn)算?!纠?-35】現(xiàn)在需要一張包含所有購物者(Shopper)姓名、城市、電話號碼、信用卡年份的報表。SELECTvShopperNameAS姓名,vCityAS城市,cPhoneAS電話,CAST(YEAR(dExpiryDate)ASCHAR(4))AS信用卡年份FROMShopper2、簡單查詢語句四、數(shù)據(jù)查詢語言(DQL)信用卡年份使用了CAST和YEAR兩個函數(shù)進(jìn)行運(yùn)算,先取日期時間數(shù)據(jù)類型列dExpiryDate中的年份值,然后將其轉(zhuǎn)換為字符型?!纠?-36】
顯示玩具的原價和8.5折后的價格。SELECTctoyidAS玩具編號,vToyNameAS玩具名稱,mToyRateAS原價,mToyRate*0.85AS折扣價FROMtoys2、簡單查詢語句四、數(shù)據(jù)查詢語言(DQL)(5)結(jié)果集中去掉重復(fù)的值使用DISTINCT關(guān)鍵字可以從結(jié)果集中刪除重復(fù)的行,使結(jié)果集更簡潔。用SELECT子句在一張表中檢索一列的唯一值的語法是:
SELECTDISTINCT
列名FROM表名【例5-37】
顯示購物者所在的城市,去掉重復(fù)的城市。SELECTDISTINCTvCityFROMShopper2、簡單查詢語句四、數(shù)據(jù)查詢語言(DQL)Shopper表運(yùn)行結(jié)果(6)返回部分結(jié)果集
有時一個表中的數(shù)據(jù)過多,如果一次全部傳到客戶端顯示,會浪費(fèi)網(wǎng)絡(luò)資源,有時候只要檢索排好序的頂部幾條記錄即可。在SQLServer中,檢索頂部幾條記錄的SELECT子句的語法為:SELECT[TOPn[PERCENT]]列名[,列名…]FROM表名
這里,n是一個數(shù)字。若使用PERCENT關(guān)鍵字,則返回總行數(shù)的百分之n(行)。TOP子句限制了結(jié)果集中返回的行數(shù)。在MySQL中,使用LIMIT子句來限制查詢結(jié)果的記錄數(shù)量,其語法格式為:LIMIT[OFFSET,]row_count|row_countOFFSEToffsetOFFSET是非負(fù)整型常量,用于指定查詢結(jié)果的第一行的偏移量,默認(rèn)為0,表示查詢結(jié)果的第1行,以此類推,OFFSET的值為1時,表示查詢結(jié)果的第2行。row_count是非負(fù)整型常量,用來指定查詢結(jié)果的行數(shù),如果row_count的值大于實(shí)際查詢結(jié)果的行數(shù),則返回實(shí)際行數(shù)。row_countOFFSET后面的offset也是非負(fù)整型常量,row_countOFFSEToffset表示查詢結(jié)果從offset+1行開始,返回row_count行。2、簡單查詢語句四、數(shù)據(jù)查詢語言(DQL)【例5-38】顯示前5個玩具的玩具代碼和玩具名。2、簡單查詢語句四、數(shù)據(jù)查詢語言(DQL)SQLServer的命令如下:
SELECTTOP5cToyId,vToyNameFROMToysMySQL的命令如下:SELECTcToyId,vToyNameFROMToysLIMIT5【例5-39】MySQL中,顯示玩具表中的第11行至第15行數(shù)據(jù)。SELECT*
FROMToysLIMIT10,5(7)合并查詢結(jié)果集要將不同查詢的輸出結(jié)果合并成單一的結(jié)果集。語法:SELECT列名[,列名…]FROM表名UNION[ALL]SELECT列名[,列名…]FROM表名注意:結(jié)果集的列標(biāo)題是第一個SELECT語句的列標(biāo)題。后續(xù)的SELECT語句中的所有列必須具有同第一個SELECT語句中的列相似的數(shù)據(jù)類型,而且列數(shù)也必須相似。缺省情況下,UNION子句將移去重復(fù)行。如果使用了ALL,這些重復(fù)行也將顯示。2、簡單查詢語句四、數(shù)據(jù)查詢語言(DQL)【例5-40】
顯示購物者和接收者的姓名、地址和城市,并顯示一個區(qū)分購物者和接收者的列。SELECTvShopperName,vAddress,vCity,'購物者'astypeFROMShopperUNIONSELECTvRecipientName,vAddress,vCity,'接收者'astypeFROMRecipient2、簡單查詢語句四、數(shù)據(jù)查詢語言(DQL)3、用條件來篩選表中指定的行一個數(shù)據(jù)表中通常存放大量的記錄數(shù)據(jù)。實(shí)際使用時,絕大部分查詢不是針對所有數(shù)據(jù)記錄的查詢,往往只需要其中滿足要求的部分記錄數(shù)據(jù)。這時就需要用到WHERE條件子句。(1)按指定的條件檢索數(shù)據(jù)SELECT選擇列表FROM表名WHERE條件WHERE子句中的條件表達(dá)式包括算術(shù)表達(dá)式和邏輯表達(dá)式使用比較運(yùn)算符時,應(yīng)考慮以下幾點(diǎn):(1)表達(dá)式中可以包含常數(shù)、列名、函數(shù)和通過算術(shù)運(yùn)算符連接的嵌套查詢。(2)確保在所有的char、varchar、text、datetime和smalldatetime類型的數(shù)據(jù)周圍添加單引號。四、數(shù)據(jù)查詢語言(DQL)3、用條件來篩選表中指定的行【例5-41】現(xiàn)在需要一張家住在成都的購物者的姓名、城市、電話號碼的報表。SELECTvShopperNameas姓名,vCityas城市,cPhoneas電話FROMShopperWHEREvCity='成都'注意:where子句中不能使用列的別名四、數(shù)據(jù)查詢語言(DQL)(2)根據(jù)多重條件,用SELECT子句檢索并顯示數(shù)據(jù)用SELECT子句檢索并顯示數(shù)據(jù)的語法如下:SELECT選擇列表FROM表名WHERE[NOT]條件{AND|OR}[NOT]條件可以用邏輯運(yùn)算符AND和OR在WHERE子句中連接兩個或多個搜索條件。需要所有的條件都滿足時用AND;需要滿足任何一個條件時用OR;NOT否定跟在其后的表達(dá)式。當(dāng)在一句語句中使用多個邏輯運(yùn)算符時,處理順序是NOT在先,然后是AND,最后是OR。括號可以用來改變處理順序,也使得表達(dá)式的可讀性更強(qiáng)。3、用條件來篩選表中指定的行四、數(shù)據(jù)查詢語言(DQL)【例5-42】顯示價格范圍在50到100之間的所有玩具的列表。SELECTcToyId,vToyName,mToyRate,siToyQohFROMToysWHEREmToyRate>=50ANDmToyRate<=100
四、數(shù)據(jù)查詢語言(DQL)3、用條件來篩選表中指定的行【例5-43】顯示屬于省份為“四川”和“北京”的購物者的姓名、e-mail地址和省份。SELECTvShopperName,vEmailId,vProvinceFROMShopperWHEREvProvince='四川'orvProvince='北京'四、數(shù)據(jù)查詢語言(DQL)3、用條件來篩選表中指定的行(3)限定數(shù)據(jù)范圍(BETWEEN關(guān)鍵字)在WHERE子句中,使用BETWEEN關(guān)鍵字可以方便地限制查詢數(shù)據(jù)的范圍,和含有”>”and“<”的邏輯表達(dá)式的效果相同。
【例5-44】顯示價格范圍在50到100之間的所有玩具的列表。
SELECTcToyId,vToyName,mToyRate,siToyQohFROMToys
WHERE
mToyRateBETWEEN50AND100四、數(shù)據(jù)查詢語言(DQL)3、用條件來篩選表中指定的行(4)用IN關(guān)鍵字來限定范圍檢索對于要搜索的值不是連續(xù)的,而是離散的,這時候可以用IN關(guān)鍵字來限制檢索數(shù)據(jù)范圍,靈活使用IN關(guān)鍵字,可以使復(fù)雜的語句簡單化?!纠?-45】顯示屬于“四川”和“北京”的購物者的名字、姓和e-mail地址。SELECTvShopperName,vProvince,vEmailIdFROMShopperWHEREvProvinceIN('四川','北京') 四、數(shù)據(jù)查詢語言(DQL)3、用條件來篩選表中指定的行(5)ISNULL和ISNOTNULL關(guān)鍵字用SELECT語句檢索并顯示指定列的值為NULL的那些行的數(shù)據(jù),語法是:SELECT選擇列表FROM表名WHERE列名IS[NOT]NULL【例5-46】顯示沒有任何附加信息的訂貨的全部信息。
SELECT*FROMOrderDetailWHEREvMessageisNULL注意:NULL與任何數(shù)計算等于NULL,NULL與任何數(shù)比較等于FALSE,因此,不能寫成“vMessage=NULL”四、數(shù)據(jù)查詢語言(DQL)3、用條件來篩選表中指定的行(6)模糊查詢
表5-5模糊查詢的通配符通配符說明%包含零個或多個字符的任意字符串。_(underscore)任意單個字符。[]任意在指定范圍或集合中的單個字符。[^]任意不在指定范圍或集合中的單個字符。四、數(shù)據(jù)查詢語言(DQL)3、用條件來篩選表中指定的行查詢時,如果不知道完全精確的值,可以使用LIKE或NOTLIKE進(jìn)行模糊查詢,LIKE定義的一般格式為:<字段名>LIKE<字符串常量>其中,字段名必須為字符型,字符串常量中的字符可以包含通配符,利用這些通配符,可以進(jìn)行模糊查詢。表達(dá)式返回值LIKE‘LO%’所有以“LO”開頭的名字。LIKE‘Lo%’所有以“Lo”開頭的名字。LIKE‘%ion’所有以“ion”結(jié)尾的名字。LIKE‘%rt%’所有包含字母“rt”的名字。LIKE‘_rt’所有以“rt”結(jié)尾的三個字母的名字。LIKE‘[DK]%’所有以“D”或“K”開頭的名字。LIKE‘[A-D]ear’所有以“A”到“D”中任意一個字母開頭,以“ear”結(jié)尾的四個字母的名字。LIKE‘D[^c]%’所有以“D”開頭、第二個字母不為“c”的名字。四、數(shù)據(jù)查詢語言(DQL)3、用條件來篩選表中指定的行例如:【例5-47】顯示所有姓“張”的購物者。SELECTcShopperId,vUserName,vPassword,vShopperNameFROMShopperWHEREvShopperNamelike'張%'四、數(shù)據(jù)查詢語言(DQL)3、用條件來篩選表中指定的行【例5-48】顯示玩具名稱中含有“機(jī)”的玩具。SELECT*FROMtoysWHEREvToyNameLIKE'%機(jī)%'若要搜索作為字符而不是通配符的百分號,則必須用ESCAPE關(guān)鍵字作為轉(zhuǎn)義符來使用。例如:LIKE'%B%'ESCAPE'B'就表示第二個百分號(%)是時間的字符值不是通配符。4、按指定順序顯示數(shù)據(jù)(排序)
用SELECT子句按給定順序檢索并顯示數(shù)據(jù)的語法如下:SELECT選擇列表FROM表名[ORDERBY列名|選擇的列的序號|表達(dá)式[ASC|DESC][,列名|選擇的列的序號|表達(dá)式[ASC|DESC]…]注意:在ORDERBY子句中,可以用相關(guān)列的序號來代替列名。ASC是缺省的排序方式。四、數(shù)據(jù)查詢語言(DQL)【例5-49】顯示所有玩具的名字和價格。確保價格最高的玩具顯示在列表的頂部。SELECTvToyNameas'ToyName',mToyRateas'ToyRate'FROMToysORDERBYmToyRatedesc或者:SELECTvToyNameas'ToyName',mToyRateas'ToyRate'FROMToysORDERBY2desc–此處的2表示顯示的第二列(mToyRate)
4、按指定順序顯示數(shù)據(jù)(排序)
四、數(shù)據(jù)查詢語言(DQL)【例5-50】
顯示訂單的訂單號、訂單時間、購物者編號,按訂單時間降序、購物者編號升序排列。SELECTcOrderNo,dOrderDate,cShopperIdFROMOrdersORDERBYdOrderDateDESC,cShopperIdASC按多個列排序時,在前一個排序列的值相同時,按下一個列的排序規(guī)則排列。空值視為最小的值。4、按指定順序顯示數(shù)據(jù)(排序)
四、數(shù)據(jù)查詢語言(DQL)聚合函數(shù)經(jīng)常與SELECT語句的GROUPBY子句一起使用。它可以對一組執(zhí)行計算,并返回單個值。5、使用函數(shù)查詢四、數(shù)據(jù)查詢語言(DQL)(1)聚合函數(shù)函數(shù)名參
數(shù)描
述AVG([ALL|DISTINCT]expression)數(shù)學(xué)表達(dá)式中指定字段的均值,或者計算所有記錄,或分別計算該字段上值不同的記錄COUNT([ALL|DISTINCT]expression)表達(dá)式中指定字段上記錄的個數(shù),或者是所有記錄,或者是該字段上值不同的記錄COUNT(*)選中的行數(shù)MAX(expression)表達(dá)式中的最大值MIN(expression)表達(dá)式中的最小值SUM([ALL|DISTINCT]expression)數(shù)學(xué)表達(dá)式中指定字段的總和?;蛘哂嬎闼杏涗?,或分別計算該字段上值不同的記錄STEDV([ALL|DISTINCT]expression)返回指定表達(dá)式中所有值的標(biāo)準(zhǔn)偏差【例5-51】訂單表中的數(shù)據(jù)如下圖所示。5、使用函數(shù)查詢四、數(shù)據(jù)查詢語言(DQL)(1)聚合函數(shù)求訂單數(shù)量、所有訂單總金額、平均金額、最高金額、最低金額。SELECTCOUNT(*),SUM(mTotalCost),AVG(mTotalCost),MAX(mTotalCost),MIN(mTotalCost)FROMOrders【例5-52】查詢學(xué)號為“2023019001”的學(xué)生的總分和平均分。SELECTSUM(score),AVG(score)FROMSCWHEREsno='2023019001';5、使用函數(shù)查詢四、數(shù)據(jù)查詢語言(DQL)(1)聚合函數(shù)日期函數(shù)用于操作日期時間數(shù)據(jù)類型的值、完成算術(shù)運(yùn)算、并析取其中的組成部分,如:日、月、年。它們用于加、減兩個日期,或?qū)⑷掌诜殖蓭讉€部分。5、使用函數(shù)查詢四、數(shù)據(jù)查詢語言(DQL)(2)日期函數(shù)表5-7
SQLServer的日期函數(shù)函數(shù)名語
法說
明DATEADD(日期元素,數(shù)字,日期)向指定日期添加“數(shù)字”個“日期元素”DATEDIFF(日期元素,日期1,日期2)返回兩個日期之間的“日期元素”的個數(shù)DATENAME(日期元素,日期)以ASCII碼的形式返回指定日期的“日期元素”(例如,October)DATEPART(日期元素,日期)以整數(shù)的形式返回指定日期的“日期元素”DAY(日期)返回一個整數(shù),表示指定日期的“天”部分MONTH(日期)返回一個整數(shù),表示指定日期的“月”部分YEAR(日期)返回一個整數(shù),表示指定日期的“年”部分GETDATE()返回當(dāng)前的日期和時間GETUTCDATE()返回當(dāng)前的UTC(國際時也稱格林尼治標(biāo)準(zhǔn)時間)日期和時間表5-8
日期元素日期元素縮寫值yearyy1753~9999quarterqq1~4monthmm1~12dayofyeardy1~366daydd1~31weekwk0~51weekdaydw1~7(1isSunday)hourhh(0~23)minutemi(0~59)secondss0~59millisecondms0~9995、使用函數(shù)查詢四、數(shù)據(jù)查詢語言(DQL)(2)日期函數(shù)表5-9
MySQL日期時間函數(shù)函數(shù)名稱語法說明NOW()NOW()返回系統(tǒng)當(dāng)前的日期和時間SYSDATE()SYSDATE()返回函數(shù)執(zhí)行時的日期和時間YEAR()YEARWEEK(date),YEARWEEK(date,mode)
返回date的年份MONTH()MONTH(date)返回date的月份(1-12)DAY()DAYOFMONTH(date)返回date的日期(1-31)ADDDATE()ADDDATE(date,INTERVALexprunit),ADDDATE(expr,days)
向date添加時間間隔值或添加天數(shù)。SUBDATE()SUBDATE(date,INTERVALexprunit),SUBDATE(expr,days)
從date減去時間間隔值或減去天數(shù)。DATEDIFF()DATEDIFF(expr1,expr2)返回兩個日期的天數(shù)差TIMEDIFF()TIMEDIFF(expr1,expr2)返回兩個時間的時間差TIMESTAMPDIFF()TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)返回兩個日期時間表達(dá)式之間的差值【例5-53】
已知學(xué)生表student的數(shù)據(jù)如圖5-22所示,查詢學(xué)生表的數(shù)據(jù),并顯示年齡。5、使用函數(shù)查詢四、數(shù)據(jù)查詢語言(DQL)(2)日期函數(shù)圖5-22
s
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 渠道改造合同范本
- 苗木訂購協(xié)議書
- 融資出租協(xié)議書
- 視頻購置協(xié)議書
- 設(shè)備出讓協(xié)議書
- 設(shè)施用地協(xié)議書
- 評審廉潔協(xié)議書
- 試駕車輛協(xié)議書
- 2025棗莊市衛(wèi)生健康服務(wù)中心招聘120急救電話調(diào)度員1人考試重點(diǎn)試題及答案解析
- 庫房共管協(xié)議書
- 廣州市南沙區(qū)南沙街道社區(qū)專職招聘考試真題2024
- 孤獨(dú)癥譜系障礙的神經(jīng)發(fā)育軌跡研究
- 2025年12月長沙縣第二人民醫(yī)院公開招聘編外專業(yè)技術(shù)人員4人筆試考試備考試題及答案解析
- 2025年秋小學(xué)音樂湘藝版四年級上冊期末測試卷及答案
- 2025年安徽合肥廬江縣部分國有企業(yè)招聘工作人員17人筆試參考題庫附答案
- 輸液連接裝置安全管理專家共識解讀
- 作詞進(jìn)階教學(xué)課件下載
- 2025上海復(fù)旦大學(xué)人事處招聘辦公室行政管理助理崗位1名考試參考試題及答案解析
- 燃?xì)庋簿€員安全培訓(xùn)課件
- 2025版離婚協(xié)議書樣本:婚姻關(guān)系解除與子女撫養(yǎng)安排
- GJB827B--2020軍事設(shè)施建設(shè)費(fèi)用定額
評論
0/150
提交評論