版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、VC+使用ADO开发ACCESS数据库本文通过实例演示如何在VC+中使用ADO进行ACCESS数据库编程,并对涉及到的几个概念进行详细解释。本文不对ADO和ACCESS的基本概念进行详细解释,主要包括以下内容:第一部分 ADO和ADOX到底是什么,二者的作用和区别建立数据库第二部分 ADOX创建ACCESS数据库第三部分 ADO创建ACCESS数据库的表第四部分 使用_ConnectionPtr接口开发ACCESS数据库第五部分 使用_RecordsetPtr接口开发ACCESS数据库第一部分 ADO和ADOX到底是什么,二者的作用和区别ADO是Microsoft 最新推出的数据库访问的高层软
2、件接口。它和Microsoft以前的数据库访问接口DAO、RDO相比具有更大的灵活性,使用也更方便,开发效率大为提高。ADOX是核心ADO对象的扩展库。它提供的附加对象可用于创建、修改和删除模式对象,如表和过程。要使用ADOX,则应建立对ADOX类型库的引用。ADOX库文件名为 Msadox.dll。通俗地讲,ADO是访问数据库的一种接口,可以使用它方便地进行数据库编程。而ADOX是微软对ADO功能的扩展,比如:可以ADOX创建数据库(而ADO没有创建数据库的功能)。第二部分 ADOX创建ACCESS数据库用ADOX创建access数据库方法很简单,只需要创建一个Catalog对象,然后调用它
3、的Create方法就可以了。例程ADOXCreateDatabase演示如何使用ADOX创建一个ACCESS数据库。打开VC+ 6.0,新建一个基于对话框的工程ADOXCreateDatabase。在对话框IDD_ADOXCREATEDATABASE_DIALOG中添加一个编辑框IDC_DBNAME和一个按钮IDC_BTN_CREATE,编辑框用以输入数据库名称。使用ClassWizard给编辑框创建一个CString变量m_dbName。双击IDC_BTN_CREATE按钮,并编辑OnBtnCreate()函数如下:void CADOXCreateDatabaseDlg:OnBtnCreat
4、e() /使输入到编辑框IDC_DBNAME的内容更新到m_dbName变量中 UpdateData(TRUE); CString str;str=d:+m_dbName+.mdb;/检查该数据库是否已经存在,如果该数据库已经存在,弹出消息框,返回/使用API函数PathFileExists()检查路径文件是否存在/请注意:为了使用API函数PathFileExists(),需要加入/#include Shlwapi.h /#pragma comment(lib,shlwapi.lib)if(PathFileExists(str)CString strTemp;strTemp.Format(%
5、s已存在!,str);AfxMessageBox(strTemp);return ;/定义ADOX对象指针并初始化为NULL/用ADOX创建access数据库方法很简单,/只需要新建一个Catalog对象,然后调用它的Create方法就可以了。/Catalog是 ADOX 的一个对象,它包含描述数据源模式目录的集合。/在这里,您只需知道创建数据库时使用这个对象就可以了。/注意用try.catch组合捕捉错误_CatalogPtr m_pCatalog = NULL;CString DBName=Provider=Microsoft.JET.OLEDB.4.0;Data source=; DBN
6、ame=DBName+str;trym_pCatalog.CreateInstance(_uuidof(Catalog);m_pCatalog-Create(_bstr_t(LPCTSTR)DBName);catch(_com_error &e)AfxMessageBox(e.ErrorMessage();return ;使用ADOX,需要引入ADOX的动态链接库msadox.dll,即在stdafx.h中加入如下语句:#import C:Program FilesCommon Filessystemadomsadox.dll no_namespace rename(EOF,adoEOF)另外
7、,ADOX属于COM对象,所以要在CADOXCreateDatabaseApp:InitInstance()函数中加入:if(!AfxOleInit()AfxMessageBox(OLE初始化出错!);return FALSE;初始化COM。好了,编译并运行该例程,对于编译过程中弹出的4146号警告不要理会。在编辑框中输入一个数据库名称,点击“创建数据库”按钮,该数据库将在d盘根目录下创建,再次输入该数据库名称并点击“创建数据库”按钮,将弹出警告对话框。在vc中使用ADO的时候会得到4146号警告信息,我们可以不去理会,也可以通过#pragma warning指令解决,方法为:将在stdafx
8、.h中加入的语句:#import C:Program FilesCommon Filessystemadomsadox.dll no_namespace rename(EOF,adoEOF)前后再加一条语句,修改后为:#pragma warning (disable:4146)#import C:Program FilesCommon Filessystemadomsadox.dll no_namespace rename(EOF,adoEOF)#pragma warning (default:4146)指令#pragma warning (disable:4146) 暂时屏蔽编译时4146警
9、告信息指令#pragma warning (default:4146) 重置编译器的4146警告到默认状态第三部分 ADO创建ACCESS数据库的表我们一般用ADOX创建数据库,然后再用ADO创建数据库的表。例程CREATE_DB_AND_TABLE演示如何使用ADO创建ACCESS数据库的表。打开VC+ 6.0,新建一个基于对话框的工程CREATE_DB_AND_TABLE。在对话框IDD_CREATE_DB_AND_TABLE_DIALOG中添加如下控件:控件名称ID用途编辑框IDC_DBNAME输入数据库名称按钮IDC_BTN_CREATE创建数据库编辑框IDC_TABLENAME输入表
10、名按钮IDC_BTN_CREATE_TABLE创建表使用ClassWizard给两个编辑框创建CString变量:编辑框CString变量编辑框IDC_DBNAMEm_dbName编辑框IDC_TABLENAMEm_tableName双击IDC_BTN_CREATE按钮,并编辑OnBtnCreate()函数如下:void CADOXCreateDatabaseDlg:OnBtnCreate() UpdateData(TRUE); CString str;str=d:+m_dbName+.mdb;if(PathFileExists(str)CString strTemp;strTemp.Form
11、at(%s已存在!,str);AfxMessageBox(strTemp);return ;_CatalogPtr m_pCatalog = NULL;CString DBName=Provider=Microsoft.JET.OLEDB.4.0;Data source=; DBName=DBName+str;trym_pCatalog.CreateInstance(_uuidof(Catalog);m_pCatalog-Create(_bstr_t(LPCTSTR)DBName);catch(_com_error &e)AfxMessageBox(e.ErrorMessage();retur
12、n ;以上代码例程ADOXCreateDatabase中已经详细叙述。双击IDC_BTN_CREATE_TABLE按钮,并编辑OnBtnCreateTable()函数如下:void CCREATE_DB_AND_TABLEDlg:OnBtnCreateTable() /先判断表名编辑框是否为空UpdateData(TRUE);if(!m_tableName.IsEmpty()ADOX:_CatalogPtr m_pCatalog=NULL; ADOX:_TablePtr m_pTable=NULL; CString str; str=d:+m_dbName+.mdb; CString DBNa
13、me=Provider=Microsoft.JET.OLEDB.4.0;Data source=; DBName=DBName+str; /这段代码先检查表是否已经存在,如果表已经存在,不再创建,直接返回。 /其实这段代码不必深入研究,只需知道它的功能,直接拿来使用即可 try m_pCatalog.CreateInstance(_uuidof(ADOX:Catalog); m_pCatalog-PutActiveConnection(_bstr_t(DBName); int tableCount=m_pCatalog-Tables-Count; int i=0; while(iTables-
14、GetItem(long)i); CString tableName=(BSTR)m_pTable-Name; if(tableName=m_tableName) AfxMessageBox(该表已经存在!); return; i+; catch(_com_error &e) AfxMessageBox(e.Description(); return; ADODB:_ConnectionPtr m_pConnection; /创建表 _variant_t RecordsAffected; trym_pConnection.CreateInstance(_uuidof(ADODB:Connect
15、ion);/Open方法的原型:/Open(_bstr_t ConnectionString,_bstr_t UserID,_bstr_t Password,long Options)/ConnectionString为连接字串,UserID是用户名,Password是登陆密码/Options是连接选项,可以是如下几个常量:/adModeUnknown 缺省,当前的许可权未设置/adModeRead 只读/adModeWrite 只写/adModeReadWrite 可以读写/adModeShareDenyRead 阻止其它Connection对象以读权限打开连接/adModeShareDen
16、yWrite 阻止其它Connection对象以写权限打开连接/adModeShareExclusive 阻止其它Connection对象打开连接/adModeShareDenyNone 阻止其它程序或对象以任何权限建立连接m_pConnection-Open(_bstr_t(DBName),ADODB:adModeUnknown); catch(_com_error e) CString errormessage; errormessage.Format(连接数据库失败!r错误信息:%s,e.ErrorMessage(); AfxMessageBox(errormessage); retur
17、n; try CString strCommand; /*执行SQL命令:CREATE TABLE创建表格该表包含三个字段:记录编号 INTEGER,姓名 TEXT,出生年月 DATETIMESQL语言中的create table语句被用来建立新的数据库表格。create table语句的使用格式如下:create tablename (column1 data type,column2 data type,column3 data type);如果用户希望在建立新表格时规定列的限制条件,可以使用可选的条件选项create table tablename (column1 data typec
18、onstraint,column2 data typeconstraint,column3 data typeconstraint); 举例:create table employee(firstname varchar(15),lastname varchar(20),age number(3),address varchar(30),city varchar(20);简单来说,创建新表格时,在关键词create table后面加入所要建立的表格的名称,然后在括号内顺次设定各列的名称,数据类型,以及可选的限定条件等。使用SQL语句创建的数据库表格和表格中列的名称必须以字母开头,后面可以使用字
19、母,数字或下划线,名称的长度不能超过30个字符,注意,用户在选择表格名称时不要使用SQL语言中的保留关键字,如select,create,insert等,作为表格或列的名称 */ strCommand.Format(CREATE TABLE %s(记录编号 INTEGER,姓名 TEXT,出生年月 DATETIME),m_tableName); /Execute(_bstr_t CommandText,VARIANT* RecordsAffected,long Options) /其中CommandText是命令字串,通常是SQL命令, /参数RecordsAffected是操作完成后所影响的
20、行数 /参数Options表示CommandText中内容的类型,可以取下列值之一: /adCmdText 表明CommandText是文本命令 /adCmdTable 表明CommandText是一个表名 /adCmdProc 表明CommandText是一个存储过程 /adCmdUnknown 未知m_pConnection-Execute(_bstr_t(strCommand),&RecordsAffected,ADODB:adCmdText); if(m_pConnection-State) m_pConnection-Close(); catch(_com_error &e) Afx
21、MessageBox(e.Description();这段代码先用ADOX的Catalog对象检查表是否已经存在,如果该表已经存在,直接返回;如果还没有该表,使用ADO的Connection对象的Execute函数创建表。Connection对象的用法:首先定义一个Connection类型的指针,然后调用CreateInstance()来创建一个连接对象的实例,再调用Open函数建立与数据源的连接。最后使用Execute()函数执行SQL语句创建表。关于调用CreateInstance()来创建连接对象的实例,还需作一点说明。ADO库包含三个基本接口:_ConnectionPtr接口,_Rec
22、ordsetPtr接口和_CommandPtr接口。其分别对应Connection对象(完成应用程序对数据源的访问连接),Recordset对象(将查询的结果以记录集的方式存储)和Command对象(对已连接的数据源进行命令操作)。_ConnectionPtr m_pConnection;_RecordsetPtr m_pRecordset;_CommandPtr m_pCommand;而这三个对象实例的创建,可以使用如下语句:m_pConnection.CreateInstance(_uuidof(Connection);或者:m_pConnection.CreateInstance(“AD
23、ODB.Connection”);m_pRecordset.CreateInstance(_uuidof(Recordset);或者:m_pRecordset.CreateInstance(“ADODB.Recordset”);m_pCommand.CreateInstance(_uuidof(Command);或者:m_pCommand.CreateInstance(“ADODB.Command”);两种方法的作用完全相同,使用哪种方法,完全是您的个人爱好问题。如例程ADOXCreateDatabase,在BOOL CCREATE_DB_AND_TABLEApp:InitInstance()
24、函数中加入:if(!AfxOleInit()AfxMessageBox(OLE初始化出错!);return FALSE;在stdafx.h中加入如下语句:#import C:Program FilesCommon Filessystemadomsadox.dll #import C:Program FilesCommon Filessystemadomsado15.dll rename(EOF,adoEOF)关于这两条语句,需要进行特别说明:由于该例程同时使用ADOX和ADO,需要同时引入msado15.dll和msadox.dll两个库。这两个库的名字空间是不同的,msado15.dll的名
25、字空间是ADODB,msadox.dll的名字空间是ADOX。在使用ADO所属的名字空间的变量,函数时,在前面加上ADODB:,在使用ADOX所属的名字空间的变量,函数时,在前面加上ADOX:。另外,一般ADOX和ADO分开操作。您也可以在ADOX操作部分使用using namespace ADOX:,而在ADO操作部分使用using namespace ADO:,以区分名字空间。这样,您就不必再使用ADOX:和ADODB:了。rename(“EOF”,”adoEOF”) /重命名EOF是必要的,因为典型的VC应用都已经定义了EOF作为常数1,为了避免冲突,将ADO中的EOF重命名为adoEO
26、F。#import中有一个属性为no_namespace,这是告诉编译器该类不在一个单独的名字空间中,使用no_namespace意味着你不需要在初始化变量的时候引用名字空间。当然如果在您的应用中需要导入多个类型库的话,不要使用no_namespace,以免引起名字冲突。再通俗一点讲,就是只导入一个类型库的话,可以在#import语句中加入no_namespace属性,您的程序可以直接使用这个类型库的名字空间的内容,而不必使用using namespace XXX;或XXX:,这是因为no_namespace属性告诉编译器该类型库不再名字空间,而是在全局空间上工作;如果您导入几个类型库,而这几
27、个类型库之间没有定义冲突,您也可以在使用no_namespace属性;但如果两个类型库中有定义冲突,就不能使用no_namespace属性,如果使用no_namespace属性,就会在全局空间产生定义冲突。对于本例程,您可以把stdafx.h中的#import C:Program FilesCommon Filessystemadomsadox.dll #import C:Program FilesCommon Filessystemadomsado15.dll rename(EOF,adoEOF)改为#import C:Program FilesCommon Filessystemadoms
28、adox.dll #import C:Program FilesCommon Filessystemadomsado15.dll no_namespace rename(EOF,adoEOF)这样改动后,void CCREATE_DB_AND_TABLEDlg:OnBtnCreateTable()中的ADODB:需要完全省略掉。当然,您也可以把这两行改为:#import C:Program FilesCommon Filessystemadomsadox.dll no_namespace#import C:Program FilesCommon Filessystemadomsado15.dl
29、l rename(EOF,adoEOF)但这样改动后,void CCREATE_DB_AND_TABLEDlg:OnBtnCreateTable()中的ADOX:需要完全省略掉。由于ADOX和ADO有定义冲突,也就是说,msado15.dll和msadox.dll有相同的定义部分,所以在一个程序中,不允许同时使用no_namespace。第四部分 使用_ConnectionPtr接口开发ACCESS数据库ADO中最重要的对象有三个:Connection、Recordset和Command,分别表示连接对象、记录集对象和命令对象。三个对象对应的智能指针分别是:_ConnectionPtr、_Re
30、cordsetPtr、_CommandPtr。ADO使用_ConnectionPtr这个指针来操纵Connection对象,类似地,后面用到的_CommandPtr和_RecordsetPtr分别表示命令对象指针和记录集对象指针。Connection对象是这三个对象的基础,它的主要作用是建立与数据库的连接,建立了与数据库的连接后,才能进行其它有关数据库的访问和操作。也就是说,使用ADO操作数据库,通常先用Connection对象的Open方法打开一个库连接,然后才能进行数据库的操作。操作完成后,要关闭这个库连接。本文只讲述Connection对象最常用的Open方法和Execute方法。Ope
31、n方法用于打开一个库连接,而Execute方法一般用于执行一条SQL语句。_ConnectionPtr智能指针的用法:首先定义一个Connection类型的指针,然后调用CreateInstance()来创建一个连接对象的实例,再调用Open函数建立与数据源的连接。在建立连接对象后,可以使用连接对象的Execute()函数来执行SQL命令。_ConnectionPtr智能指针Open方法的原型:Open(_bstr_t ConnectionString,_bstr_t UserID,_bstr_t Password,long Options)ConnectionString为连接字串,User
32、ID是用户名,Password是登陆密码Options是连接选项,可以是如下几个常量:adModeUnknown 缺省,当前的许可权未设置adModeRead 只读adModeWrite 只写adModeReadWrite 可以读写adModeShareDenyRead 阻止其它Connection对象以读权限打开连接adModeShareDenyWrite 阻止其它Connection对象以写权限打开连接adModeShareExclusive 阻止其它Connection对象打开连接adModeShareDenyNone 阻止其它程序或对象以任何权限建立连接_ConnectionPtr智能
33、指针Execute方法的原型:_RecordsetPtr Connection15:Execute(_bstr_t CommandText,VARIANT* RecordsAffected,long Options) 其中CommandText是命令字串,通常是SQL命令, 参数RecordsAffected是操作完成后所影响的行数 参数Options表示CommandText中内容的类型,可以取下列值之一: adCmdText 表明CommandText是文本命令 adCmdTable 表明CommandText是一个表名 adCmdProc 表明CommandText是一个存储过程 adC
34、mdUnknown 未知Execute执行完后返回一个指向记录集的指针。例程CREATE_DB_AND_TABLE中已经使用了_ConnectionPtr指针的Open方法和Execute方法,在后面的例程我们将进一步详细说明。我们先讲解几条最常用的SQL语句。SELECT查询语句我们希望用各种不同的方法来查看和分析数据,SELECT语句就是我们要使用的语句,用于有选择的从数据库返回我们需要的数据,也就是查询。最基本的SELECT语句仅有两个部分:要返回的列和这些列源于的表为了便于讲解演示,我们使用如下Northwind 示例数据库中的 Employees 表EmployeeIDFirstNa
35、meLastNameHireDateCityCountry1NancyDavolio1/5/1992 12:00:00 SeattleUSA2AndrewFuller14/8/1992 12:00:00 TacomaUSA3JanetLeverling1/4/1992 12:00:00 KirklandUSA4MargaretPeacock3/5/1993 12:00:00 RedmondUSA5StevenBuchanan17/10/1993 12:00:00 LondonUK6MichaelSuyama17/10/1993 12:00:00 LondonUK7RobertKing2/1/1
36、994 12:00:00 LondonUK8LauraCallahan5/3/1994 12:00:00 SeattleUSA9AnneDodsworth15/11/1994 12:00:00 LondonUK如果我们希望检索Employees表中所有客户的所有信息,我们可以使用星号(*)来简单地表示所有列,查询语句如下所示:SELECT * FROM Employees如果我们只需要特定列,我们应该在逗号分隔的列表中显式指定这些列,如下所示:SELECT EmployeeID, FirstName,LastName,HireDate FROM Employees结果会显示该表中所有行的指定字
37、段的数据。显式指定所需字段还允许我们控制字段返回的顺序,如果我们希望LastName显示在FirstName之前,我们可以编写以下语句:SELECT EmployeeID, LastName,FirstName,HireDate FROM EmployeesWHERE子句接下来我们要做的是开始限制或筛选从数据库提取的数据。通过向SELECT语句添加WHERE子句,我们可以添加一个(或多个)条件,所选数据必须满足这些条件,这将限制答复查询的行数也就是被提取的行数。我们可以在上一个查询的基础上,将其限制为City为London的员工SELECT EmployeeID, FirstName, Las
38、tName, HireDate, City FROM EmployeesWHERE City = London查询结果如下:EmployeeIDFirstNameLastNameHireDateCity5StevenBuchanan17/10/1993 12:00:00 London6MichaelSuyama17/10/1993 12:00:00 London7RobertKing2/1/1994 12:00:00 London9AnneDodsworth15/11/1994 12:00:00 London如果您希望返回相反条件的员工,即返回那些不住在伦敦的员工,您应该编写以下语句:SELE
39、CT EmployeeID, FirstName, LastName, HireDate, City FROM EmployeesWHERE City London您也可以使用大于、小于、大于等于、小于等于等运算符。例如,若要获取其雇佣日期等于某个给定日期或大于该日期的员工列表,您可以编写以下语句:SELECT EmployeeID, FirstName, LastName, HireDate, City FROM EmployeesWHERE HireDate = 1-july-1993您可以得到以下结果行: EmployeeIDFirstNameLastNameHireDateCity5S
40、tevenBuchanan17/10/1993 12:00:00 London6MichaelSuyama17/10/1993 12:00:00 London7RobertKing2/1/1994 12:00:00 London8LauraCallahan5/3/1994 12:00:00 Seattle9AnneDodsworth15/11/1994 12:00:00 London当然,我们可以编写更复杂的条件:在 WHERE 子句中加入多个条件。如果我们希望了解哪些员工是在两个给定日期之间雇佣的,我们可以编写以下语句:SELECT EmployeeID, FirstName, LastNa
41、me, HireDate, CityFROM EmployeesWHERE (HireDate = 1-june-1992) AND (HireDate = 15-december-1993)结果如下: EmployeeIDFirstNameLastNameHireDateCity2AndrewFuller14/8/1992 12:00:00 Tacoma4MargaretPeacock3/5/1993 12:00:00 Redmond5StevenBuchanan17/10/1993 12:00:00 London6MichaelSuyama17/10/1993 12:00:00 Londo
42、nSQL 还有一个BETWEEN 运算符,用于检查某个值是否在两个值之间(包括等于两端的值)。这使我们可以将以前的查询重新编写为:SELECT EmployeeID, FirstName, LastName, HireDate, CityFROM EmployeesWHERE HireDate BETWEEN 1-june-1992 AND 15-december-1993我们也可以使用 NOT 运算符来提取那些不在指定日期之间的行:SELECT EmployeeID, FirstName, LastName, HireDate, CityFROM EmployeesWHERE HireDat
43、e NOT BETWEEN 1-june-1992 AND 15-december-1993如果我们希望检查一个列值是否等于多个值,那该怎么办呢?如果只是两个值,则很容易对每个值进行测试,方法是,使用 OR 运算符将它们连接在一起,则编写的语句如下所示:SELECT EmployeeID, FirstName, LastName, HireDate, City FROM EmployeesWHERE City = London OR City = Seattle但是,如果您希望与三个、四个或更多值进行比较,则上述方法就行不通了。在这种情况下,我们可以使用 IN 运算符来对一组值进行测试。如果我
44、们希望查看 City 是否为 Seattle、Tacoma 或 Redmond,我们可以编写以下语句:SELECT EmployeeID, FirstName, LastName, HireDate, City FROM EmployeesWHERE City IN (Seattle, Tacoma, Redmond)显示以下结果:EmployeeIDFirstNameLastNameHireDateCity1NancyDavolio1/5/1992 12:00:00 Seattle2AndrewFuller14/8/1992 12:00:00 Tacoma4MargaretPeacock3/
45、5/1993 12:00:00 Redmond8LauraCallahan5/3/1994 12:00:00 Seattle我们也可以获得所含结果的相反条件下的结果,即查询那些 City 不在指定列表中的行:SELECT EmployeeID, FirstName, LastName, HireDate, City FROM EmployeesWHERE City NOT IN (Seattle, Tacoma, Redmond)最后要说明的是,LIKE 运算使我们可以使用通配符来执行基本的模式匹配。在 Microsoft SQL Server 中,定义的通配符包含以下字符:通配符说明_(下划
46、线)与任意单字符匹配%与包含一个或多个字符的字符串匹配 与特定范围(例如,a-f)或特定集(例如,abcdef)中的任意单字符匹配。与特定范围(例如,a-f)或特定集(例如,abcdef)之外的任意单字符匹配。以下一些示例可以帮助阐明上述规则。WHERE FirstName LIKE _im 可以找到所有三个字母的、以 im 结尾的名字(例如,Jim、Tim)。WHERE LastName LIKE %stein 可以找到姓以 stein 结尾的所有员工。WHERE LastName LIKE %stein% 可以找到姓中任意位置包括 stein 的所有员工。WHERE FirstName L
47、IKE JTim 可以找到三个字母的、以 im 结尾并以 J 或 T 开始的名字(即仅有 Jim 和 Tim)WHERE LastName LIKE mc% 可以找到以 m 开始的、后面的(第二个)字母不为 c 的所有姓。此处我们也选择使用 NOT 运算符:若要找到所有名字不以 M 或 A 开始的员工,我们可以编写以下语句:SELECT EmployeeID, FirstName, LastName, HireDate, City FROM EmployeesWHERE (FirstName NOT LIKE M%) AND (FirstName NOT LIKE A%)结果如下: Emplo
48、yeeIDFirstNameLastNameHireDateCity1NancyDavolio1/5/1992 12:00:00 Seattle3JanetLeverling1/4/1992 12:00:00 Kirkland5StevenBuchanan17/10/1993 12:00:00 London7RobertKing2/1/1994 12:00:00 London8LauraCallahan5/3/1994 12:00:00 SeattleORDER BY 子句直到现在我们一直在讨论筛选数据:即定义一些条件,来确定哪些行将包括在从数据库提取并返回的最终行集中。一旦我们确定了哪些列和
49、行将包括在 SELECT 查询的结果中,我们可能就希望控制这些行显示的顺序:对数据排序。若要对数据行排序,我们需要 ORDER BY 子句。ORDER BY 子句包括了一个或多个用于指定排序顺序的列名。如果返回至第一批 SELECT 语句中的某条语句,我们可以用以下语句按 City 对其结果排序:SELECT EmployeeID, FirstName, LastName, HireDate, City FROM EmployeesORDER BY City默认情况下,列的排序顺序为升序(从最小值到最大值),上述查询的结果如下所示:EmployeeIDFirstNameLastNameHire
50、DateCity3JanetLeverling1/4/1992 12:00:00 Kirkland5StevenBuchanan17/10/1993 12:00:00 London6MichaelSuyama17/10/1993 12:00:00 London7RobertKing2/1/1994 12:00:00 London9AnneDodsworth15/11/1994 12:00:00 London4MargaretPeacock3/5/1993 12:00:00 Redmond1NancyDavolio1/5/1992 12:00:00 Seattle8LauraCallahan5/
51、3/1994 12:00:00 Seattle2AndrewFuller14/8/1992 12:00:00 Tacoma如果我们希望列的排序顺序为降序,我们可以在列名后包括 DESC 关键字。ORDER BY 子句支持使用多列。您可以包括以逗号分隔的多个列以按其排序:行将先按指定的第一列进行排序,然后再按指定的下一列进行排序。如果我们向 SELECT 子句添加 Country 字段并希望按 Country 和 City 排序,我们可以编写以下语句:SELECT EmployeeID, FirstName, LastName, HireDate, Country, City FROM Employees ORDER BY Country, City DESC请注意,为了使语句显得更有趣,我们已经指定了 City 列的排序顺序为降序(从最大值到最小值)。Country 列的排序顺序仍为升序。为了更清楚地了解到这一点,我们可以把语句编写为:SELECT EmployeeID, FirstName, LastName, HireDate, Country, City F
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 45057-2024再生钛锭
- 2024年金融机构与中小企业公对公信用贷款合同3篇
- 美食广场食品安全检测制度
- 交通运输设备采购招投标流程
- 网络安全防护指南
- 填筑土方施工合同
- 仓储物流中心续租合同
- 2024年水电设备安全认证与检测服务合同3篇
- 金融行业总监理合同模板
- 房屋共同使用权保险合同
- 医院医用气体管路的设计计算(2014)
- 土地储备专项债券发行操作流程
- 沙锅餐饮行业管理公司采购管理手册
- 合同范本之采购合同谁保管
- 农村小学生上下学交通安全教育的研究
- 雍琦版法律逻辑学课后习题答案全
- 学校暑期维修方案
- 国家自然科学基金进展报告
- 小车多方式运行的PLC控制——PLC控制系统课程设计
- (完整版)机加中心绩效考核方案
- 个人简历表格标准模板(Word)
评论
0/150
提交评论