发表于:2009/7/16 21:23:24
#0楼
数据库查询语言(sql)是使用于关系数据库的标准语言,被很多类型的数据库所支持。本文将以vb加dao为例,来介绍
基本的sql语法以及使用。本章将介绍的是sql语言中的基本查询语句,并带有范例。
要更好的阅读本文,读者需要对数据库的基本结构以及术语有一个基本的了解,而且最好能有一定的vb数据库编程经验。
除非特别说明,本文将使用的数据库是vb中附带的biblio.mdb数据库。
一、select...from...where语句
语句的语法如下:
select [all | * | distinct column1, column2]
from table1[, table2]
where [condition1 | expression1] [and condition2 | rxpression2]
在上面的语法中,[]外的语句是必须的,而[]内的是可选的,对于以 | 分割的操作符,则表明语法中必须从| 分割的
操作符中选择一个。下面的语法描述同上。
在select...from...where语句中其中select指定需要检索的字段,from指定要查询的表,where指定选择纪录的条件,
另外还可以包含order by语句来制定排序纪录。语法如下:
order by column1 | integer [asc | desc]
其中column1制定排序的字段,也可以使用integer指定的字段索引来排序,asc为升序、desc为降序。
范例一:找到titles表中所有出版日期在1990年以后以及包含文字beginner的书名
建立一个新工程,加入dao定义库(点击菜单中的 project | references项,在列表中选择microsoft dao 3.51 object library
(也可以是更高版本的3.60,如果安装了的话),然后在form中加入一个listbox控件。在form1的代码窗口中加入以下代码:
private sub form_load()
dim rstemp as recordset
dim dbtemp as database
dim astr as string
set dbtemp = dbengine(0).opendatabase(e:\program files\microsoft visual studio\vb98\biblio.mdb, _
dbopensnapshot)
astr = select [title] from [titles] where [year published] > 1990 & _
and title like *beginner* order by title desc
set rstemp = dbtemp.openrecordset(astr)
if rstemp.recordcount > 0 then
rstemp.movefirst
do until rstemp.eof
list1.additem rstemp![title]
rstemp.movenext
loop
end if
end sub
运行程序,list1中就会列出所有出版日期在1990年以后以及包含文字beginner的书的书名并将书名按照降序进行排列。
在上面的select语句的where中,我们使用了操作符号 > 来比较大小以及使用like进行匹配。在where语句中,可以使
用的操作符有以下几类:
1、比较操作符
包含 =、、>、=、 #19980-10-01#
而在使用通配符和like操作符时,需要使用引号而不是#号,例如 where [birthday] like 1990-01-*。引号告诉数据库引
擎将日期当字符串处理,而#号告诉数据库引擎将日期当数字处理。对于where语句所要使用的逻辑操作符,在下面的文章中还
要提到。
范例二:如何在数据表中加入统计等功能
sql当中提供了一定数量的统计以及计算功能,其中统计函数主要有如下一些:
count 计算字段中的纪录数
sum 计算字段中的所有值的和
max 获得字段中所有值中的最大值
min 获得字段中所有值中的最小值
avg 计算字段中所有值的平均值
计算符有 +、-、*、/ 4种。这些计算、统计函数的使用方法如下:
functionname fieldname as outfieldname
其中functionname定义函数名、fieldname 定义要操作的字段、outfieldname定义保存输出结果字段名称,下面是范例
程序,首先建立一个数据库,将数据库保存为 c:\db4.mdb。然后在数据库中加入一个名称为db1的表,表的结构如下:
字段名称 产品编号 成本 出厂价 销售数量
a00020 ¥89.95 ¥95.00 900
a00056 ¥54.00 ¥89.00 2400
a00021 ¥2,300.00 ¥2,896.00 600
a10916 ¥120.00 ¥209.00 1200
a00987 ¥907.00 ¥1,090.00 1000
其中产品编号为文本类型、成本和出厂价字段为货币类型、销售数量为长整形数据。保存表,在vb工程中加入dao定义
库,在form1中加入一个listbox控件,在form1代码窗口中加入以下代码:
private sub form_load()
dim rstemp as recordset
dim dbtemp as database
dim astr as string
set dbtemp = dbengine(0).opendatabase(c:\db4.mdb, dbopensnapshot)
astr = select db1.产品编号, ((db1.出厂价 - db1.成本)/db1.成本) as drate, & _
(db1.出厂价 * db1.销售数量)as etotal from db1 order by db1.产品编号
set rstemp = dbtemp.openrecordset(astr)
if rstemp.recordcount > 0 then
rstemp.movefirst
do until rstemp.eof
list1.additem rstemp![产品编号] & & rstemp![drate] & _
& rstemp![etotal]
rstemp.movenext
loop
end if
end sub
在上面的程序段中,通过计算字符操作表中以有字段,然后再将结果输出到输出字段中保存。
二、join...on...语句
join...on... 语句是sql查询中用于连接多个表的语句,该语句的语法为:
from table1 [inner|outer|left|right] join table2 on table1.field1 compopr table2.field2
其中tabel1指定要查询的表,tabel2指定连接到tabel1的表,field1, field2指定连接字段名称,
compopr指定关系比较符,它可以是大于、小于、等于、不等于等。
范例三: 列出所有书籍以及它的作者
在biblio中,书籍的名称位于titles表的title字段中,而书籍的作者位于authors表的autoor字段中,而这两个表之间没
有相关联的字段,我们这时需要联合数据库中的title author表,利用该表的au_id字段同authors表中的au_id字段的关联以及
isbn字段同titles表中的isbn字段的关联,范例如下:
private sub form_load()
dim rstemp as recordset
dim dbtemp as database
dim astr as string
set dbtemp = dbengine(0).opendatabase(e:\program files\microsoft visual studio\vb98\biblio.mdb, dbopensnapshot)
astr = select authors.author, titles.title from & _
([title author] inner join titles on [title author].isbn = titles.isbn) & _
inner join authors on [title author].au_id = authors.au_id & _
where titles.title like *beginner*
set rstemp = dbtemp.openrecordset(astr)
if rstemp.recordcount > 0 then
rstemp.movefirst
do until rstemp.eof
list1.additem rstemp![title] & & rstemp![author]
rstemp.movenext
loop
end if
end sub
在上面的范例中,我们使用两个inner jion联合将authors表中的au_id字段 和titles表中的isbn字段连接到title author
表中,然后在title author表中查找title字段中包含字符串“beginner”的纪录并将title字段和author字段输出
----------------------------------------------
此篇文章从博客转发
原文地址: Http://blog.gkong.com/more.asp?id=94033&Name=jczwfy
日本人说中日友好,中国人民笑了:你丫骗谁呢?
日本人说自己爱和平,亚洲人民笑了:说的是人话吗?
日本人说自己要维护世界和平,美国人民笑了:问你大爷没?
日本人说自己是人,全世界的狗都叫了:兄弟,做狗要厚道,不能忘本!
欢迎访问我的博客http://blog.gkong.com/blog.asp?name=jczwfy
在线PLC触摸屏问题解答加Q号2*7*5*4*7*0*0*6,加好友注明工控网
日本人说自己爱和平,亚洲人民笑了:说的是人话吗?
日本人说自己要维护世界和平,美国人民笑了:问你大爷没?
日本人说自己是人,全世界的狗都叫了:兄弟,做狗要厚道,不能忘本!
欢迎访问我的博客http://blog.gkong.com/blog.asp?name=jczwfy
在线PLC触摸屏问题解答加Q号2*7*5*4*7*0*0*6,加好友注明工控网