版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第4章SQLServer
結(jié)構(gòu)查詢語言SQLANSISQL/SQLServer
創(chuàng)建數(shù)據(jù)庫創(chuàng)建數(shù)據(jù)庫/創(chuàng)建表
數(shù)據(jù)查詢
集合查詢
單表查詢
多表查詢1SQLServerSQLServer是微軟研發(fā)的符合國際SQL(StructuredQueryLanguage,結(jié)構(gòu)化查詢語言)標(biāo)準(zhǔn)的專業(yè)級數(shù)據(jù)庫管理系統(tǒng),并提供了ODBC(OpenDatabaseConnectivity,開放數(shù)據(jù)庫互連)接口,其管理功能相當(dāng)完善,由于通過它簡單的操作就可以非常安全穩(wěn)定的進(jìn)行數(shù)據(jù)庫管理,從而擁有很高的市場占有率。主流DBMS,最新產(chǎn)品是SQLServer2016。在SQLServer中,不但可以使用系統(tǒng)提供的集成環(huán)境,進(jìn)行數(shù)據(jù)庫及其表的編輯、數(shù)據(jù)查詢和用戶管理等,而且可以使用數(shù)據(jù)定義語言DDL、數(shù)據(jù)操縱語言DML、數(shù)據(jù)查詢語言DQL和數(shù)據(jù)控制語言DCL等子語系,完成復(fù)雜的數(shù)據(jù)處理和分析。使用SQLServer2016介紹DB及其表的設(shè)計、創(chuàng)建和查詢。24.1結(jié)構(gòu)查詢語言SQL結(jié)構(gòu)化查詢語言SQL是關(guān)系數(shù)據(jù)庫的國際標(biāo)準(zhǔn)語言。目前流行的數(shù)據(jù)庫管理系統(tǒng),基本上都支持SQL。SQL是一個語言標(biāo)準(zhǔn)ANSISQLSQLServer34.1.1ANSISQL4SQL由Boyce和Chamberlin于1974年提出。功能豐富、簡單易學(xué)的語言,經(jīng)過不斷完善,最終發(fā)展成為關(guān)系數(shù)據(jù)庫的標(biāo)準(zhǔn)語言。SQL標(biāo)準(zhǔn):美國國家標(biāo)準(zhǔn)局(AmericanNationalStandardInstitute,ANSI)的數(shù)據(jù)庫委員會公布了SQL-86標(biāo)準(zhǔn),批準(zhǔn)SQL為關(guān)系數(shù)據(jù)庫語言的美國標(biāo)準(zhǔn)。國際標(biāo)準(zhǔn)化組織(InternationalOrganizationforStandardization,ISO)通過了SQL-86標(biāo)準(zhǔn)。SQL-1974BoyceIBM、SQL-86、SQL-89、SQL-92、SQL-99和SQL-2003等SQL子語言:數(shù)據(jù)定義語言(DataDefinitionLanguage,DDL)、數(shù)據(jù)操縱語言(DataManipulationLanguage,DML)和數(shù)據(jù)控制語言(DataControlLanguage,DCL)等ODBC標(biāo)準(zhǔn):SQL已經(jīng)成為數(shù)據(jù)庫廠家推出的數(shù)據(jù)庫產(chǎn)品的標(biāo)準(zhǔn)數(shù)據(jù)存取語言和標(biāo)準(zhǔn)數(shù)據(jù)庫接口4.1.2SQLServer5正是因為SQLServer2016自身的優(yōu)點,以及它提供的功能強(qiáng)大的管理工作室,使得數(shù)據(jù)庫管理方便、快捷、安全、穩(wěn)定、高效。SQLServer的特點SQLServer管理工作室1.SQLServer的特點6綜合統(tǒng)一集成DDL、DML和DCL于一身,語言風(fēng)格統(tǒng)一,獨立完成數(shù)據(jù)管理語法簡單,易學(xué)易用設(shè)計巧妙、語法簡捷、易學(xué)易用、功能極強(qiáng)。完成數(shù)據(jù)庫管理的核心功能僅使用了9個動詞(Create、Select、Drop、Alter、Insert、Update、Delete、Grant和Revoke等)面向集合操作
SQL全面采用集合操作方式。其查找、插入、修改和刪除等操作的操作對象均是集合。高度非過程化一語多用:既是自含式語言,又是嵌入式語言2.SQLServer管理工作室7SQLServer的管理工作室(SQLServerManagementStudio,SSMS)是為數(shù)據(jù)庫管理員和開發(fā)人員提供的新工具,由MicrosoftVisualStudio內(nèi)部承載,提供了用于數(shù)據(jù)庫管理的圖形工具和功能豐富的開發(fā)環(huán)境。SSMS將SQLServer2000企業(yè)管理器、AnalysisManager和查詢分析器等功能集成于一身。利用SSMS不但可以創(chuàng)建數(shù)據(jù)庫、表和視圖等數(shù)據(jù)庫管理,而且還可用于編寫MDX、XMLA和XML語句。啟動:GUI如圖4-1所示,啟動方法如下:開始→程序→MicrosoftSQLServer2016→SQLServerManagementStudio。組成:由對象資源管理器(圖2-1的左側(cè))和多文檔瀏覽與編輯區(qū)(查詢分析器+表結(jié)構(gòu)設(shè)計器+表記錄編輯器+信息瀏覽等,圖4-1的右側(cè))等。2.SQLServer管理工作室84.2創(chuàng)建數(shù)據(jù)庫SQLServer的數(shù)據(jù)定義功能包括定義數(shù)據(jù)庫、表、觸發(fā)器、斷言、視圖、索引、登錄、數(shù)據(jù)庫角色、數(shù)據(jù)庫角色和過程(如表4-1所示)等數(shù)據(jù)庫(存儲文件)屬于內(nèi)模式,表屬于模式,視圖屬于外模式,索引隸屬于表,登錄、數(shù)據(jù)庫角色、數(shù)據(jù)庫角色和登錄屬于數(shù)據(jù)庫安全,過程屬于存儲過程(程序設(shè)計)創(chuàng)建數(shù)據(jù)庫:創(chuàng)建/打開/關(guān)閉/刪除創(chuàng)建表:創(chuàng)建/修改/刪除結(jié)構(gòu);添加/修改/刪除記錄9SQLServer的數(shù)據(jù)定義語句10操作對象操作方式創(chuàng)建修改刪除數(shù)據(jù)庫CREATEDATABASE
DROPDATABASE表CREATETABLEALTERTABLEDROPTABLE視圖CREATEVIEWALTERVIEWDROPVIEW索引CREATINDEXALTERINDEXDROPINDEX登錄CREATELOGINALTERLOGINDROPLOGIN數(shù)據(jù)庫用戶CREATEUSERALTERUSERDROPUSER數(shù)據(jù)庫角色CREATEROLEALTERROLEDROPROLE觸發(fā)器CREATETRIGGERALTERTRIGGERDROPTRIGGER斷言CREATEASSERTION
DROPASSERTION過程CREATEPROCEDUREALTERPROCEDUREDROPPROCEDURE4.2.1創(chuàng)建數(shù)據(jù)庫使用查詢分析器創(chuàng)建數(shù)據(jù)庫的語法:CREATEDATABASE<數(shù)據(jù)庫名>
[ON(NAME=<數(shù)據(jù)庫邏輯名稱>,FILENAME=<數(shù)據(jù)庫物理名稱>)[,LOGON(NAME=<日志邏輯名稱>,FILENAME=<日志物理名稱>)]]提示:如果使用CREATEDATABASEEBook創(chuàng)建數(shù)據(jù)庫,則EBook按照默認(rèn)參數(shù)存儲在默認(rèn)文件夾中。114.2.1創(chuàng)建數(shù)據(jù)庫例4.1使用查詢分析器,在D盤的MyData文件夾中,建立數(shù)據(jù)庫EBook。要求:EBook的邏輯名稱為EBook,初始大小為10MB,增量為10MB,不限制增長,物理文件名稱為EBook.mdf。EBook的日志的邏輯名稱為EBookLog,初始大小為5MB,增量為5%,增長的最大值限制為2000MB,物理文件名稱為EBookLog.ldf。CREATEDATABASEEBookON(NAME='EBook',FILENAME='D:\MyData\EBook.mdf',SIZE=10MB,FILEGROWTH=10MB,MAXSIZE=UNLIMITED)LOGON(NAME='EBookLog',FILENAME='D:\MyData\EBookLog.ldf',SIZE=5MB,FILEGROWTH=5%,MAXSIZE=2000MB)說明:建立數(shù)據(jù)庫Ebook之前,首先需要建立文件夾D:\MyData。124.2.1創(chuàng)建數(shù)據(jù)庫打開數(shù)據(jù)庫:USE<數(shù)據(jù)庫名>例如:打開數(shù)據(jù)庫Ebook。...--使用數(shù)據(jù)庫之前,必須先打開數(shù)據(jù)庫。USEEbook說明:“--”開頭的為注釋語句。刪除數(shù)據(jù)庫:DROPDATABASE<數(shù)據(jù)庫名>[,<數(shù)據(jù)庫名>,...]例如:刪除數(shù)據(jù)庫EBook。DROPDATABASEEBook思考1:使用對象資源管理器創(chuàng)建上述數(shù)據(jù)庫EBook,然后刪除該數(shù)據(jù)庫。思考2:數(shù)據(jù)庫的默認(rèn)文件夾。思考3:如何關(guān)閉數(shù)據(jù)庫?134.2.2創(chuàng)建表創(chuàng)建表的過程是首先創(chuàng)建表結(jié)構(gòu),然后編輯表記錄。創(chuàng)建表結(jié)構(gòu)創(chuàng)建/修改/刪除編輯表記錄創(chuàng)建/修改/刪除141.創(chuàng)建表結(jié)構(gòu)15創(chuàng)建表結(jié)構(gòu):CREATETABLE<表名>(<屬性名><數(shù)據(jù)類型>[<屬性完整性約束>][,<屬性名><數(shù)據(jù)類型>[<屬性完整性約束>]][,<關(guān)系完整性約束>])數(shù)據(jù)類型:位型整型貨幣型日期時間型圖像型浮點型字符型BITTINYINTSMALLINTINTBIGINTMONEYSMALLMONEYDATE/TIMEDATETIMESMALLDATETIMEIMAGEREAL/FLOATDECIMAL(n,m)NUMERIC(n,m)CHAR(n)VARCHAR(n)TEXTNTEXT1.創(chuàng)建表結(jié)構(gòu)16例4.2創(chuàng)建Ebbook中的Press、Book、Cust和Buy。要求如下(其它自定):(1)社號、書號、戶號、(戶號,書號):文本,主鍵。(2)Book的社號、Buy的戶號和書號:外鍵,級聯(lián)更新,級聯(lián)刪除。(3)社名:文本,長度22,唯一。(4)郵編:文本,6位數(shù)字。(5)電話:文本,長度不能超過15位。(6)郵箱:文本,包含字符“@”。(7)版次:短整型,1到9。(8)定價、進(jìn)價、售價:實數(shù),定價<進(jìn)價,售價<=定價,售價>進(jìn)價。(9)戶號:文本,首字符為C,后跟3個數(shù)字。(10)性別、婚否:文本,分別只能為“男”或“女”、“是”或“否”。(11)購買日期:日期,默認(rèn)值為計算機(jī)的當(dāng)前日期。1.創(chuàng)建表結(jié)構(gòu)17CREATETABLEPress(PNoCHAR(16)PRIMARYKEY,PNameCHAR(20)UNIQUE,PCodeCHAR(6)CHECK(PCodeLIKE'[0-9][0-9][0-9][0-9][0-9][0-9]'),PAddrCHAR(30),PhoneCHAR(16)CHECK(LEN(Phone)<=15),EMailCHAR(26)CHECK(CHARINDEX('@',EMail)>0),HPageCHAR(25))1.創(chuàng)建表結(jié)構(gòu)18CREATETABLEBook(BNoCHAR(22)PRIMARYKEY,BNameCHAR(22)NOTNULL,AuthorCHAR(8),PNoCHAR(16)REFERENCESPress(PNo),EditNoSMALLINTCHECK(EditNo>0ANDEditNo<=9),PriceREAL,PPriceFLOAT,SPriceDECIMAL(6,2),CHECK(PPrice<=PriceANDSPrice<=PriceANDSPrice>=PPrice))1.創(chuàng)建表結(jié)構(gòu)19CREATETABLECust(CNoCHAR(4)PRIMARYKEYCHECK(CNoLIKE'C[0-9][0-9][0-9]'),CNameCHAR(8),CSexCHAR(2)CHECK(CSex='男'ORCSex='女'),BirthDATE,PhoneCHAR(11)CHECK(LEN(Phone)<=15),MarryCHAR(2)CHECK(Marry='是'ORMarry='否'),PhotoIMAGE,EMailCHAR(26)CHECK(CHARINDEX('@',EMail)>0))1.創(chuàng)建表結(jié)構(gòu)20CREATETABLEBuy(CNoCHAR(4)NOTNULL,BNoCHAR(22)NOTNULL,PDateDATEDEFAULTDATENAME(YEAR,GETDATE())+'-'+DATENAME(MONTH,GETDATE())+'-'+DATENAME(DAY,GETDATE()),PRIMARYKEY(CNo,BNo),FOREIGNKEY(CNo)REFERENCESCust(CNo)ONDELETECASCADEONUPDATECASCADE,FOREIGNKEY(BNo)REFERENCESBook(BNo)ONDELETECASCADEONUPDATECASCADE)編輯表結(jié)構(gòu)21添加屬性:ALTERTABLE<表名>ADD<屬性名><數(shù)據(jù)類型>[完整性約束]例如:在Cust中,添加注冊時間CEnroll,數(shù)據(jù)類型為日期時間型,。ALTERTABLECustADDCEnrollDATETIME修改屬性:ALTERTABLE<表名>ALTERCOLUMN<屬性名><數(shù)據(jù)類型>[完整性約束]例如:在Cust中,修改注冊時間的類型為SMALLDATETIME。ALTERTABLECustALTERCOLUMNCEnrollSMALLDATETIME思考:修改購買日期的類型為日期時間型,默認(rèn)值為計算機(jī)的當(dāng)前日期時間。刪除屬性:ALTERTABLE<表名>DROPCOLUMN<屬性名>|CONSTRAINT<約束名>例如:在Cust中,刪除注冊時間。ALTERTABLECustDROPCOLUMNCEnroll2.編輯表記錄(1)添加表記錄的語法:INSERTINTO<表名>[(<屬性1>[,<屬性2>…)]VALUES(<常量1>[,<常量2>]…)說明:如果常量的類型、個數(shù)和順序與表的屬性的類型、個數(shù)和順序均相匹配,則表的屬性部分可以省略,否則屬性和常量必須給出,而且二者的類型、個數(shù)和順序均相匹配。例如:在Buy中,添加如下記錄:戶號:C006;書號:ISBN978-7-302-33894-9;購買日期:2016-11-11INSERTINTOBuyVALUES('C006','ISBN978-7-302-33894-9','2016-11-11')222.編輯表記錄例如:在Buy中,添加如下記錄:戶號:C006;書號:ISBN978-7-04-040664-1。INSERTINTOBuy(Cno,BNo)VALUES('C006','ISBN978-7-04-040664-1')說明:如果需要向表中添加多個元組,可以使用如下格式,或者使用主語言實現(xiàn)。INSERTINTO<表名>[(<屬性1>[,<屬性2>…)]SELECT語句232.編輯表記錄(2)修改表記錄的語法:UPDATE<表名>SET<屬性1>=<表達(dá)式1>[,<屬性2>=<表達(dá)式2>,…][WHERE<條件>]說明:把滿足<條件>的記錄,使用<表達(dá)式i>的值,修改<屬性i>的值。例如:在Cust中,把戶號為C003的戶名改為王云。UPDATECustSETCName='王云'WHERECNo='C003'242.編輯表記錄例如:在Book中,將所有售價增加1元。UPDATEBookSETSPrice=SPrice+1例如:在Book中,把浙江工商大學(xué)出版社出版的圖書的版次全部改為2。UPDATEBookSETEditNo=2WHEREPNo=(SELECTPNoFROMPressWHEREPName='浙江工商大學(xué)出版社')252.編輯表記錄(3)刪除表記錄的語法:DELETEFROM<表名>[WHERE<條件>]說明:刪除滿足<條件>的記錄。省略WHERE時,則刪除表中的所有記錄。例如:在Cust中,刪除戶號為C004的客戶。DELETEFROMCustWHERECNo='C004'例如:在Buy中,刪除戶號為C003的購買信息。DELETEFROMBuyWHERECNo='C003'262.編輯表記錄例如:在Buy中,刪除所有購買信息。DELETEFROMBuy例如:在Book中,刪除所有浙江工商大學(xué)出版社出版的圖書。DELETEFROMBookWHEREPNo=(SELECTPNoFROMPressWHEREPName='浙江工商大學(xué)出版社')273.刪除表(結(jié)構(gòu)+記錄)刪除表的語法:DROPTABLE<表名>[,<表名>…]例如:刪除Press,Book,Cust和Buy。DROPTABLEBuy,Book,Press,Cust思考:DROPTABLEPress,Book,Cust,Buy是否正確?提示:在刪除表時,會同時刪除表的結(jié)構(gòu)和記錄。思考:使用對象資源管理器創(chuàng)建上述表,然后進(jìn)行相應(yīng)的刪除操作。284.3數(shù)據(jù)查詢SELECT[ALL|DISTINCT|*]<表達(dá)式>[,<表達(dá)式>]…FROM<表名或視圖名>[,<表名或視圖名>]…[WHERE<條件表達(dá)式>][GROUPBY<屬性名>[HAVING<條件表達(dá)式>]][ORDERBY<屬性名>[ASC|DESC]]其中:SELECT和FROM必選,其它可選。SELECT(投影):顯示的數(shù)據(jù)列;All表示所有行;*表示所有列;DISTINCT表示去掉重復(fù)行。FROM(連接):查詢對象(表或視圖)。WHERE(條件):查詢條件;省略WHERE條件時,查詢所有行。GROUPBY(分組):對查詢結(jié)果按指定列的值分組,該列的值相等的行為一個組。通常會在每組中作用聚集函數(shù),即實現(xiàn)分類統(tǒng)計。HAVING(篩選分組,隸屬于分組):篩選出滿足指定條件的分組。ORDERBY(排序):對查詢結(jié)果按照指定列值進(jìn)行升序(ASC)或降序排序(DESC),默認(rèn)升序。294.3數(shù)據(jù)查詢<表達(dá)式>:使用算術(shù)運算符(+,-,*,/,Power(x,y)等)、關(guān)系運算符(<,<=,>=,>,!=,<>,=,!>,!<等)、邏輯運算符(NOT,AND和OR等)和短語(BETWEENAANDB,NOTBETWEENAANDB,IN,NOTIN,LIKE,NOTLIKE,ISNULL,ISNOTNULL),把常量、屬性、變量和函數(shù),按照指定的語法規(guī)則連接起來的有意義的組合(具體用法與C++和Java的表達(dá)式雷同)。常量:文本→使用英文單引號(例如:'C006');日期時間→使用日期格式、時間格式和英文單引號
(例如:'2016-6-6','16:10:10','2016-6-616:10:10');數(shù)值→使用+,-,數(shù)字、小數(shù)點和E等
(例如:60,-10.26,0.2E2,-0.6E-2)。304.3數(shù)據(jù)查詢SQLServer的運算符和函數(shù)31名稱運算符注釋比較運算=,<,>,>=,<=,!=,<>,!>,!<等于、小于、大于、…謂詞BETWEENAND,NOTBETWEENAND介于兩者之間,介于兩者之外IN,NOTIN在其中,不在其中LIKE,NOTLIKE;[ABC],[^ABC]匹配、不匹配ISNULL,ISNOTNULL是空值,不是空值邏輯運算NOT,AND,OR非,與、或集函數(shù)COUNT(*),COUNT(列名),SUM(列名)AVG(列名),MAX(列名),MIN(列名)統(tǒng)計元組個數(shù),統(tǒng)計列值個數(shù),列值匯總,求列值平均,求列值最大,求列值最小4.3.1集合查詢集合查詢:笛卡爾積、并集、交集和差集等。笛卡爾積SELECT*FROM<表1>,<表2>,…例如:查詢Press和Book的笛卡爾積。SELECT*FROMPress,Book提示:關(guān)系的笛卡爾積中包含有較多無意義的記錄。笛卡爾積的真正意義在于其理論價值。324.3.1集合查詢并集SELECT…FROM…WHEREUNIONSELECT…FROM…WHERE例如:查詢購買書號為“ISBN978-7-04-040664-1”或“ISBN978-7-81140-582-8”的客戶的戶號。SELECTCNoFROMBuyWHEREBNo='ISBN978-7-04-040664-1'UNIONSELECTCNoFROMBuyWHEREBno='ISBN978-7-81140-582-8'334.3.1集合查詢查詢結(jié)果:CNoC001C002C006提示:兩個查詢的屬性列表必須個數(shù)相等、類型相同、順序一致。對于關(guān)系的差集和交集,也有同樣的要求。344.3.1集合查詢交集SELECT…FROM…WHEREINTERSECTSELECT…FROM…WHERE例如:查詢購買書號為“ISBN978-7-04-040664-1”和“ISBN978-7-81140-582-8”的客戶的戶號。SELECTCNoFROMBuyWHEREBNo='ISBN978-7-04-040664-1'INTERSECTSELECTCNoFROMBuyWHEREBno='ISBN978-7-81140-582-8'35查詢結(jié)果:CNoC0014.3.1集合查詢差集SELECT…FROM…WHEREEXCEPTSELECT…FROM…WHERE例如:查詢購買書號為“ISBN978-7-04-040664-1”,但沒有購買書號為“ISBN978-7-81140-582-8”的客戶的戶號。SELECTCNoFROMBuyWHEREBNo='ISBN978-7-04-040664-1'EXCEPTSELECTCNoFROMBuyWHEREBno='ISBN978-7-81140-582-8‘36查詢結(jié)果:CNoC0024.3.2單表查詢選擇、投影、更名、區(qū)間、枚舉、模糊、統(tǒng)計、排序和空值等。選擇SELECT*FROM<表名>WHERE<邏輯表達(dá)式>例如:在Buy中,查詢2012年1月1日(含本日)之前客戶的購買信息。SELECT*FROMBuyWHEREPdate<='2012-1-1'例如:在Cust中,查詢未婚女客戶的信息。SELECT*FROMCustWHERECSex='女'ANDMarry='否'思考1:查詢1988年1月1日之前出生的男客戶信息和未婚女客戶的信息。思考2:關(guān)系代數(shù)的選擇運算對應(yīng)于SELECT…FROM…WHERE的哪個短語?374.3.2單表查詢投影SELECT[*]<表達(dá)式1>[,<表達(dá)式2>]…FROM<表>[WHERE<邏輯表達(dá)式>]例如:在Cust中,查詢客戶的戶名、生日和電話。SELECTCName,Birth,PhoneFROMCust如果需要在查詢結(jié)果中去掉重復(fù)記錄,則可以使用DISTINCT。例如:查詢購買過圖書的客戶的戶號。SELECTDISTINCTCNoFROMBuy思考:分析SELECTCNoFROMBuy的查詢結(jié)果。384.3.2單表查詢例如:查詢1990年之后出生的未婚男客戶的戶號、戶名、生日和郵箱。SELECTCno,CName,Birth,EMailFROMCustWHEREBirth>='1990-1-1'ANDCSex='男'ANDMarry='否'例如:查詢客戶的所有屬性的詳細(xì)信息。SELECT*FROMCust思考:關(guān)系代數(shù)的投影運算對應(yīng)于SELECT…FROM…WHERE的哪個短語?394.3.2單表查詢更名如果給查詢的<表達(dá)式>命名,則可以在<表達(dá)式>之后給出指定的名稱。SELECT<表達(dá)式1>名稱[,<表達(dá)式2>名稱]…例如:在Cust中,查詢男客戶的姓名和年齡,且屬性名顯示為“姓名”和“年齡”。SELECTCName姓名,DATEPART(YEAR,GETDATE())-DATEPART(YEAR,Birth)年齡FROMCustWHERECSex='男'思考:分析如下語句的查詢結(jié)果。SELECTCName,DATEPART(YEAR,GETDATE())-DATEPART(YEAR,Birth)FROMCust404.3.2單表查詢區(qū)間:如果查詢的數(shù)據(jù)在兩個值(A~B)之間或者之外,則可以使用BETWEENAANDB。<屬性>BETWEEN<表達(dá)式1>AND<表達(dá)式2>例如:查詢售價大于等于10,且小于等于20的書號、書名、作者和版次。SELECTBNo,BName,Author,EditNoFROMBookWHERESpriceBETWEEN10AND20或者SELECTBNo,BName,Author,EditNoFROMBookWHERESPrice>=10ANDSPrice<=20提示:BETWEENAANDB包括端點A和B。414.3.2單表查詢思考:分析如下語句是否正確?SELECTBNo,BName,Author,EditNoFROMBookWHERE10=<SPrice<=20例如:在Book中,查詢售價大于20,或小于10的書號、書名、作者和版次。SELECTBNo,BName,Author,EditNoFROMBookWHERESPriceNOTBETWEEN10AND20424.3.2單表查詢枚舉:查詢數(shù)據(jù)在多個值(A,B,C,…)之中,則可用IN(A,B,C,…)。<屬性>IN(<表達(dá)式1>,<表達(dá)式2>,…,<表達(dá)式n>)例如:在Cust中,查詢戶號為C001,C002和C006的戶名、性別和生日。SELECTCName,CSex,BirthFROMCustWHERECNoIn('C001','C002','C006')或者SELECTCName,CSex,BirthFROMCustWHERECNo='C001'ORCNo='C002'ORCNo='C006'例如:在Cust中,查詢戶號不是C001,C002和C006的戶名、性別和生日。SELECTCName,CSex,BirthFROMCustWHERECNoNOTIn('C001','C002','C006')434.3.2單表查詢模糊:查詢數(shù)據(jù)僅包含若干特點的模糊信息,則可以使用LIKE和通配符。<屬性>LIKE<表達(dá)式>常用通配符:%、_、[字符串]、[^字符串]%:表示任意長度(包括長度為0)的字符串。例如:x%y表示以x開頭,以y結(jié)尾的任意長度的字符串。_(下劃線):表示任意單個字符。例如:x_y表示以x開頭,以y結(jié)尾的長度為3的任意字符串。如果字符集為ASCII,則一個漢字需要兩個_;如果字符集為GBK,則一個漢字只需要一個_。ESCAPE(轉(zhuǎn)義):當(dāng)用戶要查詢的字符串本身就含有%或_時,需要使用ESCAPE'字符'指定轉(zhuǎn)移字符進(jìn)行轉(zhuǎn)義。
例如:LIKE'DB\_%'ESCAPE'\'表示以“DB_”開頭。[字符串]/[^字符串]:表示與[]中的字符匹配;^表示不與[]中的字符匹配。444.3.2單表查詢例如:在Cust中,查詢姓李的戶號、戶名和生日。SELECTCNo,CName,BirthFROMCustWHERECNameLIKE'李%'例如:在Cust中,查詢不姓李的戶號、戶名和生日。SELECTCNo,CName,BirthFROMCustWHERECNameNOTLIKE'李%'例如:在Press中,查詢倒數(shù)第2個尾數(shù)為1的社號、社名和郵編。SELECTPNo,PName,PCodeFROMPressWHEREPNoLIKE'%1_'454.3.2單表查詢例如:在Book中,先把“Access數(shù)據(jù)庫應(yīng)用”改為“Access_2010數(shù)據(jù)庫應(yīng)用”,再查詢以“Access_”開頭的書名和售價。UPDATEBookSETBName='Access_2010數(shù)據(jù)庫應(yīng)用'WHEREBName='Access數(shù)據(jù)庫應(yīng)用'SELECTBName,SPriceFROMBookWHEREBNameLIKE'Access#_%'ESCAPE'#'464.3.2單表查詢例如:在Cust中,查詢戶號為C001到C004的戶名、性別和生日。SELECTCName,CSex,BirthFROMCustWHERECNoLIKE'C00[1-4]'或者SELECTCName,CSex,BirthFROMCustWHERECNoLIKE'C00[1234]'474.3.2單表查詢例如:在Cust中,查詢戶號不是C001到C004的戶名、性別和生日。SELECTCName,CSex,BirthFROMCustWHERECNoLIKE'C00[^1-4]'或者SELECTCName,CSex,BirthFROMCustWHERECNoLIKE'C00[^1234]'或者SELECTCName,CSex,BirthFROMCustWHERECNoNOTLIKE'C00[1-4]'思考1:使用[126],查詢戶號為C001,C002和C006的戶名和生日。思考2:使用[^126],查詢戶號不是C001,C002和C006的戶名和生日。思考3:分析LIKE'Room[^H-X][1-6]'代表的含義。484.3.2單表查詢統(tǒng)計如果需要對查詢的數(shù)據(jù)進(jìn)行分類(分組)以及計數(shù)、計算均值、求和、找出最大(?。┲档冉y(tǒng)計運算,則可以使用GROUPBY、HAVING和統(tǒng)計(聚合)函數(shù)(COUNT(),SUM(),AVG(),MAX(),MIN())等。如果SELECT語句中使用了GROUPBY,則統(tǒng)計函數(shù)對每個分組有效,即分類統(tǒng)計:先把滿足條件的記錄進(jìn)行分組,然后統(tǒng)計每個分組的相應(yīng)數(shù)據(jù)。COUNT()相當(dāng)于分類統(tǒng)計記錄的個數(shù);AVG()相當(dāng)于分類求平均值;SUM()相當(dāng)于分類求和;MAX()相當(dāng)于分類求最大值;MIN()相當(dāng)于分類求最小值。提示:在統(tǒng)計時,為避免重復(fù)計數(shù),應(yīng)該在COUNT中使用DISTINCT,其他函數(shù)依然。494.3.2單表查詢例如:在Buy中,統(tǒng)計購書的記錄總數(shù)。SELECTCOUNT(*)FROMBuy例如:在Buy中,統(tǒng)計購書的客戶的總數(shù)。SELECTCOUNT(DISTINCTCNo)客戶總數(shù)FROMBuy思考:SELECTCOUNT(CNo)FROMBuy是否正確?例如:在Book中,統(tǒng)計圖書的最低售價、最高售價和平均售價。SELECTMIN(SPrice)最低售價,MAX(SPrice)最高售價,AVG(SPrice)平均售價FROMBook例如:在Book中,統(tǒng)計購進(jìn)圖書的投入資金總額。SELECTSUM(PPrice)FROMBook504.3.2單表查詢例如:在Book中,統(tǒng)計每本書的利潤。SELECTBNo,SUM(SPrice-Pprice)利潤FROMBookGROUPBYBNo思考:SELECTBNo,SPrice-PPrice利潤FROMBook是否正確?例如:在Book中,統(tǒng)計圖書的利潤總額。SELECTSUM(SPrice-Pprice)利潤總額FROMBook說明:利潤總額僅僅是Book中所有書的利潤總和,而不是銷售利潤總和!思考:如何統(tǒng)計銷售利潤總額!514.3.2單表查詢例如:在Buy中,統(tǒng)計每本書的銷售數(shù)量。SELECTBNo,COUNT(CNo)FROMBuyGROUPBYBNo或者SELECTBNo,COUNT(*)FROMBuyGROUPBYBNo例如:在Buy中,統(tǒng)計每位客戶購書的數(shù)量。SELECTCNo,COUNT(BNo)FROMBuyGROUPBYCno或者SELECTCNo,COUNT(*)FROMBuyGROUPBYCNo524.3.2單表查詢例如:在Buy中,統(tǒng)計購書數(shù)量大于等于5的戶號和購書數(shù)量。SELECTCNo,COUNT(BNo)FROMBuyGROUPBYCNoHAVINGCOUNT(BNo)>=5或者SELECTCNo,COUNT(BNo)FROMBuyGROUPBYCNoHAVINGCOUNT(*)>=5534.3.2單表查詢例如:在Buy中,查詢只買“ISBN978-7-04-040664-1”和“ISBN978-7-302-33894-9”兩本書的戶號。SELECTCNoFROMBuyWHEREBNo='ISBN978-7-04-040664-1'INTERSECTSELECTCNoFROMBuyWHEREBNo='ISBN978-7-302-33894-9'INTERSECTSELECTCNoFROMBuyGROUPBYCNoHAVINGCOUNT(BNo)=2思考1:查詢購買“ISBN978-7-04-040664-1”或“ISBN978-7-302-33894-9”的戶號思考2:查詢購買“ISBN978-7-04-040664-1”和“ISBN978-7-302-33894-9”的戶號544.3.2單表查詢排序:如果需要對查詢的數(shù)據(jù)進(jìn)行排序,則可以使用ORDERBY…、ASC(默認(rèn),升序)和DESC(降序)。即:ORDERBY<屬性>[ASC|DESC][TOP<表達(dá)式>[PERCENT]]TOP<表達(dá)式>:僅顯示前若干記錄;PERCENT:按照百分比顯示前若干記錄。例如:在Book中,按照定價進(jìn)行降序排序。SELECT*FROMBookORDERBYPriceDESC例如:在Book中,先按照作者進(jìn)行升序排序,再按照售價進(jìn)行降序排序。SELECT*FROMBookORDERBYAuthor,SPriceDESC思考1:解釋多重排序。思考2:實現(xiàn)TOP和PERCENT的用法。554.3.2單表查詢空值:查詢包含空值的數(shù)據(jù),則可以使用ISNULLIN、ISNOTNULL。SELECT*<表1>,<表2>,…例如:在Buy中,先把戶號為“C006”,書號為“ISBN978-7-81140-582-8”的記錄的購買日期2013-10-17改為空值NULL,再分別查詢沒有購買日期和有購買日期的記錄。UPDATEBuySETPDate=NULLWHERECNo='C006'ANDBNo='ISBN978-7-81140-582-8'思考1:如果使用SETPDateISNULL,正確嗎?思考2:如果使用WHEREPDate='2013-10-17',是否合理?SELECT*FROMBuyWHEREPDateISNULLSELECT*FROMBuyWHEREPDateISNOTNULL思考:可以使用“=NULL”代替“ISNULL”嗎?提示:在升序排序時,空值最先顯示。在降序排序時,空值最后顯示。564.3.3多表查詢1.連接:連接包括內(nèi)連接(條件連接)和外連接(左外連接,右外連接)等。(1)內(nèi)連接的語法:SELECT[*]<表達(dá)式>[,<表達(dá)式>]…FROM<表1>,<表2>,…,<表n>WHERE<條件表達(dá)式>SELECT[*]<表達(dá)式>[,<表達(dá)式>]…FROM<表1>[INNER]JOIN<表2>ON(<表1>.Aθ<表2>.B)提示:<表1>,…,<表n>不能同名。如果一表多用,則可以使用別名:SELECT*FROM<表>Tab1,<表>TwoTab2WHERETab1.AθTab2.B例如:在Cust和Buy中,查詢客戶的詳細(xì)購書信息。SELECT*FROMCust,BuyWHERECust.CNo=Buy.Cno或者574.3.3多表查詢SELECTCust.*,Buy.*FROMCust,BuyWHERECust.CNo=Buy.Cno或者SELECTCust.CNo,CName,CSex,Birth,Phone,Marry,EMail,BNo,PDateFROMCust,BuyWHERECust.CNo=Buy.CNo
或者SELECTCust.CNo,CName,CSex,Birth,Phone,Marry,EMail,BNo,PDateFROMCustJOINBuyON(Cust.CNo=Buy.CNo)或者SELECTCust.CNo,CName,CSex,Birth,Phone,Marry,EMail,BNo,PDateFROMCustINNERJOINBuyON(Cust.CNo=Buy.CNo)思考:分析上述寫法的區(qū)別。584.3.3多表查詢例如:查詢購買韓培友出版的圖書的戶名、書名、作者、社名和訂購日期。SELECTCName,BName,Author,PName,PDateFROMCust,Buy,Press,BookWHERECust.CNo=Buy.CNoANDBook.BNo=Buy.BNoANDBook.PNo=Press.PNoANDAuthor='韓培友'例如:統(tǒng)計每本書的銷售利潤總額,顯示結(jié)果為書號、書名、作者和利潤。SELECTBook.BNo書號,BName書名,Author作者,SUM(Sprice-Pprice)利潤FROMBuy,BookWHEREBook.BNo=Buy.BNoGROUPBYBook.BNo,BName,Author思考:統(tǒng)計每本書的銷售利潤總額,顯示結(jié)果為書號、書名、作者、社名和利潤。594.3.3多表查詢例如:統(tǒng)計銷售利潤總額。SELECTSUM(Sprice-Pprice)總利潤FROMBuy,BookWHEREBook.BNo=Buy.BNo提示:在實際應(yīng)用中,進(jìn)行連接操作時,有意義的連接操作一般是自然連接,而自然連接通常不明確的給出連接條件,這時一定要注意,不要把默認(rèn)的連接條件丟掉。其中的默認(rèn)連接條件就是表之間的公共屬性的值相等。例如:Buy.CNo=Cust.CNo和Buy.BNo=Book.BNo。604.3.3多表查詢(2)外連接的語法:SELECT<表達(dá)式>[,<表達(dá)式>]…FROM<表1>LEFT|RIGHT[OUTER]JOIN<表2>ON(<表1>.Aθ<表2>.B)在連接中,只有滿足連接條件的記錄才能作為結(jié)果輸出,例如Cust和Buy的連接結(jié)果中就沒有C004的信息,因為他們沒有購買圖書,在Buy中沒有相應(yīng)的記錄。如果想以Cust為主體列出每個客戶的基本情況及其購買購書情況,且沒有購買圖書的客戶也希望輸出其信息(其未知數(shù)據(jù)用空值NULL輸出),這時就需要使用外連接(OuterJoin)。外連接分為左連接(LeftOuterJoin)和右連接(RightOuterJoin)。例如:輸出所有客戶的購書信息,包括沒有購買記錄的顧客。SELECTCust.CNo,CName,CSex,Birth,Phone,Marry,Photo,EMail,Bno,PDateFROMCustLEFTOUTERJOINBuyON(Cust.CNo=Buy.CNo)SELECTCust.CNo,CName,CSex,Birth,Phone,Marry,Photo,EMail,Bno,PDateFROMCustLEFTJOINBuyON(Cust.CNo=Buy.CNo)614.3.3多表查詢例如:在Book中,先添加如下記錄,再輸出所有圖書的購書信息,包括沒有購買記錄的圖書。(ISBN978-7-5612-2485-4,數(shù)據(jù)庫技術(shù),韓培友,ISBN978-7-5612,1,36,16,20)INSERTINTOBookVALUES('ISBN978-7-5612-2485-4','數(shù)據(jù)庫技術(shù)','韓培友','ISBN978-7-5612',1,36,16,20)SELECTBook.BNo,BName,Author,PNo,EditNo,Price,PPrice,SPrice,PDateFROMBuyRIGHTJOINBookON(Book.BNo=Buy.BNo)提示:在SQLServer中,連接、等值連接和自然連接的實現(xiàn)方法基本一樣,只有連接條件和投影屬性的差異。思考:關(guān)系代數(shù)的連接運算對應(yīng)于SELECT…FROM…WHERE的哪個短語?624.3.3多表查詢2.嵌套嵌套:查詢語句作為一個整體,可以將其嵌套在另一個查詢語句的WHERE子句的條件中,從而構(gòu)成嵌套查詢實際效果:對于某些特殊查詢,嵌套查詢會帶來一定的方便,但是對有一些查詢則不然,提示:需要根據(jù)實際情況來選擇使用嵌套。IN之后的選擇結(jié)果只有一個值時,可以使用等號“=”代替。634.3.3多表查詢例如:查詢李明購買圖書的書號SELECTBNoFROMBuyWHERECNoIN(SELECTCNoFROMCustWHERECName='李明')或者SELECTDISTINCTBNoFROMBuy,CustWHEREBuy.CNo=Cust.CNoANDCName='李明'思考:IN是否可以使用“=”替代?644.3.3多表查詢例如:查詢李明購買圖書的書名SELECTBnameFROMBookWHEREBNoIN(SELECTBnoFROMBuyWHERECNoIN(SELECTCNoFROMCustWHERECName='李明'))或者SELECTDISTINCTBNameFROMBook,Buy,CustWHEREBook.BNo=Buy.BNoANDBuy.CNo=Cust.CNoANDCName='李明'思考:查詢李明購買的作者是韓培友的圖書的書名。654.3.3多表查詢例如:查詢李明購買圖書的社名SELECTPnameFROMPressWHEREPNoIN(SELECTPNoFROMBookWHEREBNoIN(SELECTBNoFROMBuyWHERECNoIN(SELECTCNoFROMCustWHERECName='李明')))或者SELECTDISTINCTPnameFROMPress,Book,Buy,CustWHEREPress.PNo=Book.PNoANDBook.BNo=Buy.BNoANDBuy.CNo=Cust.CNoANDCName='李明'思考:如果去掉DISTINCT,結(jié)果如何?664.3.3多表查詢例如:查詢與C006同名的客戶的戶號、戶名和性別(自連接)。SELECTCNo,CName,CsexFROMCustWHERECNameIN(SELECTCNameFROMCustWHERECNo='C006')或者SELECTC1.CNo,C1.CName,C1.CSexFROMCustC1WHEREC1.CNameIN(SELECTC2.CNameFROMCustC2WHEREC2.CNo='C006')或者674.3.3多表查詢SELECTC1.CNo,C1.CName,C1.CSexFROMCustC1,CustC2WHEREC1.CName=C2.CNameANDC2.CNo='C006'或者SELECTC1.CNo,C1.CName,C1.CSexFROMCustC1WHEREEXISTS(SELECT*FROMCustC2WHEREC2.CName=C1.CNameANDC2.CNo='C006')思考:如何去除“C006”本人(即:查詢結(jié)果不含C006本人)?提示:嵌套查詢的求解過程:由里向外。即先執(zhí)行子查詢,后執(zhí)行父查詢。子查詢的結(jié)果用于建立父查詢的查找條件。嵌套查詢可以使用多個簡單查詢構(gòu)成復(fù)雜的查詢(即:結(jié)構(gòu)化查詢)。684.3.3多表查詢3.ANY/ALL:用于與任意一個值比較,或者
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年高職第三學(xué)年(大數(shù)據(jù)與會計)財務(wù)核算階段測試題及答案
- 2025年中職(音樂制作基礎(chǔ))音樂制作階段測試題及答案
- 2025年高職農(nóng)林技術(shù)(技術(shù)實操訓(xùn)練)試題及答案
- 2025年大學(xué)大四(地質(zhì)工程)礦山地質(zhì)勘探綜合評估試題及答案
- 2026年中式面點(饅頭餡料調(diào)制)試題及答案
- 2026年烘焙技術(shù)(面包發(fā)酵)試題及答案
- 2025年大學(xué)護(hù)理學(xué)(傳染病預(yù)防)試題及答案
- 2025年高職中藥學(xué)(中藥應(yīng)用)試題及答案
- 2025年大學(xué)建筑環(huán)境與能源應(yīng)用工程(建筑節(jié)能設(shè)計)試題及答案
- 2025年高職運動與休閑(運動趨勢分析)試題及答案
- 口腔診所保密協(xié)議書
- 2025春季學(xué)期國家開放大學(xué)本科《工程數(shù)學(xué)》一平臺在線形考(形成性考核作業(yè)1至5)試題及答案
- 幼兒教師AI賦能教學(xué)能力提升培訓(xùn)
- 2024年內(nèi)蒙古氣象部門招聘呼和浩特包頭鄂爾多斯等考試真題
- 機(jī)械制圖8套試題及答案
- 工程聯(lián)營協(xié)議書范本
- 《先兆流產(chǎn)中西醫(yī)結(jié)合診療指南》
- 醫(yī)保藥械管理制度內(nèi)容
- 商業(yè)地產(chǎn)投資講座
- 江西省贛州市2023-2024學(xué)年高三上學(xué)期期末考試化學(xué)試卷 附答案
- 機(jī)房動力環(huán)境監(jiān)控系統(tǒng)調(diào)試自檢報告
評論
0/150
提交評論