SQL語言基本教程(一) (轉)

worldblog發表於2007-12-04
SQL語言基本教程(一) (轉)[@more@]

語言基本教程(一)
  查詢語言(SQL)是使用於關聯式資料庫的標準語言,被很多型別的資料庫所支援。本文將以VB加DAO為例,來介紹
基本的SQL語法以及使用。本章將介紹的是SQL語言中的基本查詢語句,並帶有範例。
  要更好的閱讀本文,讀者需要對資料庫的基本結構以及術語有一個基本的瞭解,而且最好能有一定的VB資料庫。
除非特別說明,本文將使用的資料庫是VB中附帶的BIBLIO.M資料庫。

一、...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項,在列表中選擇 DAO 3.51 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 filesmicrosoft vb98biblio.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
  L
  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 filesmicrosoft visual studiovb98biblio.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欄位輸出。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-987945/,如需轉載,請註明出處,否則將追究法律責任。

相關文章