1VB中使用SQL语言基本教程SQL语言基本教程(一)数据库查询语言(SQL)是使用于关系数据库的标准语言,被很多类型的数据库所支持。本文将以VB加DAO为例,来介绍基本的SQL语法以及使用。本章将介绍的是SQL语言中的基本查询语句,并带有范例。要更好的阅读本文,读者需要对数据库的基本结构以及术语有一个基本的了解,而且最好能有一定的VB数据库编程经验。除非特别说明,本文将使用的数据库是VB中附带的BIBLIO.MDB数据库。一、SELECT...FROM...WHERE语句语句的语法如下:SELECT[all|*|distinctcolumn1,column2]FROMtable1[,table2]WHERE[condition1|expression1][ANDcondition2|rxpression2]在上面的语法中,[]外的语句是必须的,而[]内的是可选的,对于以|分割的操作符,则表明语法中必须从|分割的操作符中选择一个。下面的语法描述同上。在SELECT...FROM...WHERE语句中其中SELECT指定需要检索的字段,FROM指定要查询的表,WHERE指定选择纪录的条件,另外还可以包含ORDERBY语句来制定排序纪录。语法如下:ORDERBYcolumn1|Integer[ASC|DESC]其中column1制定排序的字段,也可以使用Integer指定的字段索引来排序,ASC为升序、DESC为降序。范例一:找到Titles表中所有出版日期在1990年以后以及包含文字Beginner的书名建立一个新工程,加入DAO定义库(点击菜单中的Project|References项,在列表中选择MicrosoftDAO3.51ObjectLibrary(也可以是更高版本的3.60,如果安装了的话),然后在Form中加入一个ListBox控件。在Form1的代码窗口中加入以下代码:PrivateSubForm_Load()DimrsTempAsRecordsetDimdbTempAsDatabaseDimastrAsStringSetdbTemp=DBEngine(0).OpenDatabase(e:\programfiles\microsoftvisualstudio\vb98\biblio.mdb,_dbOpenSnapshot)astr=SELECT[Title]FROM[Titles]WHERE[YearPublished]1990&_ANDTitleLIKE'*Beginner*'ORDERBYTitleDESCSetrsTemp=dbTemp.OpenRecordset(astr)IfrsTemp.RecordCount0ThenrsTemp.MoveFirstDoUntilrsTemp.EOFList1.AddItemrsTemp![Title]rsTemp.MoveNextLoopEndIf2EndSub运行程序,List1中就会列出所有出版日期在1990年以后以及包含文字Beginner的书的书名并将书名按照降序进行排列。在上面的SELECT语句的WHERE中,我们使用了操作符号来比较大小以及使用LIKE进行匹配。在WHERE语句中,可以使用的操作符有以下几类:1、比较操作符包含=、、、、=、=等若干类2、逻辑操作符包含以下若干类:LIKE、IN、BETWEEN、UNIQUE、ISNULL、EXISTS、ALL和ANYLIKE操作符通过使用通配符将一个值同其它值比较,在VB的SQL查询中,可以使用的通配符是*和?其中*代表任意的若干个字符,而?代表一个字符,例如上面语句中的LIKE'*Beginner*代表查找所有包含字符串Beginner的值。不过要注意的是使用*和?作为通配符是VB的专利。真正的SQL语言的通配符是%和_,其中%代表任意多个字符,_代表一个字符例如VB中的DataEnvironment使用的就是%和_作为查询通配符。另外MicrosoftJetEngine对于LIKE操作符还提供了其它一些的过滤选项,具体的内容可参见MSDN索引中的LikeOperator条目。IN操作符用于比较某一个值是否等于几个值中的一个值,例如下面的语句:SELECT[Title],[YearPublished]FROM[Titles]WHERE[YearPublished]IN(1990,1991,1995)将从表Titles中选择所有在1990、1991、1995年出版的书籍纪录。BETWEEN操作符勇于在两个值之间搜索,例如WHERE[YearPublished]BETWEEN1989AND1991指定出版日期必须在1989年和1991年之间。对于逻辑操作符,可以结合NOT操作符实现改变查询条件的方向。例如WHERE[YearPublished]NOTIN(1990,1991,1995)3、连接符WHERE中的连接符包括AND和OR,使用AND时,所有查询都必须是True时,条件才成立,而使用OR时,只要连接的一个查询为True,条件就成立。象上面的范例中,只有书名中包含Beginner同时又是在1990年以后出版的纪录才会被查询到。在使用比较操作符时要注意,在VB操作数据库引擎时对于查找的字符串,要使用单引号或者双引号将字符串括起来,例如WHERE[Name]='LiGang'。而对于日期类型的数据,要使用#号将日期括起来,例如WHERE[BirthDay]#19980-10-01#而在使用通配符和LIKE操作符时,需要使用引号而不是#号,例如WHERE[BirthDay]LIKE1990-01-*。引号告诉数据库引擎将日期当字符串处理,而#号告诉数据库引擎将日期当数字处理。对于WHERE语句所要使用的逻辑操作符,在下面的文章中还要提到。范例二:如何在数据表中加入统计等功能SQL当中提供了一定数量的统计以及计算功能,其中统计函数主要有如下一些:COUNT计算字段中的纪录数3SUM计算字段中的所有值的和MAX获得字段中所有值中的最大值MIN获得字段中所有值中的最小值AVG计算字段中所有值的平均值计算符有+、-、*、/4种。这些计算、统计函数的使用方法如下:functionnamefieldnameASoutfieldname其中functionname定义函数名、fieldname定义要操作的字段、outfieldname定义保存输出结果字段名称,下面是范例程序,首先建立一个数据库,将数据库保存为c:\db4.mdb。然后在数据库中加入一个名称为db1的表,表的结构如下:字段名称产品编号成本出厂价销售数量A00020¥89.95¥95.00900A00056¥54.00¥89.002400A00021¥2,300.00¥2,896.00600A10916¥120.00¥209.001200A00987¥907.00¥1,090.001000其中产品编号为文本类型、成本和出厂价字段为货币类型、销售数量为长整形数据。保存表,在VB工程中加入DAO定义库,在Form1中加入一个ListBox控件,在Form1代码窗口中加入以下代码:PrivateSubForm_Load()DimrsTempAsRecordsetDimdbTempAsDatabaseDimastrAsStringSetdbTemp=DBEngine(0).OpenDatabase(c:\db4.mdb,dbOpenSnapshot)astr=SELECTdb1.产品编号,((db1.出厂价-db1.成本)/db1.成本)ASdRate,&_(db1.出厂价*db1.销售数量)ASeTotalFROMdb1ORDERBYdb1.产品编号SetrsTemp=dbTemp.OpenRecordset(astr)IfrsTemp.RecordCount0ThenrsTemp.MoveFirstDoUntilrsTemp.EOFList1.AddItemrsTemp![产品编号]&&rsTemp![dRate]&_&rsTemp![eTotal]rsTemp.MoveNextLoopEndIfEndSub在上面的程序段中,通过计算字符操作表中以有字段,然后再将结果输出到输出字段中保存。二、JOIN...ON...语句JOIN...ON...语句是SQL查询中用于连接多个表的语句,该语句的语法为:FROMtable1[INNER|OUTER|LEFT|RIGHT]JOINtable2ONtable1.field1compoprtable2.field24其中tabel1指定要查询的表,tabel2指定连接到tabel1的表,field1,field2指定连接字段名称,compopr指定关系比较符,它可以是大于、小于、等于、不等于等。范例三:列出所有书籍以及它的作者在BIBLIO中,书籍的名称位于Titles表的Title字段中,而书籍的作者位于Authors表的Autoor字段中,而这两个表之间没有相关联的字段,我们这时需要联合数据库中的TitleAuthor表,利用该表的Au_ID字段同Authors表中的Au_ID字段的关联以及ISBN字段同Titles表中的ISBN字段的关联,范例如下:PrivateSubForm_Load()DimrsTempAsRecordsetDimdbTempAsDatabaseDimastrAsStringSetdbTemp=DBEngine(0).OpenDatabase(e:\programfiles\microsoftvisualstudio\vb98\biblio.mdb,dbOpenSnapshot)astr=SELECTAuthors.Author,Titles.TitleFROM&_([TitleAuthor]INNERJOINTitlesON[TitleAuthor].ISBN=Titles.ISBN)&_INNERJOINAuthorsON[TitleAuthor].Au_ID=Authors.Au_ID&_WHERETitles.TitleLIKE'*Beginner*'SetrsTemp=dbTemp.OpenRecordset(astr)IfrsTemp.RecordCount0ThenrsTemp.MoveFirstDoUntilrsTemp.EOFList1.AddItemrsTemp![Title]&&rsTemp![Author]rsTemp.MoveNextLoopEndIfEndSub在上面的范例中,我们使用两个INNERJION联合将Authors表中的Au_ID字段和Titles表中的ISBN字段连接到TitleAuthor表中,然后在TitleAuthor表中查找Title字段中包含字符串“Beginner”的纪录并将Title字段和Author字段输出。SQL查询语言基本教程(2)三、GROUPBY...语句GROUPBY...语句实现纪录分组功能,它通常需要和上面我们提到过的统计函数SUM、COUNT等联合使用,它的语法为:SELECTcolumn1[,column2]FROMtable1[,table2]WHEREconditionsGROUPBYcolumn1[,column2]ORDERBYcolumn1[,column2]范例四:计算学生成绩及总成绩5我们依然使用上一章使用的数据库c:\db4.mdb,在其中加入一个名字为db2的表,表的结构以及数据如下:字段名学生科目成绩张严语文86.5李永语文93王为语文91张严数学96.5李永数学90王为数学87张严英语80.5李永英语94王为英语98建立新工程,加入DAO定义库。在Form1中加入一个ListBox控件,然后在Form_load中加入以下代码:PrivateSubForm_Load()DimrsTempAsRecordsetDimdbTempAsDatabaseDimastr