亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

手把手教你在ASP中使用SQL語句

2019-11-18 19:58:58
字體:
來源:轉載
供稿:網友

五花八門的SQL產品多得要命,或許你早顧不得其它甩開袖子就動手干了。但你要同時采用asp和SQL的話就可能會頭暈。MySQL、SQL Server和mSQL都是絕佳的SQL工具,可惜,在ASP的環境下你卻用不著它們來創建實用的SQL語句。不過,你可以利用自己掌握的access知識以及相應的Access技能,再加上我們的提示和技巧,相信一定能成功地在你的ASP網頁中加入SQL。


1. SELECT 語句

在SQL的世界里,最最基礎的操作就是SELECT 語句了。在數據庫工具下直接采用SQL的時候很多人都會熟悉下面的操作:
SELECT what
FROM whichTable
WHERE criteria

執行以上語句就會創建一個存放其結果的查詢。

而在ASP頁面文件上,你也可以采用以上的一般語法,不過情況稍微不同,ASP編程的時候,SELECT 語句的內容要作為字符串賦給一個變量:
SQL = "SELECT what FROM whichTable WHERE criteria"

好了,明白了ASP下SQL“說話”的方式,接下來如法炮制即可,只要滿足你的需要,傳統的SQL查詢模式和條件查詢都能派用場。

舉例說明,不妨假設你的數據庫內有個數據表,名字是PRoducts ,現在你想取出這個表里的全部記錄。然后你就編寫了下面的代碼:
SQL ="SELECT * FROM Products"

以上代碼——SQL語句的作用就是取出表內的全部數據——執行后將會選出數據表內的全部記錄。不過,要是只想從表內取出某個特定列,比如p_name。那就不能用 * 通配符了,這里得鍵入具體某列的名字,代碼如下:
SQL ="SELECT p_name FROM Products"

執行以上查詢之后Products 表內、p_name 列的內容就會全被選取出來。


2. 用WHERE子句設置查詢條件

有的時候取出全部數據庫記錄也許正好滿足你的要求,不過,在大多數情況下我們通常只需得到部分記錄。這樣一來該如何設計查詢呢?當然會更費點腦筋了,何況本文也存心不想讓你去用那個什么勞什子的recordset。

舉個例子,假如你只打算取出p_name 記錄,而且這些記錄的名字必須以字母w打頭,那么你就要用到下面的WHERE 子句了:
SQL ="SELECT p_name FROM Products WHERE p_name LIKE 'W%'"

WHERE 關鍵詞的后面跟著用來過濾數據的條件,有了這些條件的幫助,只有滿足一定標準的數據才會被查詢出來。在以上的例子里,查詢的結果只會得到名字以w 打頭的p_name 記錄。

以上例子中,百分比符號(%)的含義是指示查詢返回所有w 字母打頭而且后面是任何數據甚至沒有數據的記錄條目。所以,在執行以上查詢的時候, west 和 willow 就會從Products 表內被選取出來并存放在查詢里。

就像你看到的那樣,只要仔細地設計SELECT 語句,你就可以限制recordset 中返回的信息量,多琢磨琢磨總能滿足你的要求。

這些啊還不過是掌握SQL用途剛起步。為了幫助你逐步掌握復雜的SELECT 語句用法,下面就讓我們再來看一下關鍵的標準術語:比較運算符,這些玩意都是你在構筑自己的SELECT 字符串來獲得特定數據時要經常用到的。

WHERE子句基礎
在開始創建WHERE 子句的時候,最簡單的方式是采用標準的比較符號,它們是 < 、 <= 、 > 、 >= 、<> 和 =。顯然,你很快就能明白以下代碼的含義和具體運行結果:
SELECT * FROM Products WHERE p_price >= 199.95
SELECT * FROM Products WHERE p_price <> 19.95
SELECT * FROM Products WHERE p_version = '4'

