范例二:如何在数据表中加入统计等功能
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字段输出。