




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
SQL語言在ACCESS數(shù)據(jù)庫中的應用Access開發(fā)人員參考SELECT語句(MicrosoftAccessSQL)指示MicrosoftAccess 數(shù)據(jù)庫引擎將數(shù)據(jù)庫中的信息作為一組記錄返回。語法SELECT[predicate]{*|table.*|[table.]field1[ASalias1][,[table.]field2[ASalias2][,...]]} FROMtableexpression[,...][INexternaldatabase] [WHERE...] [GROUPBY...] [HAVING...] [ORDERBY...] [WITHOWNERACCESSOPTION]SELECT語句包含以下部分:部分說明predicate下列謂詞之一:ALL、DISTINCT、DISTINCTROW或TOP??梢允褂弥^詞來限定返回記錄的數(shù)量。如果沒有指定謂詞,則默認值為ALL。*指定選擇指定表中的所有字段。table表的名稱,該表包含從中選擇記錄的字段。field1、field2字段名,這些字段包含了要檢索的數(shù)據(jù)。如果包括多個字段,將按它們的排列順序對其進行檢索。alias1和alias2用作列標題的名稱,不是table中的原始列名。tableexpression表名稱,其中包含要檢索的數(shù)據(jù)。externaldatabase如果tableexpression中的表不在當前數(shù)據(jù)庫中,則使用該參數(shù)指定該數(shù)據(jù)庫名。說明若要執(zhí)行此項操作,Microsoft?Jet數(shù)據(jù)庫引擎會搜索指定的表,并提取選定的列,再選擇符合條件的行,然后按指定的順序對得到的行進行排序或分組。SELECT語句不會更改數(shù)據(jù)庫中的數(shù)據(jù)。SELECT通常是SQL語句中的第一個詞。大多數(shù) SQL語句都是SELECT或SELECT...INTO語句。SELECT語句最簡化的語法為:SELECTfieldsFROMtable可以通過星號 (*) 來選擇表中所有的字段。以下的示例選擇在 Employees表中的所有字段:SELECT*FROMEmployees;如果一個字段名包括于 FROM子句內的多個表中,請在該字段前面加上表名和 .(圓點)號。在下面的示例中,Department 字段同時存在于 Employees表和Supervisors表中。SQL語句從Employees表中選擇出部門并從 Supervisors表中選擇出主管名:SELECTEmployees.Department,Supervisors.SupvNameFROMEmployeesINNERJOINSupervisorsWHEREEmployees.Department=Supervisors.Department;創(chuàng)建Recordset 對象時,MicrosoftJet 數(shù)據(jù)庫引擎將使用表的字段名作為 Recordset 對象中的Field 對象名。如果需要其他字段名或者名稱不適合用來生成該字段的表達式,請使用 AS保留字。以下示例使用標題 Birth來命名生成的 Recordset 對象中的返回 Field 對象:SELECTBirthDateASBirthFROMEmployees;只要使用的聚合函數(shù)或查詢返回的是不明確的或重復的 Field 對象名稱,就必須使用 AS子句為該Field 對象另外提供一個替代名稱。以下示例使用標題 HeadCount來命名生成的 Recordset 對象中的返回Field 對象:SELECTCOUNT(EmployeeID)ASHeadCountFROMEmployees;可以在SELECT語句中使用其他子句進一步約束和組織所返回的數(shù)據(jù)。有關詳細信息,請參閱相應子句的幫助主題。示例下面的一些示例假定Employees表中存在一個假想的Salary字段。請注意,該字段實際并不存在于羅斯文數(shù)據(jù)庫的Employees表中。本例基于SQL語句創(chuàng)建一個動態(tài)集類型的Recordset,該語句選擇Employees表中所有記錄的LastName和FirstName字段。它調用EnumFields過程,該過程將Recordset對象的內容顯示到調試窗口。SubSelectX1()DimdbsAsDatabase,rstAsRecordsetModifythislinetoincludethepathtoNorthwindonyourcomputer.Setdbs=OpenDatabase("Northwind.mdb")SelectthelastnameandfirstnamevaluesofallrecordsintheEmployeestable.Setrst=dbs.OpenRecordset("SELECTLastName,"_"FirstNameFROMEmployees;")Populatetherecordset.rst.MoveLast'CallEnumFieldstoprintthecontentsoftheRecordset.EnumFieldsrst,12dbs.CloseEndSub以下示例計算 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調用過程向Sub過程EnumFields傳遞了一個Recordset對象。然后該過程設置Recordset的字段的格式并將這些字段顯示到調試窗口。intFldLen變量是需要的顯示字段寬度。有些字段可能會被截斷。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開發(fā)人員參考SELECT...INTO 語句(MicrosoftAccessSQL)創(chuàng)建生成表查詢。語法SELECTfield1[,field2[,...]]INTOnewtable[INexternaldatabase] FROMsourceSELECT...INTO語句包含以下部分:部分 說明field1、field2 要復制到新表中的字段的名稱。要創(chuàng)建的表的名稱。它必須符合標準命名約定。如果 newtable和現(xiàn)有表同名,會發(fā)生一個可捕捉newtable的錯誤。externaldatabase 外部數(shù)據(jù)庫的路徑。有關路徑的說明,請參閱 IN子句。source 從中選擇記錄的現(xiàn)有表的名稱。它可以是單個或多個表或查詢。說明可以通過生成表查詢來存檔記錄,或制作表的備份副本,或者將副本導出到其他數(shù)據(jù)庫,或作為某個特定時間段的數(shù)據(jù)的報表產生基礎。例如,可以通過每個月運行相同的生成表查詢來生成一個月銷售區(qū)域報表。注釋您可能希望定義新表的主鍵。創(chuàng)建表時,新表中的字段會繼承查詢的基表中每個字段的數(shù)據(jù)類型和字段大小,但不會傳輸其他字段或表屬性。若要將數(shù)據(jù)添加到現(xiàn)有表中,請使用 INSERTINTO語句,而不用創(chuàng)建追加查詢。若要在運行生成表查詢之前查找出將要選擇哪些記錄,請先檢查使用相同選擇條件的SELECT語句的結果。示例以下示例選擇 Employees表中的所有記錄,并將它們復制到名為 EmpBackup的新表中。SubSelectIntoX()DimdbsAsDatabaseDimqdfAsQueryDefModifythislinetoincludethepathtoNorthwindonyourcomputer.Setdbs=OpenDatabase("Northwind.mdb")SelectallrecordsintheEmployeestableandcopythemintoanewtable,EmpBackup.dbs.Execute"SELECTEmployees.*INTO"_"[EmpBackup]FROMEmployees;"Deletethetablebecausethisisademonstration.dbs.Execute"DROPTABLE[EmpBackup];"dbs.CloseEndSubAccess開發(fā)人員參考INSERTINTO 語句(MicrosoftAccessSQL)將一個或多個記錄添加到表中。該語句稱為追加查詢。語法多記錄追加查詢:INSERTINTOtarget[(field1[,field2[,...]])][INexternaldatabase]SELECT[source.]field1[,field2[,...]FROMtableexpression單記錄追加查詢:INSERTINTOtarget[(field1[,field2[,...]])] VALUES(value1[,value2[,...])INSERTINTO語句包含以下部分:部分targetfield1、field2externaldatabasesourcetableexpressionvalue1、value2
說明要追加記錄的表或查詢的名稱。向其中追加數(shù)據(jù)的字段的名稱(如果在target參數(shù)之后),或獲取其中數(shù)據(jù)的字段的名稱(如果在source參數(shù)之后)。外部數(shù)據(jù)庫的路徑。有關路徑的說明,請參閱 IN子句。要復制其中記錄的表或查詢的名稱。作為插入記錄來源的表的名稱。該參數(shù)可以是單個表名或者是從 INNERJOIN、LEFTJOIN或RIGHTJOIN操作或保存的查詢產生的組合結果。要插入新記錄特定字段中的值。每個值將插入到與該值在列表中的位置相對應的字段內:value1將插入到新記錄的field1字段,value2插入到field2字段等等。這些值必須用逗號分隔,并且用引號('')引起來。說明通過如上所述的單記錄追加查詢語法,可以使用 INSERTINTO語句向表中追加單個記錄。在這種情形下,代碼要指定每個記錄字段的名稱和值。必須指定每一個將被賦值的記錄字段,并且要給出該字段的值。如果沒有指定每個字段的值,則在缺少值的列中插入默認值或 Null 值。記錄將追加到表的末尾。通過如上所示的多字段追加查詢語法的SELECT...FROM子句,還可以使用INSERTINTO追加一組來自其他表或查詢的記錄。這種情形下,SELECT子句指定將要追加到指定的target表中的字段。source或target表可以指定表或查詢。如果指定了查詢,MicrosoftAccess數(shù)據(jù)庫引擎會將記錄追加到查詢指定的任何表或所有表中。INSERTINTO是可選的,但是如果包括它,應將它置于 SELECT語句前面。如果目標表中包含主鍵,請確保追加到主鍵字段中的值是唯一的、非 Null 的;否則,MicrosoftAccess數(shù)據(jù)庫引擎不會追加這些記錄。如果將一個自動編號字段記錄追加到一個表中,并且希望對該追加的記錄重新編號,那么不要在查詢語句中包含自動編號字段。如果希望保持字段的原始值,請務必在查詢語句中包含自動編號字段。通過IN子句可以將記錄追加到其他數(shù)據(jù)庫的表中。若要新建表,請使用 SELECT...INTO語句來創(chuàng)建一個生成表查詢。若要在運行追加查詢之前找出將要追加哪些記錄,可以先執(zhí)行使用同樣選擇條件的選擇查詢并查看其結果。追加查詢把記錄從一個或多個表復制到其他表中。包含所追加的記錄的表不會受追加查詢影響。如果不想從其他表中追加現(xiàn)有記錄,可以通過 VALUES子句指定每個字段在新的單個記錄中的值。如果忽略了字段列表, VALUES子句必須包括該表中每個字段的值;否則, INSERT操作將會失敗。通過附加的帶有 VALUES子句的INSERTINTO語句,可以創(chuàng)建希望得到的每一個新增記錄。示例本例選擇假想的NewCustomers表中的所有記錄并將這些記錄添加到Customers表。如果未指定各個列,那么SELECT中的表列名必須與INSERTINTO中的表列名完全匹配。SubInsertIntoX1()DimdbsAsDatabaseModifythislinetoincludethepathtoNorthwindonyourcomputer.Setdbs=OpenDatabase("Northwind.mdb")SelectallrecordsintheNewCustomerstableandaddthemtotheCustomerstable.dbs.Execute"INSERTINTOCustomers"_"SELECT*"_"FROM[NewCustomers];"dbs.CloseEndSub以下示例在Employees表中創(chuàng)建一個新記錄。SubInsertIntoX2()DimdbsAsDatabaseModifythislinetoincludethepathtoNorthwindonyourcomputer.Setdbs=OpenDatabase("Northwind.mdb")CreateanewrecordintheEmployeestable.ThefirstnameisHarry,thelastnameisWashington,andthejobtitleisTrainee.dbs.Execute"INSERTINTOEmployees"_"(FirstName,LastName,Title)VALUES"_"('Harry','Washington','Trainee');"dbs.CloseEndSubAccess開發(fā)人員參考UPDATE語句(MicrosoftAccessSQL)創(chuàng)建一個更新查詢,以便基于特定的條件更改指定表的字段值。語法UPDATEtable SETnewvalue WHEREcriteria;UPDATE語句包含以下部分:部分
說明tablenewvaluecriteria
表名,該表包含要修改的數(shù)據(jù)。表達式,該表達式確定將要插入到已更新記錄的特定字段內的值。表達式,用來確定將更新哪些記錄。只有滿足該表達式的記錄才會被更新。說明當需要更改多個記錄或者需要更改的記錄存在于多個表中時, UPDATE語句是最有用的??梢酝瑫r更改多個字段。下面的示例把英國貨主的訂貨量的值增加百分之十,并且把運費的值增加百分之三。UPDATEOrdersSETOrderAmount=OrderAmount*1.1,Freight=Freight*1.03WHEREShipCountry='UK';UPDATE不會生成結果集。而且,使用更新查詢來更新記錄后,您不能取消該操作。如果希望了解已更新哪些記錄,請先檢查使用相同條件的選擇查詢的結果,然后再運行更新查詢。不論什么時候都要維護數(shù)據(jù)的備份。如果更新了錯誤記錄,您可以從備份副本中檢索這些記錄。示例以下示例將當前的 ReportsTo值為2的所有雇員記錄的 ReportsTo字段中的值改為 5。SubUpdateX()DimdbsAsDatabaseDimqdfAsQueryDefModifythislinetoincludethepathtoNorthwindonyourcomputer.Setdbs=OpenDatabase("Northwind.mdb")ChangevaluesintheReportsTofieldto5forallemployeerecordsthatcurrentlyhaveReportsTovaluesof2.dbs.Execute"UPDATEEmployees"_"SETReportsTo=5"_"WHEREReportsTo=2;"dbs.CloseEndSubAccess開發(fā)人員參考DELETE語句(MicrosoftAccessSQL)創(chuàng)建一個刪除查詢,用于從 FROM子句中列出的一個或多個表中刪除滿足 WHERE子句的記錄。語法DELETE[table.*] FROMtable WHEREcriteriaDELETE語句包含以下部分:部分
說明tabletablecriteria
從中刪除記錄的表的名稱,可選。從中刪除記錄的表的名稱。表達式,用于確定要刪除哪些記錄。注解希望刪除多個記錄時, DELETE語句特別有用。要從數(shù)據(jù)庫中刪除整個表,可以使用帶有DROP語句的Execute方法。但是,如果刪除表,表的結構就會丟失;而使用DELETE語句時,只會刪除表中的數(shù)據(jù),表的結構和所有表屬性(如字段屬性和索引)將保持不變??梢允褂肈ELETE從與其他表存在一對多關系的表中刪除記錄。當查詢中刪除了關系的某一方中的相應記錄時,級聯(lián)刪除操作會刪除在關系的多方表中的相應記錄。例如,在 “客戶”表和“訂單”表的關系中,“客戶”表是關系的一方,而 “訂單”表則是關系中的多方。如果指定了級聯(lián)刪除選項,那么從“客戶”表中刪除一個記錄將導致 “訂單”表中相應的記錄被刪除。刪除查詢將刪除整個記錄,而不僅僅刪除特定字段中的數(shù)據(jù)。如果要刪除特定字段的值,請創(chuàng)建一個更新查詢,將相應字段的值更改為Null。要點使用刪除查詢刪除記錄后,無法取消該操作。如果要知道刪除了哪些記錄,先檢查使用相同條件的選擇查詢的結果,然后運行刪除查詢。不論什么時候都要維護數(shù)據(jù)的備份。如果錯刪了記錄,還可以從備份中檢索這些記錄。示例本例刪除職務為Trainee的雇員的所有記錄。當FROM子句中僅包含一個表時,您不必在DELETE語句中列出該表的名稱。SubDeleteX()DimdbsAsDatabase,rstAsRecordsetModifythislinetoincludethepathtoNorthwindonyourcomputer.Setdbs=OpenDatabase("Northwind.mdb")DeleteemployeerecordswheretitleisTrainee.dbs.Execute"DELETE*FROM"_"EmployeesWHERETitle='Trainee';"dbs.CloseEndSubAccess開發(fā)人員參考EXECUTE
語句
(MicrosoftAccessSQL)用于啟動過程的執(zhí)行。語法EXECUTEprocedure[param1[,param2[,
]]EXECUTE語句包含以下部分:部分
說明procedure
要執(zhí)行的過程的名稱。param1,param2,
由過程定義的參數(shù)的值。示例以下示例將查詢命名為 CategoryList。以下示例調用 EnumFields過程,您可以在 SELECT語句示例中找到該過程。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開發(fā)人員參考TRANSACTION 語句(MicrosoftAccessSQL)用于初始化和結束顯式事務處理。語法初始化新事務處理。BEGINTRANSACTION通過提交事務處理期間執(zhí)行的所有工作來結束事務處理。COMMIT[TRANSACTION|WORK]通過回滾事務處理期間執(zhí)行的所有工作來結束事務處理。ROLLBACK[TRANSACTION|WORK]說明事務處理不會自動啟動。若要啟動一個事務處理,必須通過 BEGINTRANSACTION進行顯式調用。事務處理嵌套的最大深度為五級。若要啟動一個嵌套事務處理,請在現(xiàn)有的事務處理上下文中使用BEGINTRANSACTION。鏈接表不支持事務處理。Access開發(fā)人員參考TRANSFORM 語句(MicrosoftAccessSQL)創(chuàng)建交叉表查詢。語法TRANSFORMaggfunctionselectstatementPIVOTpivotfield[IN(value1[,value2[,...]])]TRANSFORM語句包含以下部分:部分說明aggfunction對所選數(shù)據(jù)進行計算的SQL聚合函數(shù)。selectstatementSELECT語句。pivotfield希望用于創(chuàng)建查詢結果集中列標題的字段或表達式。value1、value2用于創(chuàng)建列標題的固定值。說明使用交叉表查詢匯總數(shù)據(jù)時,將從作為列標題的指定字段或表達式中選擇值,以便能夠以一種比使用選擇查詢更緊湊的方式來查看數(shù)據(jù)。TRANSFORM是可選的,但如果包括它,則應為SQL字符串中的第一個語句。它在指定作為行標題的字段的SELECT語句之前,在指定行分組方法的GROUPBY子句之前。您也可以包含其他子句(例如。指定其他選擇或排序條件的WHERE)。還可以在交叉表查詢中使用子查詢作為謂詞,特別是在WHERE子句中。pivotfield中返回的值作為查詢結果集中的列標題。例如,在交叉表查詢中如果依據(jù)月銷售量來透視銷售數(shù)據(jù),將會創(chuàng)建12個列??梢约s束pivotfield以便從可選IN子句中所列出的固定值(value1,value2)內選擇標題。也可以包含固定值用于沒有數(shù)據(jù)來創(chuàng)建其他列的情況。示例以下示例使用SQLTRANSFORM子句創(chuàng)建交叉表查詢,以顯示每個雇員在1994年的每個日歷季度完成的訂單數(shù)。運行此過程需要使用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)建一個稍微復雜的交叉表查詢,以顯示每個雇員在 1994年的每個日歷季度所完成的訂單的總金額(美元)。運行此過程需要使用 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開發(fā)人員參考INNERJOIN 操作(MicrosoftAccessSQL)只要兩個表的公共字段有匹配值,就將這兩個表中的記錄組合起來。語法FROMtable1INNERJOINtable2ONtable1.field1compoprtable2.field2INNERJOIN操作包含以下部分:部分說明table1、要組合其中記錄的表的名稱。table2field1、被聯(lián)接的字段的名稱。如果它們不是數(shù)字,則這些字段的數(shù)據(jù)類型必須相同,并且包含同類數(shù)據(jù),但field2是,它們不必具有相同的名稱。compopr任何關系比較運算符:“=、”“<、”“>、”“<=、”“>=或”“<>?!闭f明可以在任何FROM子句中使用INNERJOIN操作。這是最常用的聯(lián)接類型。只要兩個表的公共字段上存在相匹配的值,Inner聯(lián)接就會組合這些表中的記錄??梢詫NNERJOIN用于Departments及Employees表,以選擇每個部門的所有雇員。相反,選擇所有部門(即使某些部門中并沒有分配雇員)或者所有雇員(即使某些雇員沒有分配到任何部門),則可以使用 LEFTJOIN或RIGHTJOIN操作來創(chuàng)建外部聯(lián)接。如果試圖聯(lián)接包含 Memo或OLE對象數(shù)據(jù)的字段,將產生錯誤??梢月?lián)接任何兩個相似類型的數(shù)字字段。例如,可以聯(lián)接自動編號和長整型字段,因為它們均是相似類型。然而,不能聯(lián)接單精度型和雙精度型類型字段。以下示例演示如何通過 CategoryID字段聯(lián)接Categories和Products表:SELECTCategoryName,ProductNameFROMCategoriesINNERJOINProductsONCategories.CategoryID=Products.CategoryID;在前面的示例中,CategoryID是聯(lián)接字段,但是它不包含在查詢輸出中,因為它不包含在 SELECT語句中。若要包含聯(lián)接字段,請在 SELECT語句中包含該字段名,在本例中為:Categories.CategoryID也可以在JOIN語句中鏈接多個 ON子句,請使用如下語法:SELECTfieldsFROMtable1INNERJOINtable2ONtable1.field1compoprtable2.field1ANDONtable1.field2compoprtable2.field2)ORONtable1.field3compoprtable2.field3)];也可以通過如下語法嵌套 JOIN語句:SELECTfieldsFROMtable1INNERJOIN(table2INNERJOIN[(]table3[INNERJOIN[(]tablex[INNERJOIN...)]ONtable3.field3compoprtablex.fieldx)]ONtable2.field2compoprtable3.field3)ONtable1.field1compoprtable2.field2;LEFTJOIN或RIGHTJOIN可以嵌套在INNERJOIN之中,但是INNERJOIN不能嵌套于LEFTJOIN或RIGHTJOIN之中。示例本例創(chuàng)建兩個等同聯(lián)接:一個是
OrderDetails
表與
Orders
表之間的聯(lián)接,另一個是
Orders
表與Employees
表之間的聯(lián)接。這是很有必要的,因為
Employees
表不包含銷售數(shù)據(jù),而
OrderDetails表不包含雇員數(shù)據(jù)。查詢將產生雇員及其總銷售額的列表。以下示例調用 EnumFields過程,您可以在 SELECT語句示例中找到該過程。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開發(fā)人員參考LEFTJOIN 和RIGHTJOIN 操作(MicrosoftAccessSQL)在任何FROM子句中用于組合源表記錄。語法FROMtable1[LEFT|RIGHT]JOINtable2 ONtable1.field1compoprtable2.field2LEFTJOIN和RIGHTJOIN操作包含以下部分:部分 說明table1、要組合其中記錄的表的名稱。table2被聯(lián)接的字段的名稱。這些字段必須具有相同的數(shù)據(jù)類型,并且包含相同類型的數(shù)據(jù),但它們不必field1、field2同名。compopr 任何關系比較運算符:“=、”“<、”“>、”“<=、”“>=或”“<>。”說明通過LEFTJOIN操作可以創(chuàng)建一個左外部聯(lián)接。左外部聯(lián)接包含兩個表中第一個(左)表中的所有記錄,即使在第二個(右)表中沒有匹配的記錄值。通過RIGHTJOIN操作可以創(chuàng)建一個右外部聯(lián)接。右外部聯(lián)接包含兩個表中第二個(右)表中的所有記錄,即使在第一個(左)表中沒有匹配的記錄值。例如,可以將LEFTJOIN用于Departments(左)和Employees(右)表以選擇所有部門,包括那些沒有被分配雇員的部門。若要選擇所有雇員,包括那些沒有被分配到任何部門的雇員,可以使用RIGHTJOIN。下面的示例展示了如何通過CategoryID字段聯(lián)接Categories表和Products表。該查詢將產生一個所有分類的列表,其中包括不包含任何產品的分類:SELECTCategoryName,ProductNameFROMCategoriesLEFTJOINProductsONCategories.CategoryID=Products.CategoryID;在以下示例中,CategoryID是聯(lián)接字段,但是它不包括在查詢結果中,因為它沒有包括在 SELECT語句中。若要包括聯(lián)接的字段,請在 SELECT語句中輸入字段名,在本例中為Categories.CategoryID。注釋若要創(chuàng)建一個只包括在聯(lián)接字段中具有相同數(shù)據(jù)的記錄,請使用 INNERJOIN操作。LEFTJOIN或RIGHTJOIN可以嵌套到INNERJOIN語句中,但是 INNERJOIN語句不能嵌套到LEFTJOIN或RIGHTJOIN語句中。請參閱INNERJOIN主題中有關嵌套的討論,以了解如何在其他聯(lián)接中嵌套聯(lián)接。可以鏈接多個ON子句。請參閱INNERJOIN主題中有關子句鏈接的討論,以了解如何操作。如果試圖聯(lián)接包含 Memo或OLE對象數(shù)據(jù)的字段,將產生錯誤。示例本例假設Employees表中存在假想的DepartmentName和DepartmentID字段。請注意,這些字段并不實際存在于Northwind數(shù)據(jù)庫的Employees表中。以下示例選擇所有部門,包括那些沒有雇員的部門。以下示例調用 EnumFields過程,您可以在 SELECT語句示例中找到該過程。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開發(fā)人員參考UNION 操作(MicrosoftAccessSQL)創(chuàng)建聯(lián)合查詢,該查詢將兩個或兩個以上的獨立查詢或表的結果組合在一起。語法[TABLE]query1UNION[ALL][TABLE]query2[UNION[ALL][TABLE]queryn[ ]]UNION操作包含以下部分:部分 說明query1-n 一個SELECT語句、存儲查詢的名稱或在 TABLE關鍵字后面的存儲表的名稱。注解可以在單個UNION操作中以任何組合方式合并兩個或兩個以上的查詢、表和 SELECT語句的結果。下面的示例將一個名為 NewAccounts 的現(xiàn)有表和一個 SELECT語句進行合并:TABLE[NewAccounts]UNIONALLSELECT*FROMCustomersWHEREOrderAmount>1000;默認情況下,使用UNION操作時不會返回重復的記錄;但是,可以包含記錄。這樣也會使查詢運行得更快。
ALL謂詞以確保返回所有在UNION操作中的所有查詢必須請求相同數(shù)量的字段;但是,這些字段不必都具有相同的大小或數(shù)據(jù)類型。請只在第一個
SELECT語句中使用別名,因為別名在其他語句中會被忽略。在
ORDERBY
子句中,請根據(jù)第一個
SELECT語句中使用的字段名來引用該字段。注釋可以在每個query參數(shù)中使用 GROUPBY或HAVING子句,以便對返回的數(shù)據(jù)進行分組??梢栽谧詈笠粋€ query參數(shù)的末尾使用 ORDERBY子句,以便按指定順序顯示返回數(shù)據(jù)。示例以下示例檢索巴西的所有供應商和客戶的名稱和所在城市。以下示例調用 EnumFields過程,您可以在 SELECT語句示例中找到該過程。SubUnionX()DimdbsAsDatabase,rstAsRecordsetModifythislinetoincludethepathtoNorthwindonyourcomputer.Setdbs=OpenDatabase("Northwind.mdb")RetrievethenamesandcitiesofallsuppliersandcustomersinBrazil."CityFROMSuppliers"_"WHERECountry='Brazil'UNION"_"SELECTCompanyName,CityFROMCustomers"_"WHERECountry='Brazil';")PopulatetheRecordset.rst.MoveLastCallEnumFieldstoprintthecontentsoftheRecordset.PasstheRecordsetobjectanddesiredfieldwidth.EnumFieldsrst,12dbs.CloseEndSubAccess開發(fā)人員參考PARAMETERS 聲明(MicrosoftAccessSQL)聲明在參數(shù)查詢中的每個參數(shù)的名稱和數(shù)據(jù)類型。語法PARAMETERSnamedatatype[,namedatatype[,...]]PARAMETERS聲明包含以下部分:部分namedatatype
說明參數(shù)的名稱。該名稱被賦給 Parameter 對象的Name屬性,并且用來在 Parameters 集合中標識該參數(shù)??梢詫ame作為應用程序運行查詢時在對話框中顯示的字符串。請用方括號 ([]) 將包含空格或標點的文本括起來。例如, [Lowprice] 和[Beginreportwithwhichmonth?] 都是有效的name參數(shù)。主要MicrosoftAccessSQL數(shù)據(jù)類型或其同義詞之一。說明對于定期運行的查詢,可以通過PARAMETERS聲明來創(chuàng)建一個參數(shù)查詢。參數(shù)查詢能夠自動處理查詢條件更改。若使用參數(shù)查詢,在每次查詢運行時代碼都需要提供參數(shù)。PARAMETERS聲明是可選的,但如果包含它,應將它置于任何其他語句(包括 SELECT語句)之前。如果聲明包含了多個參數(shù),請用逗號分隔它們。以下的示例里包含了兩個參數(shù):PARAMETERS[Lowprice]Currency,[Beginningdate]DateTime;在WHERE或HAVING子句中可以使用name參數(shù),不能使用datatype參數(shù)。以下的示例中要求提供兩個參數(shù),然后將該條件應用于Orders表的記錄中:PARAMETERS[Lowprice]Currency,[Beginningdate]DateTime;SELECTOrderID,OrderAmountFROMOrdersWHEREOrderAmount>[Lowprice]ANDOrderDate>=[Beginningdate];示例本示例要求用戶提供職務,然后使用該職務作為查詢條件。本示例調用EnumFields過程,您可以在 SELECT語句示例中找到該過程。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開發(fā)人員參考WITHOWNERACCESSOPTION 聲明(MicrosoftAccessSQL)在使用安全工作組的多用戶環(huán)境中,通過對查詢使用這個聲明,可以向執(zhí)行該查詢的用戶授予與查詢所有者同等的權限。語法sqlstatement WITHOWNERACCESSOPTION說明WITHOWNERACCESSOPTION聲明是可選的。下面的示例使用戶能夠查看到薪金信息(即使該用戶并不擁有查看 Payroll表的權限,并假設查詢的SELECTLastName,FirstName,SalaryFROMEmployeesORDERBYLastNameWITHOWNERACCESSOPTION;如果要禁止用戶創(chuàng)建表或在表中添加記錄,可以使用
WITHOWNERACCESSOPTION
來讓用戶能夠運行生成表 追加查詢。如果希望應用工作組安全設置和用戶的權限,請不要包含
WITHOWNERACCESSOPTION
聲明。這個選項需要您有權訪問與數(shù)據(jù)庫關聯(lián)的
System.mdw
文件。它僅在安全的多用戶實現(xiàn)中才是有用的。Access開發(fā)人員參考PROCEDURE子句(MicrosoftAccessSQL)定義查詢的名稱和可選參數(shù)。注釋PROCEDURE子句已經(jīng)被PROCEDURE語句所取代。雖然現(xiàn)在仍然支持PROCEDURE子句,但是PROCEDURE語句提供了兼容PROCEDURE子句的超集,并且它是推薦使用的語法。語法PROCEDUREname[param1datatype[,param2datatype[,...]]PROCEDURE子句包含以下部分:部分 說明name 過程名稱。它必須遵循標準命名規(guī)則。一個或多個字段名或者參數(shù)。例如:param1、PROCEDURESales_By_Country[BeginningDate]DateTime,param2[EndingDate]DateTime;有關參數(shù)的詳細信息,請參閱 parameters。datatype 主要MicrosoftAccessSQL數(shù)據(jù)類型或其同義詞之一。說明SQL過程由例如,過程
PROCEDURE子句(指定該過程的名稱)、可選的參數(shù)定義列表和一個Get_Part_Number 將運行一個用來檢索指定配件號碼的查詢。
SQL語句組成。注釋如果子句包含多個字段定義(即有多個 param-datatype 對),請使用逗號分隔它們。PROCEDURE子句的后面必須跟隨 SQL語句(例如,SELECT或UPDATE語句)。示例以下示例將查詢命名為 CategoryList。以下示例調用 EnumFields過程,您可以在 SELECT語句示例中找到該過程。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開發(fā)人員參考SQL子查詢(MicrosoftAccessSQL)子查詢是一個SELECT語句,它嵌套在SELECT、SELECT...INTO、INSERT...INTO、DELETE或UPDATE語句中,或嵌套在另一個子查詢中。語法可以通過三種語法形式來創(chuàng)建子查詢:comparison[ANY|ALL|SOME](sqlstatement)expression[NOT]IN(sqlstatement)[NOT]EXISTS(sqlstatement)子查詢語句包含了以下部分:部分
說明comparisonexpressionsqlstatement
表達式和比較運算符,用于對表達式與子查詢的結果進行比較。表達式,用來搜索子查詢的結果集。SELECT語句,遵循和任何其他 SELECT語句一樣的格式和規(guī)則。它必須用圓括號括起來。注解可以在SELECT語句的字段列表中、在 WHERE子句中或在 HAVING子句中使用子查詢來代替表達式。在子查詢中,可以使用SELECT語句來提供一組要在WHERE或HAVING子句表達式中計算的一個或多個特定值。通過同義的ANY或SOME謂詞,可以檢索在主查詢的記錄中滿足與子查詢所檢索出的任何記錄進行比較的比較條件的記錄。下面的示例返回那些單價高于以25%或更高折扣出售的任何產品的單價的產品:SELECT*FROMProductsWHEREUnitPrice>ANY(SELECTUnitPriceFROMOrderDetailsWHEREDiscount>=.25);使用ALL謂詞可以在主查詢中只檢索滿足子查詢中檢索的所有記錄的比較條件的記錄。如果將前面的示例中的ANY改為ALL,查詢將只返回那些單價高于以25%或更高折扣出售的所有產品單價的產品。它的限制性更強。通過IN謂詞可以只檢索出在主查詢的記錄中作為子查詢的一部分記錄而包含相同值的記錄。下面的示例返回所有以25%或更高折扣出售的所有產品:SELECT*FROMProductsWHEREProductIDIN(SELECTProductIDFROMOrderDetailsWHEREDiscount>=.25);相應地,可以使用NOTIN來僅檢索出在主查詢的記錄中作為子查詢的記錄而不包含相同值的記錄。在True/False比較條件中使用EXISTS謂詞(帶有可選的NOT保留字)可確定子查詢是否返回任何記錄。也可以在子查詢中使用表名的別名來引用在子查詢外部的FROM子句中列出的表。以下示例返回薪水等于或高于具有同等職稱的所有雇員平均薪水的雇員的姓名。Employees表別名為“T1:”SELECTLastName,FirstName,Title,SalaryFROMEmployeesAST1WHERESalary>=(SELECTAvg(Salary)FROMEmployeesWHERET1.Title=Employees.Title)OrderbyTitle;在前面的示例中,
AS保留字是可選的。允許一些子查詢用在交叉表查詢中,特別是作為謂詞(在
WHERE子句中的謂詞)。不允許將作為輸出的子查詢(在
SELECT列表中)用在交叉表查詢中。示例以下示例列出在 1995年第二季度下過訂單的每個客戶的名稱和聯(lián)系人。以下示例調用 EnumFields過程,您可以在 SELECT語句示例中找到該過程。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開發(fā)人員參考ALL、DISTINCT 、DISTINCTROW 和TOP謂詞(Micros
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 物業(yè)公司整體外包管理合同
- 2024年門店轉讓合同
- 2025年吉林道路客貨運輸從業(yè)資格證b2考試題庫
- 社團代表發(fā)言稿
- 詩經(jīng)小雅甫田的原文
- 公司員工加班審批流程表
- 2024-2025學年山西省晉城市部分學校聯(lián)考高三上學期第一次模擬考試地理試題(解析版)
- 供應商信息與報價對比表
- 你我金融服務協(xié)議
- 企業(yè)品牌推廣實戰(zhàn)指南
- 探討電磁感應現(xiàn)象對電能轉化效率的影響
- EHS法律法規(guī)清單及合規(guī)性評估
- “德能勤績廉”考核測評表
- 新概念英語青少版入門 A-Unit-1課件(共37張)
- 橋梁定期檢查-主要部件檢查要點與評定標準
- 長途汽車客運站調研報告
- 酒店住宿水單標準模板
- (完整版)國際金融法
- 尺寸鏈的計算表格
- 夏玉米套種辣椒技術
- 球墨鑄鐵正火工藝
評論
0/150
提交評論