注意: 這里你會注意到,最后一個例句中的數字4周圍加了單引號。原因是這樣的,在這個例子中的 '4' 是文本類型而非數字類型。因為你會把 SELECT 語句放到引號中來把它作為一個值賦給變量,所以你也可以在語句中采用引號。

比較運算符
比較運算符指定從表內取出數據的內容范圍。你可以用它們來創建過濾器以便縮小recordset的范圍,促使其只保存給定任務下你關心的信息。

3. LIKE 、 NOT LIKE和 BETWEEN


你已經在上面取出w打頭記錄的例子中看到了LIKE的用法。LIKE判定詞是一個非常有用的符號。不過,在很多情況下用了它可能會帶給你太多的數據,所以在用到它之前最好先開動腦筋多想想自己到底想獲得什么數據。假設你想取出5位數字的SKU號碼,而且其開頭是1結尾是5,那么你可以用下劃符(_)代替%符號:
SQL = "SELECT * FROM Products WHERE p_sku LIKE '1___5'"

下劃符表示任意一個字符。所以在輸入“1 _ _ _ 5”的情況下,你的搜索就會限制在滿足特定模式的5位數范圍內了。

假如你想反其道而行之,要找出所有不匹配“1_ _ _ 5”模式的SKU條目。那么你只需要在剛才語句例子中的LIKE前面加上NOT就可以了。

BETWEEN
假設你想取出一定范圍內的數據,而且你事先知道范圍的起點和終點,那么你不妨采用BETWEEN 判斷詞?,F在就讓我們假設你想選取給定表內范圍在 1和 10之間的記錄。你可以如下使用BETWEEN:
…WHERE ID BETWEEN 1 AND 10

或者你也可以采用已經熟悉的數學判斷字句:
…WHERE ID >= 1 AND ID >= 10


4. 聯合語句

我們到目前為止所談到的SQL語句相對較為簡單,如果再能通過標準的recordset循環查詢,那么這些語句也能滿足一些更復雜的要求。不過,何必非要拘泥在淺嘗則止的基礎水準之上呢?你完全可以再增加其他一些符號,比如AND、 OR和NOT來完成更強大的功能。

以下面的SQL語句為例:
SQL ="SELECT c_firstname, c_lastname, c_email FROM customers WHERE c_email IS
NOT NULL AND c_purchase = '1' OR c_purchase = '2' AND c_lastname LIKE
'A%'"

就你目前所掌握的SQL知識,以上的例子也不難解釋,不過上面的語句并沒有很明白地讓你看清條件字句是如何膠合在單一SQL語句中的。

多行語句
在SQL語句不好懂的情況下,你不妨把整個語句分解為多行代碼,然后在現有變量基礎上逐步增加查詢語句的各個組成部分并把它存在同一變量內:
    SQL = "SELECT c_firstname, c_lastname, c_emailaddress, c_phone"
    SQL = SQL & " FROM customers"
    SQL = SQL & " WHERE c_firstname LIKE 'A%' and c_emailaddress NOT NULL"
    SQL = SQL & " ORDER BY c_lastname, c_firstname"
到了最后一句,SQL變量就包含了以下的完整SELECT 語句:
"SELECT c_firstname, c_lastname, c_emailaddress, c_phone FROM customers
WHERE c_firstname LIKE 'A%' and c_emailaddress NO NULL ORDER BY c_lastname,
c_firstname"

整句照上面分解之后顯然好讀多了!在進行調試的時候,你或許更樂于多敲幾個字符把程序改得更好讀些。不過你可要記住了,在封閉引號之前或者在打開引號之后你需要增加空格,這樣才能保證字符串連接起來的時候你沒有把幾個詞湊到了一塊。
5. 開始執行

在學會了SELECT語句的構造和用途之后你就該學習如何使用它了。在你所掌握的數據庫工具下,這可能意味著你得按下某個寫著“執行”字樣的按鈕。在ASP網頁上,可以立即執行SQL語句也可以當作存儲過程調用。

