VB中使用SQL语言基本.docx

上传人:b****5 文档编号:28284785 上传时间:2023-07-10 格式:DOCX 页数:19 大小:22.64KB
下载 相关 举报
VB中使用SQL语言基本.docx_第1页
第1页 / 共19页
VB中使用SQL语言基本.docx_第2页
第2页 / 共19页
VB中使用SQL语言基本.docx_第3页
第3页 / 共19页
VB中使用SQL语言基本.docx_第4页
第4页 / 共19页
VB中使用SQL语言基本.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

VB中使用SQL语言基本.docx

《VB中使用SQL语言基本.docx》由会员分享,可在线阅读,更多相关《VB中使用SQL语言基本.docx(19页珍藏版)》请在冰豆网上搜索。

VB中使用SQL语言基本.docx

VB中使用SQL语言基本

VB中使用SQL语言基本教程

SQL语言基本教程

(一)

   数据库查询语言(SQL)是使用于关系数据库的标准语言,被很多类型的数据库所支持。

本文将以VB加DAO为例,来介绍

基本的SQL语法以及使用。

本章将介绍的是SQL语言中的基本查询语句,并带有范例。

   要更好的阅读本文,读者需要对数据库的基本结构以及术语有一个基本的了解,而且最好能有一定的VB数据库编程经验。

除非特别说明,本文将使用的数据库是VB中附带的数据库。

一、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项,在列表中选择MicrosoftDAOObjectLibrary

(也可以是更高版本的,如果安装了的话),然后在Form中加入一个ListBox控件。

在Form1的代码窗口中加入以下代码:

PrivateSubForm_Load()

   DimrsTempAsRecordset

   DimdbTempAsDatabase

   DimastrAsString

   

   SetdbTemp=DBEngine(0).OpenDatabase("e:

\programfiles\microsoftvisualstudio\vb98\",_

dbOpenSnapshot)

   astr="SELECT[Title]FROM[Titles]WHERE[YearPublished]>1990"&_

           "ANDTitleLIKE'*Beginner*'ORDERBYTitleDESC"

   SetrsTemp=(astr)

   If>0Then

       

       DoUntil

           rsTemp!

[Title]

           

       Loop

   EndIf

EndSub

   运行程序,List1中就会列出所有出版日期在1990年以后以及包含文字Beginner的书的书名并将书名按照降序进行排列。

   在上面的SELECT语句的WHERE中,我们使用了操作符号>来比较大小以及使用LIKE进行匹配。

在WHERE语句中,可以使

用的操作符有以下几类:

1、比较操作符

   包含=、<>、>、<、>=、<=等若干类

2、逻辑操作符

   包含以下若干类:

   LIKE、IN、BETWEEN、UNIQUE、ISNULL、EXISTS、ALL和ANY

   LIKE操作符通过使用通配符将一个值同其它值比较,在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]LIKE"1990-01-*"。

引号告诉数据库引

擎将日期当字符串处理,而#号告诉数据库引擎将日期当数字处理。

对于WHERE语句所要使用的逻辑操作符,在下面的文章中还

要提到。

范例二:

如何在数据表中加入统计等功能

   SQL当中提供了一定数量的统计以及计算功能,其中统计函数主要有如下一些:

COUNT计算字段中的纪录数

SUM计算字段中的所有值的和

MAX获得字段中所有值中的最大值

MIN获得字段中所有值中的最小值

AVG计算字段中所有值的平均值

   计算符有+、-、*、/4种。

这些计算、统计函数的使用方法如下:

   functionnamefieldnameASoutfieldname

   其中functionname定义函数名、fieldname定义要操作的字段、outfieldname定义保存输出结果字段名称,下面是范例

程序,首先建立一个数据库,将数据库保存为c:

\。

然后在数据库中加入一个名称为db1的表,表的结构如下:

