SQL語言基本教程(一)
數據庫查詢語言(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、比較操作符
包含 =、<>、>、<、>=、<= 等若干類
2、邏輯操作符
包含以下若干類:
LIKE、IN、BETWEEN、UNIQUE、IS NULL、EXISTS、ALL和ANY
LIKE 操作符通過使用通配符將一個值同其它值比較,在VB的SQL查詢中,可以使用的通配符是 * 和 ? 其中 * 代表任
意的若干個字符,而 ? 代表一個字符,例如上面語句中的LIKE '*Beginner* 代表查找所有包含字符串Beginner的值。不
過要注意的是使用 * 和 ? 作為通配符是VB的專利。真正的SQL語言的通配符是 % 和 _ ,其中 % 代表任意多個字符,_
代表一個字符例如VB中的Data Environment使用的就是 % 和 _ 作為查詢通配符。另外Microsoft Jet Engine對于LIKE
操作符還提供了其它一些的過濾選項,具體的內容可參見MSDN索引中的 Like Operator 條目。
IN 操作符用于比較某一個值是否等于幾個值中的一個值,例如下面的語句:
"SELECT [Title],[Year Published] FROM [Titles] WHERE [Year Published] IN (1990,1991,1995)"
將從表Titles中選擇所有在1990、1991、1995年出版的書籍紀錄。
BETWEEN 操作符勇于在兩個值之間搜索,例如 WHERE [Year Published] BETWEEN 1989 AND 1991 指定出版日期必須
在1989年和1991年之間。
對于邏輯操作符,可以結合NOT操作符實現改變查詢條件的方向。例如 WHERE [Year Published] NOT IN (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種。這些計算、統計函數的使用方法如下:
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字段輸出。