版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
SQL語(yǔ)言在ACCESS數(shù)據(jù)庫(kù)中的應(yīng)用Access開(kāi)發(fā)人員參考SELECT語(yǔ)句(MicrosoftAccessSQL)指示MicrosoftAccess 數(shù)據(jù)庫(kù)引擎將數(shù)據(jù)庫(kù)中的信息作為一組記錄返回。語(yǔ)法SELECT[predicate]{*|table.*|[table.]field1[ASalias1][,[table.]field2[ASalias2][,...]]} FROMtableexpression[,...][INexternaldatabase] [WHERE...] [GROUPBY...] [HAVING...] [ORDERBY...] [WITHOWNERACCESSOPTION]SELECT語(yǔ)句包含以下部分:部分說(shuō)明predicate下列謂詞之一:ALL、DISTINCT、DISTINCTROW或TOP。可以使用謂詞來(lái)限定返回記錄的數(shù)量。如果沒(méi)有指定謂詞,則默認(rèn)值為ALL。*指定選擇指定表中的所有字段。table表的名稱,該表包含從中選擇記錄的字段。field1、field2字段名,這些字段包含了要檢索的數(shù)據(jù)。如果包括多個(gè)字段,將按它們的排列順序?qū)ζ溥M(jìn)行檢索。alias1和alias2用作列標(biāo)題的名稱,不是table中的原始列名。tableexpression表名稱,其中包含要檢索的數(shù)據(jù)。externaldatabase如果tableexpression中的表不在當(dāng)前數(shù)據(jù)庫(kù)中,則使用該參數(shù)指定該數(shù)據(jù)庫(kù)名。說(shuō)明若要執(zhí)行此項(xiàng)操作,Microsoft?Jet數(shù)據(jù)庫(kù)引擎會(huì)搜索指定的表,并提取選定的列,再選擇符合條件的行,然后按指定的順序?qū)Φ玫降男羞M(jìn)行排序或分組。SELECT語(yǔ)句不會(huì)更改數(shù)據(jù)庫(kù)中的數(shù)據(jù)。SELECT通常是SQL語(yǔ)句中的第一個(gè)詞。大多數(shù) SQL語(yǔ)句都是SELECT或SELECT...INTO語(yǔ)句。SELECT語(yǔ)句最簡(jiǎn)化的語(yǔ)法為:SELECTfieldsFROMtable可以通過(guò)星號(hào) (*) 來(lái)選擇表中所有的字段。以下的示例選擇在 Employees表中的所有字段:SELECT*FROMEmployees;如果一個(gè)字段名包括于 FROM子句內(nèi)的多個(gè)表中,請(qǐng)?jiān)谠撟侄吻懊婕由媳砻?.(圓點(diǎn))號(hào)。在下面的示例中,Department 字段同時(shí)存在于 Employees表和Supervisors表中。SQL語(yǔ)句從Employees表中選擇出部門并從 Supervisors表中選擇出主管名:SELECTEmployees.Department,Supervisors.SupvNameFROMEmployeesINNERJOINSupervisorsWHEREEmployees.Department=Supervisors.Department;創(chuàng)建Recordset 對(duì)象時(shí),MicrosoftJet 數(shù)據(jù)庫(kù)引擎將使用表的字段名作為 Recordset 對(duì)象中的Field 對(duì)象名。如果需要其他字段名或者名稱不適合用來(lái)生成該字段的表達(dá)式,請(qǐng)使用 AS保留字。以下示例使用標(biāo)題 Birth來(lái)命名生成的 Recordset 對(duì)象中的返回 Field 對(duì)象:SELECTBirthDateASBirthFROMEmployees;只要使用的聚合函數(shù)或查詢返回的是不明確的或重復(fù)的 Field 對(duì)象名稱,就必須使用 AS子句為該Field 對(duì)象另外提供一個(gè)替代名稱。以下示例使用標(biāo)題 HeadCount來(lái)命名生成的 Recordset 對(duì)象中的返回Field 對(duì)象:SELECTCOUNT(EmployeeID)ASHeadCountFROMEmployees;可以在SELECT語(yǔ)句中使用其他子句進(jìn)一步約束和組織所返回的數(shù)據(jù)。有關(guān)詳細(xì)信息,請(qǐng)參閱相應(yīng)子句的幫助主題。示例下面的一些示例假定Employees表中存在一個(gè)假想的Salary字段。請(qǐng)注意,該字段實(shí)際并不存在于羅斯文數(shù)據(jù)庫(kù)的Employees表中。本例基于SQL語(yǔ)句創(chuàng)建一個(gè)動(dòng)態(tài)集類型的Recordset,該語(yǔ)句選擇Employees表中所有記錄的LastName和FirstName字段。它調(diào)用EnumFields過(guò)程,該過(guò)程將Recordset對(duì)象的內(nèi)容顯示到調(diào)試窗口。SubSelectX1()DimdbsAsDatabase,rstAsRecordsetModifythislinetoincludethepathtoNorthwindonyourcomputer.Setdbs=OpenDatabase("Northwind.mdb")SelectthelastnameandfirstnamevaluesofallrecordsintheEmployeestable.Setrst=dbs.OpenRecordset("SELECTLastName,"_"FirstNameFROMEmployees;")Populatetherecordset.rst.MoveLast'CallEnumFieldstoprintthecontentsoftheRecordset.EnumFieldsrst,12dbs.CloseEndSub以下示例計(jì)算 PostalCode字段中有條目的記錄數(shù),并將返回的字段命名為 Tally。SubSelectX2()DimdbsAsDatabase,rstAsRecordsetModifythislinetoincludethepathtoNorthwindonyourcomputer.Setdbs=OpenDatabase("Northwind.mdb")CountthenumberofrecordswithaPostalCodevalueandreturnthetotalintheTallyfield."(PostalCode)ASTallyFROMCustomers;")PopulatetheRecordset.rst.MoveLastCallEnumFieldstoprintthecontentsoftheRecordset.Specifyfieldwidth=12.EnumFieldsrst,12dbs.CloseEndSub以下示例顯示雇員數(shù)以及平均薪水和最高薪水。SubSelectX3()DimdbsAsDatabase,rstAsRecordsetModifythislinetoincludethepathtoNorthwindonyourcomputer.Setdbs=OpenDatabase("Northwind.mdb")Countthenumberofemployees,calculatetheaveragesalary,andreturnthehighestsalary.Setrst=dbs.OpenRecordset("SELECTCount(*)"_"ASTotalEmployees,Avg(Salary)"_"ASAverageSalary,Max(Salary)"_"ASMaximumSalaryFROMEmployees;")PopulatetheRecordset.rst.MoveLastCallEnumFieldstoprintthecontentsoftheRecordset.PasstheRecordsetobjectanddesiredfieldwidth.EnumFieldsrst,17dbs.CloseEndSub調(diào)用過(guò)程向Sub過(guò)程EnumFields傳遞了一個(gè)Recordset對(duì)象。然后該過(guò)程設(shè)置Recordset的字段的格式并將這些字段顯示到調(diào)試窗口。intFldLen變量是需要的顯示字段寬度。有些字段可能會(huì)被截?cái)?。SubEnumFields(rstAsRecordset,intFldLenAsInteger)DimlngRecordsAsLong,lngFieldsAsLongDimlngRecCountAsLong,lngFldCountAsLongDimstrTitleAsString,strTempAsStringSetthelngRecordsvariabletothenumberofrecordsintheRecordset.lngRecords=rst.RecordCountSetthelngFieldsvariabletothenumberoffieldsintheRecordset.lngFields=rst.Fields.CountDebug.Print"Thereare"&lngRecords_"recordscontaining"&lngFields_"fieldsintherecordset."Debug.PrintFormastringtoprintthecolumnheading.strTitle="Record"ForlngFldCount=0TolngFields-1strTitle=strTitle_Left(rst.Fields(lngFldCount).Name_Space(intFldLen),intFldLen)NextlngFldCountPrintthecolumnheading.Debug.PrintstrTitleDebug.PrintLoopthroughtheRecordset;printtherecordnumberandfieldvalues.rst.MoveFirstForlngRecCount=0TolngRecords-1Debug.PrintRight(Space(6)&_Str(lngRecCount),6)&"";ForlngFldCount=0TolngFields-1'CheckforNullvalues.IfIsNull(rst.Fields(lngFldCount))ThenstrTemp="<null>"ElseSetstrTemptothefieldcontents.SelectCase_rst.Fields(lngFldCount).TypeCase11strTemp=""CasedbText,dbMemostrTemp=_rst.Fields(lngFldCount)CaseElsestrTemp=_str(rst.Fields(lngFldCount))EndSelectEndIfDebug.PrintLeft(strTemp_Space(intFldLen),intFldLen);NextlngFldCountDebug.Printrst.MoveNextNextlngRecCountEndSubAccess開(kāi)發(fā)人員參考SELECT...INTO 語(yǔ)句(MicrosoftAccessSQL)創(chuàng)建生成表查詢。語(yǔ)法SELECTfield1[,field2[,...]]INTOnewtable[INexternaldatabase] FROMsourceSELECT...INTO語(yǔ)句包含以下部分:部分 說(shuō)明field1、field2 要復(fù)制到新表中的字段的名稱。要?jiǎng)?chuàng)建的表的名稱。它必須符合標(biāo)準(zhǔn)命名約定。如果 newtable和現(xiàn)有表同名,會(huì)發(fā)生一個(gè)可捕捉newtable的錯(cuò)誤。externaldatabase 外部數(shù)據(jù)庫(kù)的路徑。有關(guān)路徑的說(shuō)明,請(qǐng)參閱 IN子句。source 從中選擇記錄的現(xiàn)有表的名稱。它可以是單個(gè)或多個(gè)表或查詢。說(shuō)明可以通過(guò)生成表查詢來(lái)存檔記錄,或制作表的備份副本,或者將副本導(dǎo)出到其他數(shù)據(jù)庫(kù),或作為某個(gè)特定時(shí)間段的數(shù)據(jù)的報(bào)表產(chǎn)生基礎(chǔ)。例如,可以通過(guò)每個(gè)月運(yùn)行相同的生成表查詢來(lái)生成一個(gè)月銷售區(qū)域報(bào)表。注釋您可能希望定義新表的主鍵。創(chuàng)建表時(shí),新表中的字段會(huì)繼承查詢的基表中每個(gè)字段的數(shù)據(jù)類型和字段大小,但不會(huì)傳輸其他字段或表屬性。若要將數(shù)據(jù)添加到現(xiàn)有表中,請(qǐng)使用 INSERTINTO語(yǔ)句,而不用創(chuàng)建追加查詢。若要在運(yùn)行生成表查詢之前查找出將要選擇哪些記錄,請(qǐng)先檢查使用相同選擇條件的SELECT語(yǔ)句的結(jié)果。示例以下示例選擇 Employees表中的所有記錄,并將它們復(fù)制到名為 EmpBackup的新表中。SubSelectIntoX()DimdbsAsDatabaseDimqdfAsQueryDefModifythislinetoincludethepathtoNorthwindonyourcomputer.Setdbs=OpenDatabase("Northwind.mdb")SelectallrecordsintheEmployeestableandcopythemintoanewtable,EmpBackup.dbs.Execute"SELECTEmployees.*INTO"_"[EmpBackup]FROMEmployees;"Deletethetablebecausethisisademonstration.dbs.Execute"DROPTABLE[EmpBackup];"dbs.CloseEndSubAccess開(kāi)發(fā)人員參考INSERTINTO 語(yǔ)句(MicrosoftAccessSQL)將一個(gè)或多個(gè)記錄添加到表中。該語(yǔ)句稱為追加查詢。語(yǔ)法多記錄追加查詢:INSERTINTOtarget[(field1[,field2[,...]])][INexternaldatabase]SELECT[source.]field1[,field2[,...]FROMtableexpression單記錄追加查詢:INSERTINTOtarget[(field1[,field2[,...]])] VALUES(value1[,value2[,...])INSERTINTO語(yǔ)句包含以下部分:部分targetfield1、field2externaldatabasesourcetableexpressionvalue1、value2
說(shuō)明要追加記錄的表或查詢的名稱。向其中追加數(shù)據(jù)的字段的名稱(如果在target參數(shù)之后),或獲取其中數(shù)據(jù)的字段的名稱(如果在source參數(shù)之后)。外部數(shù)據(jù)庫(kù)的路徑。有關(guān)路徑的說(shuō)明,請(qǐng)參閱 IN子句。要復(fù)制其中記錄的表或查詢的名稱。作為插入記錄來(lái)源的表的名稱。該參數(shù)可以是單個(gè)表名或者是從 INNERJOIN、LEFTJOIN或RIGHTJOIN操作或保存的查詢產(chǎn)生的組合結(jié)果。要插入新記錄特定字段中的值。每個(gè)值將插入到與該值在列表中的位置相對(duì)應(yīng)的字段內(nèi):value1將插入到新記錄的field1字段,value2插入到field2字段等等。這些值必須用逗號(hào)分隔,并且用引號(hào)('')引起來(lái)。說(shuō)明通過(guò)如上所述的單記錄追加查詢語(yǔ)法,可以使用 INSERTINTO語(yǔ)句向表中追加單個(gè)記錄。在這種情形下,代碼要指定每個(gè)記錄字段的名稱和值。必須指定每一個(gè)將被賦值的記錄字段,并且要給出該字段的值。如果沒(méi)有指定每個(gè)字段的值,則在缺少值的列中插入默認(rèn)值或 Null 值。記錄將追加到表的末尾。通過(guò)如上所示的多字段追加查詢語(yǔ)法的SELECT...FROM子句,還可以使用INSERTINTO追加一組來(lái)自其他表或查詢的記錄。這種情形下,SELECT子句指定將要追加到指定的target表中的字段。source或target表可以指定表或查詢。如果指定了查詢,MicrosoftAccess數(shù)據(jù)庫(kù)引擎會(huì)將記錄追加到查詢指定的任何表或所有表中。INSERTINTO是可選的,但是如果包括它,應(yīng)將它置于 SELECT語(yǔ)句前面。如果目標(biāo)表中包含主鍵,請(qǐng)確保追加到主鍵字段中的值是唯一的、非 Null 的;否則,MicrosoftAccess數(shù)據(jù)庫(kù)引擎不會(huì)追加這些記錄。如果將一個(gè)自動(dòng)編號(hào)字段記錄追加到一個(gè)表中,并且希望對(duì)該追加的記錄重新編號(hào),那么不要在查詢語(yǔ)句中包含自動(dòng)編號(hào)字段。如果希望保持字段的原始值,請(qǐng)務(wù)必在查詢語(yǔ)句中包含自動(dòng)編號(hào)字段。通過(guò)IN子句可以將記錄追加到其他數(shù)據(jù)庫(kù)的表中。若要新建表,請(qǐng)使用 SELECT...INTO語(yǔ)句來(lái)創(chuàng)建一個(gè)生成表查詢。若要在運(yùn)行追加查詢之前找出將要追加哪些記錄,可以先執(zhí)行使用同樣選擇條件的選擇查詢并查看其結(jié)果。追加查詢把記錄從一個(gè)或多個(gè)表復(fù)制到其他表中。包含所追加的記錄的表不會(huì)受追加查詢影響。如果不想從其他表中追加現(xiàn)有記錄,可以通過(guò) VALUES子句指定每個(gè)字段在新的單個(gè)記錄中的值。如果忽略了字段列表, VALUES子句必須包括該表中每個(gè)字段的值;否則, INSERT操作將會(huì)失敗。通過(guò)附加的帶有 VALUES子句的INSERTINTO語(yǔ)句,可以創(chuàng)建希望得到的每一個(gè)新增記錄。示例本例選擇假想的NewCustomers表中的所有記錄并將這些記錄添加到Customers表。如果未指定各個(gè)列,那么SELECT中的表列名必須與INSERTINTO中的表列名完全匹配。SubInsertIntoX1()DimdbsAsDatabaseModifythislinetoincludethepathtoNorthwindonyourcomputer.Setdbs=OpenDatabase("Northwind.mdb")SelectallrecordsintheNewCustomerstableandaddthemtotheCustomerstable.dbs.Execute"INSERTINTOCustomers"_"SELECT*"_"FROM[NewCustomers];"dbs.CloseEndSub以下示例在Employees表中創(chuàng)建一個(gè)新記錄。SubInsertIntoX2()DimdbsAsDatabaseModifythislinetoincludethepathtoNorthwindonyourcomputer.Setdbs=OpenDatabase("Northwind.mdb")CreateanewrecordintheEmployeestable.ThefirstnameisHarry,thelastnameisWashington,andthejobtitleisTrainee.dbs.Execute"INSERTINTOEmployees"_"(FirstName,LastName,Title)VALUES"_"('Harry','Washington','Trainee');"dbs.CloseEndSubAccess開(kāi)發(fā)人員參考UPDATE語(yǔ)句(MicrosoftAccessSQL)創(chuàng)建一個(gè)更新查詢,以便基于特定的條件更改指定表的字段值。語(yǔ)法UPDATEtable SETnewvalue WHEREcriteria;UPDATE語(yǔ)句包含以下部分:部分
說(shuō)明tablenewvaluecriteria
表名,該表包含要修改的數(shù)據(jù)。表達(dá)式,該表達(dá)式確定將要插入到已更新記錄的特定字段內(nèi)的值。表達(dá)式,用來(lái)確定將更新哪些記錄。只有滿足該表達(dá)式的記錄才會(huì)被更新。說(shuō)明當(dāng)需要更改多個(gè)記錄或者需要更改的記錄存在于多個(gè)表中時(shí), UPDATE語(yǔ)句是最有用的??梢酝瑫r(shí)更改多個(gè)字段。下面的示例把英國(guó)貨主的訂貨量的值增加百分之十,并且把運(yùn)費(fèi)的值增加百分之三。UPDATEOrdersSETOrderAmount=OrderAmount*1.1,Freight=Freight*1.03WHEREShipCountry='UK';UPDATE不會(huì)生成結(jié)果集。而且,使用更新查詢來(lái)更新記錄后,您不能取消該操作。如果希望了解已更新哪些記錄,請(qǐng)先檢查使用相同條件的選擇查詢的結(jié)果,然后再運(yùn)行更新查詢。不論什么時(shí)候都要維護(hù)數(shù)據(jù)的備份。如果更新了錯(cuò)誤記錄,您可以從備份副本中檢索這些記錄。示例以下示例將當(dāng)前的 ReportsTo值為2的所有雇員記錄的 ReportsTo字段中的值改為 5。SubUpdateX()DimdbsAsDatabaseDimqdfAsQueryDefModifythislinetoincludethepathtoNorthwindonyourcomputer.Setdbs=OpenDatabase("Northwind.mdb")ChangevaluesintheReportsTofieldto5forallemployeerecordsthatcurrentlyhaveReportsTovaluesof2.dbs.Execute"UPDATEEmployees"_"SETReportsTo=5"_"WHEREReportsTo=2;"dbs.CloseEndSubAccess開(kāi)發(fā)人員參考DELETE語(yǔ)句(MicrosoftAccessSQL)創(chuàng)建一個(gè)刪除查詢,用于從 FROM子句中列出的一個(gè)或多個(gè)表中刪除滿足 WHERE子句的記錄。語(yǔ)法DELETE[table.*] FROMtable WHEREcriteriaDELETE語(yǔ)句包含以下部分:部分
說(shuō)明tabletablecriteria
從中刪除記錄的表的名稱,可選。從中刪除記錄的表的名稱。表達(dá)式,用于確定要?jiǎng)h除哪些記錄。注解希望刪除多個(gè)記錄時(shí), DELETE語(yǔ)句特別有用。要從數(shù)據(jù)庫(kù)中刪除整個(gè)表,可以使用帶有DROP語(yǔ)句的Execute方法。但是,如果刪除表,表的結(jié)構(gòu)就會(huì)丟失;而使用DELETE語(yǔ)句時(shí),只會(huì)刪除表中的數(shù)據(jù),表的結(jié)構(gòu)和所有表屬性(如字段屬性和索引)將保持不變。可以使用DELETE從與其他表存在一對(duì)多關(guān)系的表中刪除記錄。當(dāng)查詢中刪除了關(guān)系的某一方中的相應(yīng)記錄時(shí),級(jí)聯(lián)刪除操作會(huì)刪除在關(guān)系的多方表中的相應(yīng)記錄。例如,在 “客戶”表和“訂單”表的關(guān)系中,“客戶”表是關(guān)系的一方,而 “訂單”表則是關(guān)系中的多方。如果指定了級(jí)聯(lián)刪除選項(xiàng),那么從“客戶”表中刪除一個(gè)記錄將導(dǎo)致 “訂單”表中相應(yīng)的記錄被刪除。刪除查詢將刪除整個(gè)記錄,而不僅僅刪除特定字段中的數(shù)據(jù)。如果要?jiǎng)h除特定字段的值,請(qǐng)創(chuàng)建一個(gè)更新查詢,將相應(yīng)字段的值更改為Null。要點(diǎn)使用刪除查詢刪除記錄后,無(wú)法取消該操作。如果要知道刪除了哪些記錄,先檢查使用相同條件的選擇查詢的結(jié)果,然后運(yùn)行刪除查詢。不論什么時(shí)候都要維護(hù)數(shù)據(jù)的備份。如果錯(cuò)刪了記錄,還可以從備份中檢索這些記錄。示例本例刪除職務(wù)為Trainee的雇員的所有記錄。當(dāng)FROM子句中僅包含一個(gè)表時(shí),您不必在DELETE語(yǔ)句中列出該表的名稱。SubDeleteX()DimdbsAsDatabase,rstAsRecordsetModifythislinetoincludethepathtoNorthwindonyourcomputer.Setdbs=OpenDatabase("Northwind.mdb")DeleteemployeerecordswheretitleisTrainee.dbs.Execute"DELETE*FROM"_"EmployeesWHERETitle='Trainee';"dbs.CloseEndSubAccess開(kāi)發(fā)人員參考EXECUTE
語(yǔ)句
(MicrosoftAccessSQL)用于啟動(dòng)過(guò)程的執(zhí)行。語(yǔ)法EXECUTEprocedure[param1[,param2[,
]]EXECUTE語(yǔ)句包含以下部分:部分
說(shuō)明procedure
要執(zhí)行的過(guò)程的名稱。param1,param2,
由過(guò)程定義的參數(shù)的值。示例以下示例將查詢命名為 CategoryList。以下示例調(diào)用 EnumFields過(guò)程,您可以在 SELECT語(yǔ)句示例中找到該過(guò)程。SubProcedureX()DimdbsAsDatabase,rstAsRecordsetDimqdfAsQueryDef,strSqlAsStringModifythislinetoincludethepathtoNorthwindonyourcomputer.Setdbs=OpenDatabase("Northwind.mdb")strSql="PROCEDURECategoryList;"_"SELECTDISTINCTROWCategoryName,"_"CategoryIDFROMCategories"_"ORDERBYCategoryName;"CreateanamedQueryDefbasedontheSQLstatement.Setqdf=dbs.CreateQueryDef("NewQry",strSql)Createatemporarysnapshot-typeRecordset.Setrst=qdf.OpenRecordset(dbOpenSnapshot)PopulatetheRecordset.rst.MoveLastCallEnumFieldstoprintthecontentsoftheRecordset.PasstheRecordsetobjectanddesiredfieldwidth.EnumFieldsrst,15DeletetheQueryDefbecausethisisademonstration.dbs.QueryDefs.Delete"NewQry"dbs.CloseEndSubAccess開(kāi)發(fā)人員參考TRANSACTION 語(yǔ)句(MicrosoftAccessSQL)用于初始化和結(jié)束顯式事務(wù)處理。語(yǔ)法初始化新事務(wù)處理。BEGINTRANSACTION通過(guò)提交事務(wù)處理期間執(zhí)行的所有工作來(lái)結(jié)束事務(wù)處理。COMMIT[TRANSACTION|WORK]通過(guò)回滾事務(wù)處理期間執(zhí)行的所有工作來(lái)結(jié)束事務(wù)處理。ROLLBACK[TRANSACTION|WORK]說(shuō)明事務(wù)處理不會(huì)自動(dòng)啟動(dòng)。若要啟動(dòng)一個(gè)事務(wù)處理,必須通過(guò) BEGINTRANSACTION進(jìn)行顯式調(diào)用。事務(wù)處理嵌套的最大深度為五級(jí)。若要啟動(dòng)一個(gè)嵌套事務(wù)處理,請(qǐng)?jiān)诂F(xiàn)有的事務(wù)處理上下文中使用BEGINTRANSACTION。鏈接表不支持事務(wù)處理。Access開(kāi)發(fā)人員參考TRANSFORM 語(yǔ)句(MicrosoftAccessSQL)創(chuàng)建交叉表查詢。語(yǔ)法TRANSFORMaggfunctionselectstatementPIVOTpivotfield[IN(value1[,value2[,...]])]TRANSFORM語(yǔ)句包含以下部分:部分說(shuō)明aggfunction對(duì)所選數(shù)據(jù)進(jìn)行計(jì)算的SQL聚合函數(shù)。selectstatementSELECT語(yǔ)句。pivotfield希望用于創(chuàng)建查詢結(jié)果集中列標(biāo)題的字段或表達(dá)式。value1、value2用于創(chuàng)建列標(biāo)題的固定值。說(shuō)明使用交叉表查詢匯總數(shù)據(jù)時(shí),將從作為列標(biāo)題的指定字段或表達(dá)式中選擇值,以便能夠以一種比使用選擇查詢更緊湊的方式來(lái)查看數(shù)據(jù)。TRANSFORM是可選的,但如果包括它,則應(yīng)為SQL字符串中的第一個(gè)語(yǔ)句。它在指定作為行標(biāo)題的字段的SELECT語(yǔ)句之前,在指定行分組方法的GROUPBY子句之前。您也可以包含其他子句(例如。指定其他選擇或排序條件的WHERE)。還可以在交叉表查詢中使用子查詢作為謂詞,特別是在WHERE子句中。pivotfield中返回的值作為查詢結(jié)果集中的列標(biāo)題。例如,在交叉表查詢中如果依據(jù)月銷售量來(lái)透視銷售數(shù)據(jù),將會(huì)創(chuàng)建12個(gè)列??梢约s束pivotfield以便從可選IN子句中所列出的固定值(value1,value2)內(nèi)選擇標(biāo)題。也可以包含固定值用于沒(méi)有數(shù)據(jù)來(lái)創(chuàng)建其他列的情況。示例以下示例使用SQLTRANSFORM子句創(chuàng)建交叉表查詢,以顯示每個(gè)雇員在1994年的每個(gè)日歷季度完成的訂單數(shù)。運(yùn)行此過(guò)程需要使用SQLTRANSFORMOutput函數(shù)。SubTransformX1()DimdbsAsDatabaseDimstrSQLAsStringDimqdfTRANSFORMAsQueryDefstrSQL="PARAMETERSprmYearSHORT;TRANSFORM"_"Count(OrderID)"_"SELECTFirstName&""""&LastNameAS"_"FullNameFROMEmployeesINNERJOINOrders"_"ONEmployees.EmployeeID="_"Orders.EmployeeIDWHEREDatePart"_"(""yyyy"",OrderDate)=[prmYear]"strSQL=strSQL&"GROUPBYFirstName&"_"""""&LastName"_"ORDERBYFirstName&""""&LastName"_"PIVOTDatePart(""q"",OrderDate)"ModifythislinetoincludethepathtoNorthwindonyourcomputer.Setdbs=OpenDatabase("Northwind.mdb")SetqdfTRANSFORM=dbs.CreateQueryDef_("",strSQL)SQLTRANSFORMOutputqdfTRANSFORM,1994dbs.CloseEndSub以下示例使用 SQLTRANSFORM子句創(chuàng)建一個(gè)稍微復(fù)雜的交叉表查詢,以顯示每個(gè)雇員在 1994年的每個(gè)日歷季度所完成的訂單的總金額(美元)。運(yùn)行此過(guò)程需要使用 SQLTRANSFORMOutput函數(shù)。SubTransformX2()DimdbsAsDatabaseDimstrSQLAsStringDimqdfTRANSFORMAsQueryDefstrSQL="PARAMETERSprmYearSMALLINT;TRANSFORM"_"Sum(Subtotal)SELECTFirstName&"""""_"&LastNameASFullName"_"FROMEmployeesINNERJOIN"_"(OrdersINNERJOIN[OrderSubtotals]"_"ONOrders.OrderID="_"[OrderSubtotals].OrderID)"_"ONEmployees.EmployeeID="_"Orders.EmployeeIDWHEREDatePart"_"(""yyyy"",OrderDate)=[prmYear]"strSQL=strSQL&"GROUPBYFirstName&"""""_"&LastName"_"ORDERBYFirstName&""""&LastName"_"PIVOTDatePart(""q"",OrderDate)"ModifythislinetoincludethepathtoNorthwindonyourcomputer.Setdbs=OpenDatabase("Northwind.mdb")SetqdfTRANSFORM=dbs.CreateQueryDef_("",strSQL)SQLTRANSFORMOutputqdfTRANSFORM,1994dbs.CloseEndSubFunctionSQLTRANSFORMOutput(qdfTempAsQueryDef,_intYearAsInteger)DimrstTRANSFORMAsRecordsetDimfldLoopAsFieldDimbooFirstAsBooleanqdfTemp.PARAMETERS!prmYear=intYearSetrstTRANSFORM=qdfTemp.OpenRecordset()Debug.PrintqdfTemp.SQLDebug.PrintDebug.Print,,"Quarter"WithrstTRANSFORMbooFirst=TrueForEachfldLoopIn.FieldsIfbooFirst=TrueThenDebug.PrintfldLoop.NameDebug.Print,;booFirst=FalseElseDebug.Print,fldLoop.Name;EndIfNextfldLoopDebug.PrintDoWhileNot.EOFbooFirst=TrueForEachfldLoopIn.FieldsIfbooFirst=TrueThenDebug.PrintfldLoopDebug.Print,;booFirst=FalseElseDebug.Print,fldLoop;EndIfNextfldLoopDebug.Print.MoveNextLoopEndWithEndFunctionAccess開(kāi)發(fā)人員參考INNERJOIN 操作(MicrosoftAccessSQL)只要兩個(gè)表的公共字段有匹配值,就將這兩個(gè)表中的記錄組合起來(lái)。語(yǔ)法FROMtable1INNERJOINtable2ONtable1.field1compoprtable2.field2INNERJOIN操作包含以下部分:部分說(shuō)明table1、要組合其中記錄的表的名稱。table2field1、被聯(lián)接的字段的名稱。如果它們不是數(shù)字,則這些字段的數(shù)據(jù)類型必須相同,并且包含同類數(shù)據(jù),但field2是,它們不必具有相同的名稱。compopr任何關(guān)系比較運(yùn)算符:“=、”“<、”“>、”“<=、”“>=或”“<>?!闭f(shuō)明可以在任何FROM子句中使用INNERJOIN操作。這是最常用的聯(lián)接類型。只要兩個(gè)表的公共字段上存在相匹配的值,Inner聯(lián)接就會(huì)組合這些表中的記錄??梢詫NNERJOIN用于Departments及Employees表,以選擇每個(gè)部門的所有雇員。相反,選擇所有部門(即使某些部門中并沒(méi)有分配雇員)或者所有雇員(即使某些雇員沒(méi)有分配到任何部門),則可以使用 LEFTJOIN或RIGHTJOIN操作來(lái)創(chuàng)建外部聯(lián)接。如果試圖聯(lián)接包含 Memo或OLE對(duì)象數(shù)據(jù)的字段,將產(chǎn)生錯(cuò)誤??梢月?lián)接任何兩個(gè)相似類型的數(shù)字字段。例如,可以聯(lián)接自動(dòng)編號(hào)和長(zhǎng)整型字段,因?yàn)樗鼈兙窍嗨祁愋?。然而,不能?lián)接單精度型和雙精度型類型字段。以下示例演示如何通過(guò) CategoryID字段聯(lián)接Categories和Products表:SELECTCategoryName,ProductNameFROMCategoriesINNERJOINProductsONCategories.CategoryID=Products.CategoryID;在前面的示例中,CategoryID是聯(lián)接字段,但是它不包含在查詢輸出中,因?yàn)樗话?SELECT語(yǔ)句中。若要包含聯(lián)接字段,請(qǐng)?jiān)?SELECT語(yǔ)句中包含該字段名,在本例中為:Categories.CategoryID也可以在JOIN語(yǔ)句中鏈接多個(gè) ON子句,請(qǐng)使用如下語(yǔ)法:SELECTfieldsFROMtable1INNERJOINtable2ONtable1.field1compoprtable2.field1ANDONtable1.field2compoprtable2.field2)ORONtable1.field3compoprtable2.field3)];也可以通過(guò)如下語(yǔ)法嵌套 JOIN語(yǔ)句:SELECTfieldsFROMtable1INNERJOIN(table2INNERJOIN[(]table3[INNERJOIN[(]tablex[INNERJOIN...)]ONtable3.field3compoprtablex.fieldx)]ONtable2.field2compoprtable3.field3)ONtable1.field1compoprtable2.field2;LEFTJOIN或RIGHTJOIN可以嵌套在INNERJOIN之中,但是INNERJOIN不能嵌套于LEFTJOIN或RIGHTJOIN之中。示例本例創(chuàng)建兩個(gè)等同聯(lián)接:一個(gè)是
OrderDetails
表與
Orders
表之間的聯(lián)接,另一個(gè)是
Orders
表與Employees
表之間的聯(lián)接。這是很有必要的,因?yàn)?/p>
Employees
表不包含銷售數(shù)據(jù),而
OrderDetails表不包含雇員數(shù)據(jù)。查詢將產(chǎn)生雇員及其總銷售額的列表。以下示例調(diào)用 EnumFields過(guò)程,您可以在 SELECT語(yǔ)句示例中找到該過(guò)程。SubInnerJoinX()DimdbsAsDatabase,rstAsRecordsetModifythislinetoincludethepathtoNorthwindonyourcomputer.Setdbs=OpenDatabase("Northwind.mdb")CreateajoinbetweentheOrderDetailsandOrderstablesandanotherbetweentheOrdersandEmployeestables.Getalistofemployeesandtheirtotalsales."Sum(UnitPrice*Quantity)ASSales,"_"(FirstName&Chr(32)&LastName)ASName"_"FROMEmployeesINNERJOIN(Orders"_"INNERJOIN[OrderDetails]"_"ON[OrderDetails].OrderID="_"Orders.OrderID)"_"ONOrders.EmployeeID="_"Employees.EmployeeID"_"GROUPBY(FirstName&Chr(32)&LastName);")PopulatetheRecordset.rst.MoveLastCallEnumFieldstoprintthecontentsoftheRecordset.PasstheRecordsetobjectanddesiredfieldwidth.EnumFieldsrst,20dbs.CloseEndSubAccess開(kāi)發(fā)人員參考LEFTJOIN 和RIGHTJOIN 操作(MicrosoftAccessSQL)在任何FROM子句中用于組合源表記錄。語(yǔ)法FROMtable1[LEFT|RIGHT]JOINtable2 ONtable1.field1compoprtable2.field2LEFTJOIN和RIGHTJOIN操作包含以下部分:部分 說(shuō)明table1、要組合其中記錄的表的名稱。table2被聯(lián)接的字段的名稱。這些字段必須具有相同的數(shù)據(jù)類型,并且包含相同類型的數(shù)據(jù),但它們不必field1、field2同名。compopr 任何關(guān)系比較運(yùn)算符:“=、”“<、”“>、”“<=、”“>=或”“<>?!闭f(shuō)明通過(guò)LEFTJOIN操作可以創(chuàng)建一個(gè)左外部聯(lián)接。左外部聯(lián)接包含兩個(gè)表中第一個(gè)(左)表中的所有記錄,即使在第二個(gè)(右)表中沒(méi)有匹配的記錄值。通過(guò)RIGHTJOIN操作可以創(chuàng)建一個(gè)右外部聯(lián)接。右外部聯(lián)接包含兩個(gè)表中第二個(gè)(右)表中的所有記錄,即使在第一個(gè)(左)表中沒(méi)有匹配的記錄值。例如,可以將LEFTJOIN用于Departments(左)和Employees(右)表以選擇所有部門,包括那些沒(méi)有被分配雇員的部門。若要選擇所有雇員,包括那些沒(méi)有被分配到任何部門的雇員,可以使用RIGHTJOIN。下面的示例展示了如何通過(guò)CategoryID字段聯(lián)接Categories表和Products表。該查詢將產(chǎn)生一個(gè)所有分類的列表,其中包括不包含任何產(chǎn)品的分類:SELECTCategoryName,ProductNameFROMCategoriesLEFTJOINProductsONCategories.CategoryID=Products.CategoryID;在以下示例中,CategoryID是聯(lián)接字段,但是它不包括在查詢結(jié)果中,因?yàn)樗鼪](méi)有包括在 SELECT語(yǔ)句中。若要包括聯(lián)接的字段,請(qǐng)?jiān)?SELECT語(yǔ)句中輸入字段名,在本例中為Categories.CategoryID。注釋若要?jiǎng)?chuàng)建一個(gè)只包括在聯(lián)接字段中具有相同數(shù)據(jù)的記錄,請(qǐng)使用 INNERJOIN操作。LEFTJOIN或RIGHTJOIN可以嵌套到INNERJOIN語(yǔ)句中,但是 INNERJOIN語(yǔ)句不能嵌套到LEFTJOIN或RIGHTJOIN語(yǔ)句中。請(qǐng)參閱INNERJOIN主題中有關(guān)嵌套的討論,以了解如何在其他聯(lián)接中嵌套聯(lián)接??梢枣溄佣鄠€(gè)ON子句。請(qǐng)參閱INNERJOIN主題中有關(guān)子句鏈接的討論,以了解如何操作。如果試圖聯(lián)接包含 Memo或OLE對(duì)象數(shù)據(jù)的字段,將產(chǎn)生錯(cuò)誤。示例本例假設(shè)Employees表中存在假想的DepartmentName和DepartmentID字段。請(qǐng)注意,這些字段并不實(shí)際存在于Northwind數(shù)據(jù)庫(kù)的Employees表中。以下示例選擇所有部門,包括那些沒(méi)有雇員的部門。以下示例調(diào)用 EnumFields過(guò)程,您可以在 SELECT語(yǔ)句示例中找到該過(guò)程。SubLeftRightJoinX()DimdbsAsDatabase,rstAsRecordsetModifythislinetoincludethepathtoNorthwindonyourcomputer.Setdbs=OpenDatabase("Northwind.mdb")Selectalldepartments,includingthosewithoutemployees.Setrst=dbs.OpenRecordset_("SELECT[DepartmentName],"_"FirstName&Chr(32)&LastNameASName"_"FROMDepartmentsLEFTJOINEmployees"_"ONDepartments.[DepartmentID]="_"Employees.[DepartmentID]"_"ORDERBY[DepartmentName];")PopulatetheRecordset.rst.MoveLastCallEnumFieldstoprintthecontentsoftheRecordset.PasstheRecordsetobjectanddesiredfieldwidth.EnumFieldsrst,20dbs.CloseEndSubAccess開(kāi)發(fā)人員參考UNION 操作(MicrosoftAccessSQL)創(chuàng)建聯(lián)合查詢,該查詢將兩個(gè)或兩個(gè)以上的獨(dú)立查詢或表的結(jié)果組合在一起。語(yǔ)法[TABLE]query1UNION[ALL][TABLE]query2[UNION[ALL][TABLE]queryn[ ]]UNION操作包含以下部分:部分 說(shuō)明query1-n 一個(gè)SELECT語(yǔ)句、存儲(chǔ)查詢的名稱或在 TABLE關(guān)鍵字后面的存儲(chǔ)表的名稱。注解可以在單個(gè)UNION操作中以任何組合方式合并兩個(gè)或兩個(gè)以上的查詢、表和 SELECT語(yǔ)句的結(jié)果。下面的示例將一個(gè)名為 NewAccounts 的現(xiàn)有表和一個(gè) SELECT語(yǔ)句進(jìn)行合并:TABLE[NewAccounts]UNIONALLSELECT*FROMCustomersWHEREOrderAmount>1000;默認(rèn)情況下,使用UNION操作時(shí)不會(huì)返回重復(fù)的記錄;但是,可以包含記錄。這樣也會(huì)使查詢運(yùn)行得更快。
ALL謂詞以確保返回所有在UNION操作中的所有查詢必須請(qǐng)求相同數(shù)量的字段;但是,這些字段不必都具有相同的大小或數(shù)據(jù)類型。請(qǐng)只在第一個(gè)
SELECT語(yǔ)句中使用別名,因?yàn)閯e名在其他語(yǔ)句中會(huì)被忽略。在
ORDERBY
子句中,請(qǐng)根據(jù)第一個(gè)
SELECT語(yǔ)句中使用的字段名來(lái)引用該字段。注釋可以在每個(gè)query參數(shù)中使用 GROUPBY或HAVING子句,以便對(duì)返回的數(shù)據(jù)進(jìn)行分組。可以在最后一個(gè) query參數(shù)的末尾使用 ORDERBY子句,以便按指定順序顯示返回?cái)?shù)據(jù)。示例以下示例檢索巴西的所有供應(yīng)商和客戶的名稱和所在城市。以下示例調(diào)用 EnumFields過(guò)程,您可以在 SELECT語(yǔ)句示例中找到該過(guò)程。SubUnionX()DimdbsAsDatabase,rstAsRecordsetModifythislinetoincludethepathtoNorthwindonyourcomputer.Setdbs=OpenDatabase("Northwind.mdb")RetrievethenamesandcitiesofallsuppliersandcustomersinBrazil."CityFROMSuppliers"_"WHERECountry='Brazil'UNION"_"SELECTCompanyName,CityFROMCustomers"_"WHERECountry='Brazil';")PopulatetheRecordset.rst.MoveLastCallEnumFieldstoprintthecontentsoftheRecordset.PasstheRecordsetobjectanddesiredfieldwidth.EnumFieldsrst,12dbs.CloseEndSubAccess開(kāi)發(fā)人員參考PARAMETERS 聲明(MicrosoftAccessSQL)聲明在參數(shù)查詢中的每個(gè)參數(shù)的名稱和數(shù)據(jù)類型。語(yǔ)法PARAMETERSnamedatatype[,namedatatype[,...]]PARAMETERS聲明包含以下部分:部分namedatatype
說(shuō)明參數(shù)的名稱。該名稱被賦給 Parameter 對(duì)象的Name屬性,并且用來(lái)在 Parameters 集合中標(biāo)識(shí)該參數(shù)。可以將name作為應(yīng)用程序運(yùn)行查詢時(shí)在對(duì)話框中顯示的字符串。請(qǐng)用方括號(hào) ([]) 將包含空格或標(biāo)點(diǎn)的文本括起來(lái)。例如, [Lowprice] 和[Beginreportwithwhichmonth?] 都是有效的name參數(shù)。主要MicrosoftAccessSQL數(shù)據(jù)類型或其同義詞之一。說(shuō)明對(duì)于定期運(yùn)行的查詢,可以通過(guò)PARAMETERS聲明來(lái)創(chuàng)建一個(gè)參數(shù)查詢。參數(shù)查詢能夠自動(dòng)處理查詢條件更改。若使用參數(shù)查詢,在每次查詢運(yùn)行時(shí)代碼都需要提供參數(shù)。PARAMETERS聲明是可選的,但如果包含它,應(yīng)將它置于任何其他語(yǔ)句(包括 SELECT語(yǔ)句)之前。如果聲明包含了多個(gè)參數(shù),請(qǐng)用逗號(hào)分隔它們。以下的示例里包含了兩個(gè)參數(shù):PARAMETERS[Lowprice]Currency,[Beginningdate]DateTime;在WHERE或HAVING子句中可以使用name參數(shù),不能使用datatype參數(shù)。以下的示例中要求提供兩個(gè)參數(shù),然后將該條件應(yīng)用于Orders表的記錄中:PARAMETERS[Lowprice]Currency,[Beginningdate]DateTime;SELECTOrderID,OrderAmountFROMOrdersWHEREOrderAmount>[Lowprice]ANDOrderDate>=[Beginningdate];示例本示例要求用戶提供職務(wù),然后使用該職務(wù)作為查詢條件。本示例調(diào)用EnumFields過(guò)程,您可以在 SELECT語(yǔ)句示例中找到該過(guò)程。SubParametersX()DimdbsAsDatabase,qdfAsQueryDefDimrstAsRecordsetDimstrSqlAsString,strParmAsStringDimstrMessageAsStringDimintCommandAsIntegerModifythislinetoincludethepathtoNorthwindonyourcomputer.Setdbs=OpenDatabase("NorthWind.mdb")'Definetheparametersclause.strParm="PARAMETERS[EmployeeTitle]CHAR;"DefineanSQLstatementwiththeparametersclause.strSql=strParm&"SELECTLastName,FirstName,"_"EmployeeID"_"FROMEmployees"_"WHERETitle=[EmployeeTitle];"CreateaQueryDefobjectbasedontheSQLstatement.Setqdf=dbs.CreateQueryDef_("FindEmployees",strSql)DoWhileTruestrMessage="FindEmployeesbyJob"_"title:"&Chr(13)_"ChooseJobTitle:"&Chr(13)_"1-SalesManager"&Chr(13)_"2-SalesRepresentative"&Chr(13)_"3-InsideSalesCoordinator"intCommand=Val(InputBox(strMessage))SelectCaseintCommandCase1qdf("EmployeeTitle")=_"SalesManager"Case2qdf("EmployeeTitle")=_"SalesRepresentative"Case3qdf("EmployeeTitle")=_"InsideSalesCoordinator"CaseElseExitDoEndSelectCreateatemporarysnapshot-typeRecordset.Setrst=qdf.OpenRecordset(dbOpenSnapshot)PopulatetheRecordset.rst.MoveLastCallEnumFieldstoprintthecontentsoftheRecordset.PasstheRecordsetobjectanddesiredfieldwidth.EnumFieldsrst,12LoopDeletetheQueryDefbecausethisisademonstration.dbs.QueryDefs.Delete"FindEmployees"dbs.CloseEndSubAccess開(kāi)發(fā)人員參考WITHOWNERACCESSOPTION 聲明(MicrosoftAccessSQL)在使用安全工作組的多用戶環(huán)境中,通過(guò)對(duì)查詢使用這個(gè)聲明,可以向執(zhí)行該查詢的用戶授予與查詢所有者同等的權(quán)限。語(yǔ)法sqlstatement WITHOWNERACCESSOPTION說(shuō)明WITHOWNERACCESSOPTION聲明是可選的。下面的示例使用戶能夠查看到薪金信息(即使該用戶并不擁有查看 Payroll表的權(quán)限,并假設(shè)查詢的SELECTLastName,FirstName,SalaryFROMEmployeesORDERBYLastNameWITHOWNERACCESSOPTION;如果要禁止用戶創(chuàng)建表或在表中添加記錄,可以使用
WITHOWNERACCESSOPTION
來(lái)讓用戶能夠運(yùn)行生成表 追加查詢。如果希望應(yīng)用工作組安全設(shè)置和用戶的權(quán)限,請(qǐng)不要包含
WITHOWNERACCESSOPTION
聲明。這個(gè)選項(xiàng)需要您有權(quán)訪問(wèn)與數(shù)據(jù)庫(kù)關(guān)聯(lián)的
System.mdw
文件。它僅在安全的多用戶實(shí)現(xiàn)中才是有用的。Access開(kāi)發(fā)人員參考PROCEDURE子句(MicrosoftAccessSQL)定義查詢的名稱和可選參數(shù)。注釋PROCEDURE子句已經(jīng)被PROCEDURE語(yǔ)句所取代。雖然現(xiàn)在仍然支持PROCEDURE子句,但是PROCEDURE語(yǔ)句提供了兼容PROCEDURE子句的超集,并且它是推薦使用的語(yǔ)法。語(yǔ)法PROCEDUREname[param1datatype[,param2datatype[,...]]PROCEDURE子句包含以下部分:部分 說(shuō)明name 過(guò)程名稱。它必須遵循標(biāo)準(zhǔn)命名規(guī)則。一個(gè)或多個(gè)字段名或者參數(shù)。例如:param1、PROCEDURESales_By_Country[BeginningDate]DateTime,param2[EndingDate]DateTime;有關(guān)參數(shù)的詳細(xì)信息,請(qǐng)參閱 parameters。datatype 主要MicrosoftAccessSQL數(shù)據(jù)類型或其同義詞之一。說(shuō)明SQL過(guò)程由例如,過(guò)程
PROCEDURE子句(指定該過(guò)程的名稱)、可選的參數(shù)定義列表和一個(gè)Get_Part_Number 將運(yùn)行一個(gè)用來(lái)檢索指定配件號(hào)碼的查詢。
SQL語(yǔ)句組成。注釋如果子句包含多個(gè)字段定義(即有多個(gè) param-datatype 對(duì)),請(qǐng)使用逗號(hào)分隔它們。PROCEDURE子句的后面必須跟隨 SQL語(yǔ)句(例如,SELECT或UPDATE語(yǔ)句)。示例以下示例將查詢命名為 CategoryList。以下示例調(diào)用 EnumFields過(guò)程,您可以在 SELECT語(yǔ)句示例中找到該過(guò)程。SubProcedureX()DimdbsAsDatabase,rstAsRecordsetDimqdfAsQueryDef,strSqlAsStringModifythislinetoincludethepathtoNorthwindonyourcomputer.Setdbs=OpenDatabase("Northwind.mdb")strSql="PROCEDURECategoryList;"_"SELECTDISTINCTROWCategoryName,"_"CategoryIDFROMCategories"_"ORDERBYCategoryName;"CreateanamedQueryDefbasedontheSQLstatement.Setqdf=dbs.CreateQueryDef("NewQry",strSql)Createatemporarysnapshot-typeRecordset.Setrst=qdf.OpenRecordset(dbOpenSnapshot)PopulatetheRecordset.rst.MoveLastCallEnumFieldstoprintthecontentsoftheRecordset.PasstheRecordsetobjectanddesiredfieldwidth.EnumFieldsrst,15DeletetheQueryDefbecausethisisademonstration.dbs.QueryDefs.Delete"NewQry"dbs.CloseEndSubAccess開(kāi)發(fā)人員參考SQL子查詢(MicrosoftAccessSQL)子查詢是一個(gè)SELECT語(yǔ)句,它嵌套在SELECT、SELECT...INTO、INSERT...INTO、DELETE或UPDATE語(yǔ)句中,或嵌套在另一個(gè)子查詢中。語(yǔ)法可以通過(guò)三種語(yǔ)法形式來(lái)創(chuàng)建子查詢:comparison[ANY|ALL|SOME](sqlstatement)expression[NOT]IN(sqlstatement)[NOT]EXISTS(sqlstatement)子查詢語(yǔ)句包含了以下部分:部分
說(shuō)明comparisonexpressionsqlstatement
表達(dá)式和比較運(yùn)算符,用于對(duì)表達(dá)式與子查詢的結(jié)果進(jìn)行比較。表達(dá)式,用來(lái)搜索子查詢的結(jié)果集。SELECT語(yǔ)句,遵循和任何其他 SELECT語(yǔ)句一樣的格式和規(guī)則。它必須用圓括號(hào)括起來(lái)。注解可以在SELECT語(yǔ)句的字段列表中、在 WHERE子句中或在 HAVING子句中使用子查詢來(lái)代替表達(dá)式。在子查詢中,可以使用SELECT語(yǔ)句來(lái)提供一組要在WHERE或HAVING子句表達(dá)式中計(jì)算的一個(gè)或多個(gè)特定值。通過(guò)同義的ANY或SOME謂詞,可以檢索在主查詢的記錄中滿足與子查詢所檢索出的任何記錄進(jìn)行比較的比較條件的記錄。下面的示例返回那些單價(jià)高于以25%或更高折扣出售的任何產(chǎn)品的單價(jià)的產(chǎn)品:SELECT*FROMProductsWHEREUnitPrice>ANY(SELECTUnitPriceFROMOrderDetailsWHEREDiscount>=.25);使用ALL謂詞可以在主查詢中只檢索滿足子查詢中檢索的所有記錄的比較條件的記錄。如果將前面的示例中的ANY改為ALL,查詢將只返回那些單價(jià)高于以25%或更高折扣出售的所有產(chǎn)品單價(jià)的產(chǎn)品。它的限制性更強(qiáng)。通過(guò)IN謂詞可以只檢索出在主查詢的記錄中作為子查詢的一部分記錄而包含相同值的記錄。下面的示例返回所有以25%或更高折扣出售的所有產(chǎn)品:SELECT*FROMProductsWHEREProductIDIN(SELECTProductIDFROMOrderDetailsWHEREDiscount>=.25);相應(yīng)地,可以使用NOTIN來(lái)僅檢索出在主查詢的記錄中作為子查詢的記錄而不包含相同值的記錄。在True/False比較條件中使用EXISTS謂詞(帶有可選的NOT保留字)可確定子查詢是否返回任何記錄。也可以在子查詢中使用表名的別名來(lái)引用在子查詢外部的FROM子句中列出的表。以下示例返回薪水等于或高于具有同等職稱的所有雇員平均薪水的雇員的姓名。Employees表別名為“T1:”SELECTLastName,FirstName,Title,SalaryFROMEmployeesAST1WHERESalary>=(SELECTAvg(Salary)FROMEmployeesWHERET1.Title=Employees.Title)OrderbyTitle;在前面的示例中,
AS保留字是可選的。允許一些子查詢用在交叉表查詢中,特別是作為謂詞(在
WHERE子句中的謂詞)。不允許將作為輸出的子查詢(在
SELECT列表中)用在交叉表查詢中。示例以下示例列出在 1995年第二季度下過(guò)訂單的每個(gè)客戶的名稱和聯(lián)系人。以下示例調(diào)用 EnumFields過(guò)程,您可以在 SELECT語(yǔ)句示例中找到該過(guò)程。SubSubQueryX()DimdbsAsDatabase,rstAsRecordsetModifythislinetoincludethepathtoNorthwindonyourcomputer.Setdbs=OpenDatabase("Northwind.mdb")Listthenameandcontactofeverycustomerwhoplacedanorderinthesecondquarterof1995.Setrst=dbs.OpenRecordset("SELECTContactName,"_"CompanyName,ContactTitle,Phone"_"FROMCustomers"_"WHERECustomerID"_"IN(SELECTCustomerIDFROMOrders"_"WHEREOrderDateBetween#04/1/95#"_"And#07/1/95#);")PopulatetheRecordset.rst.MoveLastCallEnumFieldstoprintthecontentsoftheRecordset.PasstheRecordsetobjectanddesiredfieldwidth.EnumFieldsrst,25dbs.CloseEndSubAccess開(kāi)發(fā)人員參考ALL、DISTINCT 、DISTINCTROW 和TOP謂詞(Micros
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024太陽(yáng)能光伏組件安裝與售后保障服務(wù)合同3篇
- 定制湯料合同范例
- 美業(yè)用工合同范例
- 淘寶買賣拍攝合同范例
- 合同范例政府蓋章
- 汽車分期違約金合同范例
- 美發(fā)店勞務(wù)合同范例
- 分包單位簽合同范例
- 小區(qū)保潔用工合同范例
- 裝飾工程發(fā)包合同范例
- GB/T 29309-2012電工電子產(chǎn)品加速應(yīng)力試驗(yàn)規(guī)程高加速壽命試驗(yàn)導(dǎo)則
- GB 29216-2012食品安全國(guó)家標(biāo)準(zhǔn)食品添加劑丙二醇
- 齊魯工業(yè)大學(xué)信息管理學(xué)成考復(fù)習(xí)資料
- 公務(wù)員面試-自我認(rèn)知與職位匹配課件
- 中頻電治療儀操作培訓(xùn)課件
- 柔弱的人課文課件
- 動(dòng)物寄生蟲(chóng)病學(xué)課件
- 電梯曳引系統(tǒng)設(shè)計(jì)-畢業(yè)設(shè)計(jì)
- 三度房室傳導(dǎo)阻滯護(hù)理查房課件
- 講課比賽精品PPT-全概率公式貝葉斯公式-概率論與數(shù)理統(tǒng)計(jì)
- 藥理學(xué)39人工合成抗菌藥課件
評(píng)論
0/150
提交評(píng)論