字段名称产品编号成本  出厂价  销售数量

  A00020  ¥  ¥  900

  A00056  ¥  ¥  2400

  A00021  ¥2,¥2,600

  A10916  ¥¥1200

  A00987  ¥¥1,1000

   其中产品编号为文本类型、成本和出厂价字段为货币类型、销售数量为长整形数据。

保存表,在VB工程中加入DAO定义

库,在Form1中加入一个ListBox控件,在Form1代码窗口中加入以下代码:

PrivateSubForm_Load()

   DimrsTempAsRecordset

   DimdbTempAsDatabase

   DimastrAsString

   

   SetdbTemp=DBEngine(0).OpenDatabase("c:

\",dbOpenSnapshot)

   astr="SELECTdb1.产品编号,((db1.出厂价-db1.成本)/db1.成本)ASdRate,"&_

   "(db1.出厂价*db1.销售数量)ASeTotalFROMdb1ORDERBYdb1.产品编号"

   SetrsTemp=(astr)

   If>0Then

       

       DoUntil

           rsTemp!

[产品编号]&"   "&rsTemp!

[dRate]&_

               "   "&rsTemp!

[eTotal]

           

       Loop

   EndIf

EndSub

   在上面的程序段中,通过计算字符操作表中以有字段,然后再将结果输出到输出字段中保存。

二、JOIN...ON...语句

   JOIN...ON...语句是SQL查询中用于连接多个表的语句,该语句的语法为:

   FROMtable1[INNER|OUTER|LEFT|RIGHT]JOINtable2ONcompopr

   其中tabel1指定要查询的表,tabel2指定连接到tabel1的表,field1,field2指定连接字段名称,

compopr指定关系比较符,它可以是大于、小于、等于、不等于等。

   范例三:

列出所有书籍以及它的作者

   在BIBLIO中,书籍的名称位于Titles表的Title字段中,而书籍的作者位于Authors表的Autoor字段中,而这两个表之间没

有相关联的字段,我们这时需要联合数据库中的TitleAuthor表,利用该表的Au_ID字段同Authors表中的Au_ID字段的关联以及

ISBN字段同Titles表中的ISBN字段的关联,范例如下:

PrivateSubForm_Load()

   DimrsTempAsRecordset

   DimdbTempAsDatabase

   DimastrAsString

   

   SetdbTemp=DBEngine(0).OpenDatabase("e:

\programfiles\microsoftvisualstudio\vb98\",dbOpenSnapshot)

   astr="SELECT,FROM"&_

   "([TitleAuthor]INNERJOINTitlesON[TitleAuthor].ISBN="&_

   "INNERJOINAuthorsON[TitleAuthor].Au_ID="&_

   "WHERELIKE'*Beginner*'"

   SetrsTemp=(astr)

   If>0Then

       

       DoUntil

           rsTemp!

[Title]&"   "&rsTemp!

[Author]

           

       Loop

   EndIf

EndSub

   在上面的范例中,我们使用两个INNERJION联合将Authors表中的Au_ID字段和Titles表中的ISBN字段连接到TitleAuthor

表中,然后在TitleAuthor表中查找Title字段中包含字符串“Beginner”的纪录并将Title字段和Author字段输出。

SQL查询语言基本教程

(2)

三、GROUPBY...语句

   GROUPBY...语句实现纪录分组功能,它通常需要和上面我们提到过的统计函数SUM、COUNT等联合使用,它的语法为:

SELECTcolumn1[,column2]

FROMtable1[,table2]

WHEREconditions

GROUPBYcolumn1[,column2]

ORDERBYcolumn1[,column2]

范例四:

计算学生成绩及总成绩

   我们依然使用上一章使用的数据库c:

\,在其中加入一个名字为db2的表,表的结构以及数据如下:

字段名学生科目成绩

张严语文

李永语文93

王为语文91

张严数学

李永数学90

王为数学87

张严英语

李永英语94

王为英语98

   建立新工程,加入DAO定义库。

在Form1中加入一个ListBox控件,然后在Form_load中加入以下代码:

PrivateSubForm_Load()

   DimrsTempAsRecordset

   DimdbTempAsDatabase

   DimastrAsString

   

   SetdbTemp=DBEngine(0).OpenDatabase("c:

\",dbOpenSnapshot)

   astr="SELECTSUM(db2.成绩)ASrTotal,FORMAT((AVG(db2.成绩)),'###.#')ASrAVG,"&_

           "(db2.学生)ASStudentFROMdb2GROUPBYdb2.学生"

   SetrsTemp=(astr)

   If>0Then

       

       DoUntil

           rsTemp!

[Student]&Chr(5)&rsTemp!

[rTotal]&_

               "      "&rsTemp!

[rAVG]

           

       Loop

   EndIf

EndSub

   在上面的代码中,我们利用GROUPBY将纪录根据学生姓名分组,再建立了两个统计字段rTotal和rAvg并分别利用

统计函数SUM和AVG分别统计各个分组的总成绩以及平均成绩。

要注意的是,在SELECT语句中出现的字段,如果没有包含

在统计函数内的话,都要包含在GROUPBY子句中。

   另外在上面的SQL查询中我们还使用了FORMAT子句,这是SQL中的转换和格式化语句中的一个,该语句的语法同VB中

的Format语句是一样的,相似的语句还有FIX语句。

需要注意的一点是,虽然在MicrosoftJETEngine中的SQL语法和

ANSI决大部分是一样的,但是有一些还是保留了“微软特色”,特别是象这一类的转换和格式化语句,例如FORMAT就是

ANSI中没有的。

而象其它数据库,诸如oracle也有各自的SQL语法扩展。

在使用不同数据库进行SQL查询时要注意这一点。

   在GROUPBY语句中还可以连接使用HAVING子句。

该语句同GROUPBY的关系就如同WHERE子句同SELECT的关系类似,

WHERE子语句为SELECT所选择的列设置条件,而HAVING子语句是给由GROUPBY创建的组设置条件。

例如如果将上面的范例

中的astr改变为如下的字符串:

astr="SELECTSUM(db2.成绩)ASrTotal,FORMAT((AVG(db2.成绩)),'###.#')"&_

           "ASrAVG,(db2.学生)ASStudentFROMdb2GROUPBYdb2.学生"&_

           "HAVING(AVG(db2.成绩))>=90"

则在List中就将只会列出平均成绩大于90分的学生的成绩和名字。

范例五:

获得分数高于总平均分数的学生及科目

   我们仍然使用上面建立的db2表。

建立新工程,加入DAO定义库。

在Form1中加入一个ListBox控件和一个Label控件

然后在Form_load中加入以下代码:

PrivateSubForm_Load()

   DimrsTempAsRecordset

   DimdbTempAsDatabase

   DimastrAsString

   

   SetdbTemp=DBEngine(0).OpenDatabase("c:

\",dbOpenSnapshot)

   

   astr="SELECTFORMAT(AVG(db2.成绩),'###.#')AStAVGFROMdb2"

   SetrsTemp=(astr)

   ="总平均成绩:

"&rsTemp!

[tAVG]

   

   SetrsTemp=Nothing

   

   astr="SELECTdb2.成绩,db2.学生,db2.科目FROMdb2WHEREdb2.成绩>"&_

           "(SELECTAVG(db2.成绩)FROMdb2)GROUPBYdb2.学生,db2.成绩,db2.科目"&_

           "ORDERBYdb2.学生"

   SetrsTemp=(astr)

   If>0Then

       

       DoUntil

           rsTemp!

[学生]&"   "&rsTemp!

[科目]&"   "&rsTemp!

[成绩]

           

       Loop

   EndIf

EndSub

   运行程序,在Lable1中列出总平均分数。

在List1中列出了学生姓名、获得高于平均分数的科目以及科目成绩。

在上面的查询中,我们使用了一个嵌套查询,首先在子查询中获得所有科目总的平均分数,然后在查询中查询成绩字段

值大于平均分数的纪录。

四、TRANSFORM...PIVOT...语句

   这是MicrosoftJETEngine以上版本所特有的SQL查询语句,该语句的特点是可以建立一个交叉表格式的查询,

一个交叉表同电子表相类似。

该语句可以将表中的某些数据作为行,某些数据作为列建立交叉表。

该语句的语法如下:

TRANSFORMcondition[selectopreation]PIVOTcolumn

   其中condition是在交叉表中要显示的数据,selectopreation是一个SELECT...FROM...查询,该查询形成交叉表的

航信息,PIVOTrecordset中column为表中的一个字段,PIVOT子句使用该字段形成交叉表的列。

范例六:

建立学生成绩表

   我们还是使用上面已经建立的中的db2表。

首先建立一个新的工程,然后在Form1中加入一个DataGrid控件,然后

向工程中加入一个DataEnvironment,在Connection1上点击鼠标右键,在菜单中选择properties...,在属性窗口的提供者

页面中选择MicrosoftJETOLEDBProvider,在连接页面的数据库名称输入框中输入c:

\,然后点击测试

连接按钮,如果正常,点击确定退出。

再在Connection1上点击鼠标右键,在菜单中选择Addcommand建立一个名为Command1

的命令,点击Command1右键菜单,选择Properties...项,然后在Command1属性窗口的General页面中选择SQLStatement,

在SQL查询语句输入框中输入下面的查询:

TransformSUM(db2.成绩)ASiResSELECTdb2.学生FROMdb2GROUPBYdb2.学生Pivotdb2.科目

   注意文本框回自动换行,不要输入回车。

然后点击确定按钮。

   回到Form1,将DataGrid1的DataSource设置为DataEnvironment1,将DataMember设置为Command1,然后运行程序,可以看

到在DataGrid1中以表的形式列出了学生成绩,以学生为行,以成绩为列。

运行后得到的表格效果如下:

学生数学英语语文

李永909493

王为879891

张严

   再回到DataEnvironment界面,双击Command1就可以看到查询建立的数据列,在上面的查询共建立了4个数据列,其中三个

分别是科目分类,列中的数据为科目成绩,第一列为学生的名字,列中的数据为学生的名字。

   上面的查询中还使用了SUM子语句,这时因为对于GROUPBY来说,没有包含在统计函数内的列都要包含在GROUPBY中,如果

将字段db2.成绩包含在GROUPBY子语句中,就会使最终结果出现9行而不是3行。

由于每个学生的每科成绩只有一个,所以可以

使用SUM函数将字段db2.成绩排除在GROUPBY外面。

   在下一章内,将向大家介绍SQL语言中的数据库结构定义部分以及数据操纵部分。

SQL查询语言基本教程(3)

四、CREATETABLE语句

   CREATETABLE语句的语法为:

   

CREATETABLEtable(field1type[(size)][NOTNULL][index1]

[,field2type[(size)][NOTNULL][index2][,...]]

[,CONSTRAINTmultifieldindex[,...]])

table  

   新建立的表的名称

field1type[(size)][NOTNULL][index1]

   field1为字段名称,Type为字段数据类型,size为字段宽度,下面表详细

描述了Type的取值以及描述

Type  Jet数据类型  描述

BIT  Yes/No   逻辑类型

BYTE  Numberic-Byte  字节数字

COUNTER  Counter   自动编号

CURRENCYCurrency  货币数字

DATETIMEDate/Time  日期、时间

DOUBLE  Numberic-Double  双精度浮点数字

LONG  Numberic-Long  长整数

LONGBINARYOleObject  OLEobject类型

LONGTEXTMemo   备注类型

SHORT  Numberic-Integer整数

SINGLE  Numberic-Single  单精度浮点数字

TEXT  Text

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1