一旦創建了SQL 語句,你還得設法訪問其查詢結果。顯然,這里的關鍵就是ASP recordset。在使用非SQL的recordset時,創建recordset的代碼通常如下所示:
Dim objRec
Set objRec = Server.CreateObject ("ADODB.Recordset")
objRec.Open "customers", objConn, 0, 1, 2

如果你對ASP比較熟悉以上的代碼對你可就不陌生了,你應該知道“customers”表示你打開數據庫內一個數據表的名字。

打開recordset
為了充分利用你更為熟悉的SQL技能,你需要調整常規ASP網頁上最常采用的recordset:
 Dim objRec
Set objRec = Server.CreateObject ("ADODB.Recordset")
objRec.Open SQL, objConn, 0, 1, 2

這里唯一的修改就是在objRec.Open,之后用包含SQL語句的變量代替了要查詢的數據表的名稱。

這種方法的優點之一是你可以指定游標類型(如以上0, 1 ,2 所示)。

執行SQL
你可以用緊湊的一行代碼執行SQL語句來創建recordset。以下是語法:
Dim objRec
set objRec = objConn.Execute(SQL)

在上例中,你所看到的SQL是你存放自己SQL SELECT 語句的變量。該代碼行“運行”SQL語句(或者說對數據庫進行查詢),選取數據并把數據存放在recordset 內,在上例中就是變量objRec。這種方法的主要缺點是你不能選擇自己想采用的游標類型。相反,recordset總是用前向游標打開。

因為游標的緣故,你或許打算熟悉兩種創建recordset的方法。直接執行查詢節省了鍵入字符所消耗的時間,但那樣的話你就得采用默認的游標了,這樣有可能遭遇經常不能正常運行的毛病。不管你具體采用哪種辦法,兩者之間的最大的差別也不外乎代碼精練與否。在不考慮你取得什么字段、你的標準是什么的前提下,也不管你如何存儲數據,采用SQL式的recordset 在體積上會比ASP上打開的標準recordset 要小得多,更別提操作起來的簡易性了。畢竟,通過過濾數據,你消除了耗費時間的if-then 測試和可能用到的循環。

編寫測試用SQL
這里有個技巧,許多專業ASP程序員習慣在測試網頁的時候“編寫”自己的SQL語句。這樣做可以幫助你調試代碼,因為你可以從中看到傳遞給服務器執行的字符串。而你要做的無非是增加Response.WriteyourVariable 在屏幕上顯示有關信息。在你把和SQL有關的問題提交給ASP討論組的時候你就應該附上這些信息。

6. 存儲查詢


當你的查詢相對簡單的時候,每次從頭開始創建SQL語句也不費什么工夫,不過,復雜的查詢就不同了,每次都從頭來會產生很多開發錯誤。因此,一旦讓SQL順利地運行起來,你最好把它們存起來,在需要時再調用它們。這樣,哪怕是一個簡單查詢你都能隨時用上存儲的查詢語句了。

假設你每周都要給團隊做一次報告,指出目前存在的業務支持問題,這些數據需要從你的數據庫中選取,而且要按照日期選擇記錄,同時根據你所在團隊所采用的支持問題的類別排序。一旦你設計了這一查詢,你何必以后每周都重新編寫一次呢?不要在你的HTML頁面上創建查詢,你應該用你的數據庫工具創建查詢并且保存它。

然后你可以采用ActiveCommand 屬性把查詢插入到你的ASP網頁。頭一兩回你可能會覺得沒啥意思,其實也就幾行代碼而已:
Set objSQ = Server.CreateObject ("ADODB.Command")
objSQ.ActiveConnection = "databaseName"

objSQ.CommandText = "storedQueryName"
objSQ.CommandType = adCmdStoredProc

set objRec = objSQ.Execute

注意,采用adCmdStoredProc 表示你已經在頁面上包含了adovbs.inc 文件。該文件定義了你可以按照名字而非數字進行訪問的Access常數。只需要在頁面上包含該文件即可(<!--#INCLUDE -->),然后你就可以用adCmdStoredProc 這類名字了。這樣,將來你再看到的時候更容易理解以上被存儲的查詢到底是個什么意思。

7. ORDER BY

從Access數據庫中選取記錄有件最令人喪氣的事情,它們是以怎樣的順序輸入到數據庫內就按照怎樣的順序出來。就算你在Access環境內采用Sort By來改變記錄視圖,數據表內的記錄順序也并沒有發生改變。


如果你正在使用ASPrecordset在網頁上寫出記錄,那么你或許知道亂紛紛的順序是多令人痛苦的事。但是你可能不得不經常得面對這一問題,因為并不存在什么簡單方便的解決方案。好在ORDER BY 可以簡化這一難題。

為了對你的結果排序,只要在SELECT語句末尾加上ORDER BY,然后指定你需要排序的參照列即可。因此,如果你想要根據顧客的姓氏對Customers表排序,那么你可以編寫如下的查詢語句:
SQL = "SELECT c_lastname, c_firstname, c_email FROM Customers ORDER BY c_lastname"

這樣,只要你建立了recordset而且開始把結果寫到屏幕上,你就會看見數據按照字母順序排列起來了。

多級排序
其實不僅僅可以在SQL語句中進行一級排序。實際上,在很多情況下,你可能會希望指定兩到三級深度的數據排序。假設你有以下數據表,其內容如下所示:


先前采用的單級ORDER BY 排序是按下面的順序取出數據的:
Absurdly Assured
absurd@assured.com

Absolutely Assured
absolutely@assured.com

Crazed Coder
crazy@coder.net

Loosely Fringe
loose@fringe.to

Lunatic Fringe
lune@fringe.to

Hands On
hands@yes.org


顯然ORDER BY 起了應有的作用。在實際的表結構下,Absurdly Assured 是最后的條目,但它排在檢索結果的最頂端。Hands On記錄排最后因為 O 在以上列表中排在字母表最后。顯然,Absolutely按照字母表最好排在Absurdly之前。為此,你需要采取第2級ORDER BY 排序標準,參照第2列進行排序:
SQL = "SELECT c_lastname, c_firstname, c_email FROM Customers ORDER BY
c_lastname, c_firstname"


其結果將首先按照c_lastname 列排序然后按照c_firstname 列排序。假如你的數據表包含的記錄比較多,仔細設計排序會令輸出結果編排更為合理。

投入使用
如果你同大多數程序員一樣喜歡自己動手編代碼,沉湎于掌握新技術的狂熱之中。何不從ASP的冗長編碼中轉過頭來嘗試一下SQL編碼呢?下面我們將就ASP編程時常見的問題以及如何在ASP中高效地利用SQL語句做一番探討。

11. 記錄統計

確定數據庫內有多少記錄,或者確定有多少記錄達到了某些標準,這些用ASP完成并非難事。如果你采用了正確的游標類型,你可以用RecordCount 屬性獲得記錄數當然也可以用recordset。但是,有個更簡單的辦法,這就是在自己的SELECT語句中采用count(*) ,代碼如下所示:
SQL = "SELECT count(*) FROM Customers"

或者
SQL = "SELECT count(*) FROM Customers WHERE c_lastname LIKE 'A%'"

舉例說明,以下代碼將選出一些記錄以及這些記錄的總數:
SQL = "SELECT c_firstname, c_lastname, count(*) FROM Customers WHERE c_lastname LIKE 'A%'"

但是你不能實現自己的目的。這里采用的“count”函數其實是一種集合函數,意思是只返回單行信息:回答你提出的問題。對第1個SELECT 語句來說,問題是“在客戶表內有多少條記錄?”查詢返回單一的值作為響應,因此它不能同你常規的查詢相組合。假如你希望得到其他數據,你需要采用RecordCount

集合函數除了“count”之外還包括AVG、MIN、MAX和SUM等。

12. 連接

任何熟悉SQL和關系數據庫的人都遇見過大量的連接類型。最簡單的說,連接(join)會把兩個表的內容組合到一個虛擬表或者recordset內。假如數據表有效地規一化,或許你會經常從某一個表中選出特定的信息再從另一個表中選出關聯信息。這樣做就需要簡單的“同等連接(equijoin)”。

為了了解實際的連接操作,現在讓我們假設在一個數據庫內存放了某類軟件的相關記錄。某個表(Software)包含了軟件產品的名稱、軟件的版本以及其他有關細節:



另一個表(Releases)則存儲了軟件發布歷史的信息,其中包括發布日期和發布狀態等(比如測試版、當前版、過時等):


 

上表中還包含了一個列,內容指向軟件表中采用的ID號。所以,通過這種索引軟件表的方式,你就知道發布表中software_ID 等于 2的軟件是Rome。

你采用連接組合信息,這樣就不需要在兩個表之間來回折騰了。不過,除了組合信息之外還可以通過連接把有關信息合并。這樣,只要發布表內的software_ID 匹配軟件表內的ID,你就把匹配信息一起放到一個記錄內。

代碼如下:
SQL = "SELECT * FROM Software, Releases WHERE software.ID = releases.softwareID"

仔細分析以上的語句,首先注意到兩個表名列在了FROM的后面。再根據所采用的連接,今后你可能還會發現語法會有所變化(或者連接類型有變),但是以上的語法是最基本的,顯示了數據的聯合選擇方式。這里的WHERE 子句用來比較特定的ID值。在Software 表內,存在ID 列。同樣的,Releases 表內則有個software_ID 列。為了明確你在WHERE 子句里要比較的值,你用表名作為前綴,后面還加上了一個點號(.)。

以下是連接選取數據之后的結果:


注意:在創建連接的時候要仔細考慮選出數據的列。以上代碼采用 * 通配符是為了讓讀者關注于SELECT 代碼行的其他部分。但是,正如你從上圖看到的那樣,你無法選出softwareID 列,因為這一列沒有作為recordset部分的增加值。它的作用就是為WHERE 子句所用。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久国产免费| 国产一区二区三区在线播放免费观看| 亚洲在线视频福利| 亚洲最大成人免费视频| 国产精品亚洲欧美导航| 97成人精品视频在线观看| 日韩精品视频免费专区在线播放| 久久精品成人欧美大片古装| 亚洲xxx大片| 欧美成人精品xxx| 另类美女黄大片| 精品国内亚洲在观看18黄| 原创国产精品91| 国产精品草莓在线免费观看| 久久久久久久久爱| 日韩精品极品在线观看播放免费视频| 亚洲男人av在线| 亚洲自拍小视频| 欧美极品欧美精品欧美视频| 欧美中文在线观看| 国产精品久久久久不卡| 亚洲一区二区三区视频| 国产精品久久视频| 69视频在线免费观看| 日韩免费不卡av| 亚洲а∨天堂久久精品喷水| 亚洲男人天堂视频| 欧美黑人极品猛少妇色xxxxx| 欧美限制级电影在线观看| 欧美在线免费看| 国产亚洲人成a一在线v站| 日韩av一卡二卡| 久久综合免费视频影院| 国产精品精品视频一区二区三区| 亚洲欧美成人一区二区在线电影| 欧美小视频在线| 91精品在线播放| 国产欧美一区二区三区久久人妖| 97视频在线观看免费高清完整版在线观看| 国产欧美精品一区二区| 日韩精品高清视频| 国产精品视频99| 亚洲a级在线观看| 中文字幕一区日韩电影| 亚洲欧美日韩久久久久久| 成人激情黄色网| 久久久久久这里只有精品| 欧美另类高清videos| 韩日欧美一区二区| 久热精品视频在线观看一区| 午夜伦理精品一区| 欧美精品激情视频| 欧美黑人xxxx| 中文字幕欧美日韩| 精品国产91乱高清在线观看| 中文字幕日韩在线视频| 欧美激情欧美狂野欧美精品| 国产精品私拍pans大尺度在线| 成人久久精品视频| 国产在线观看91精品一区| 久久精品影视伊人网| 日韩在线视频观看| 欧美人在线观看| 午夜精品一区二区三区在线| 亚洲精品中文字幕有码专区| 97在线精品视频| 正在播放欧美视频| 国产视频久久久久| 91丝袜美腿美女视频网站| 国产热re99久久6国产精品| 久久人人爽国产| 亚洲高清色综合| 中文字幕亚洲欧美在线| 亚洲成人国产精品| 9.1国产丝袜在线观看| 国产做受69高潮| 韩国19禁主播vip福利视频| 亚洲一级片在线看| 欧美日韩亚洲高清| 久久精品夜夜夜夜夜久久| 国产精品美女在线| 美女少妇精品视频| 日本亚洲欧美成人| 久久精品这里热有精品| 日韩在线观看成人| 久久99国产精品久久久久久久久| 日韩一区二区三区国产| 久久国产加勒比精品无码| 亚洲自拍欧美色图| 亚洲最新在线视频| 91精品91久久久久久| 日韩精品视频免费专区在线播放| 欧美性视频在线| 欧美一级黑人aaaaaaa做受| 97精品国产91久久久久久| 亚洲aⅴ男人的天堂在线观看| 色综合色综合久久综合频道88| 亚洲第一av网| 久久人人爽人人| 国产成人精品网站| 亚洲国产成人精品电影| www.欧美精品一二三区| 日韩精品极品视频| 亚洲va欧美va国产综合剧情| 国产自产女人91一区在线观看| 亚洲嫩模很污视频| 91在线无精精品一区二区| 欧美精品videosex牲欧美| 国产精品视频免费观看www| 亚洲国产精品专区久久| 日韩经典中文字幕在线观看| 国产精品一区二区3区| 亚洲久久久久久久久久| 精品久久久久久中文字幕一区奶水| 久久综合久中文字幕青草| 在线国产精品播放| 国产欧美一区二区三区四区| 91久久精品一区| 亚洲第一页在线| 岛国视频午夜一区免费在线观看| 在线观看免费高清视频97| 欧美激情精品久久久久久黑人| 国产精品永久免费| 九九综合九九综合| 国外视频精品毛片| 日韩av免费在线| 亚洲天堂精品在线| 91超碰caoporn97人人| 宅男66日本亚洲欧美视频| 亚洲成人黄色在线观看| 久久伊人精品天天| 日韩av在线不卡| 麻豆一区二区在线观看| 国产精品视频色| 青青草一区二区| 欧美劲爆第一页| 久久琪琪电影院| 中文字幕日韩av综合精品| 国产精品久久国产精品99gif| 中文字幕日韩欧美| www.日韩.com| 成人写真福利网| 精品久久久久久亚洲精品| 亚洲人高潮女人毛茸茸| 国产日韩在线免费| 亚洲性日韩精品一区二区| 国产亚洲日本欧美韩国| 欧美日韩一区二区在线播放| 国产69精品99久久久久久宅男| 国产99久久精品一区二区永久免费| 久久久噜噜噜久噜久久| 91久久在线播放| 欧美视频在线观看免费网址| 精品国产精品自拍| 日韩免费在线电影| 亚洲人a成www在线影院| 欧洲亚洲妇女av| 中文字幕日韩欧美在线视频| 亚洲国产精品va在线看黑人动漫| 国产精品美女www爽爽爽视频| 日韩中文字幕国产| 欧美性生交xxxxx久久久| 久久天堂av综合合色| 国产精品成久久久久三级|