在本篇的開頭,我要感謝一些朋友來信給我指出了前幾篇文章中的錯誤。不知大家是否記得在第八篇中我舉了一個簡單的利用Application 製作的頁面訪問計數器?有位朋友來信問我,為何當他改變計數器起始變量NumVisits 的值後對最後的記數結果沒有任何作用?起初我也大惑不解,讓我們來回憶一下這段源程序,如下:
< %
Dim NumVisits
NumVisits=0
Application.Lock
Application(NumVisits) = Application(NumVisits) + 1
Application.Unlock
%>
歡迎光臨本網頁,你是本頁的第< %= Application(NumVisits) %> 位訪客!
在這段程序中,如果你試圖通過改變變量NumVisits 的值來改變記數器結果,是絕對辦不到的。因為用變量的值去改變Application 的值是不可以的,這兩者是不相關的。所以這裡對變量的定義和賦值都是多餘的。那麼我們究竟應該如何來給Application(NumVisits) 定義一個初始值呢?請看以下修正後程序:
< %
If Application(NumVisits)< 999 then
Application(NumVisits)=999
End If
Application.Lock
Application(NumVisits)=Application(NumVisits)+1
Application.Unlock
%>
歡迎光臨本網頁,你是本頁的第< %= Application(NumVisits) %> 位訪客!
這裡的999 就是你要設定的計數器初始值,如此一來問題就迎刃而解了。我非常感謝這位姓康的朋友給我指出了這個錯誤,雖然這只是一個很小的漏洞,但我們在共同學程序寫程序的過程中非常需要這種嚴謹細緻的作風,希望今後朋友們們一旦發現文中的錯誤即刻來信告知,我也能及時糾正,謝謝。
SQL 語言可以分為兩大部分:數據定義語言和數據操縱語言,繼上一篇我們學習了數據操縱語言中的Select 語句後,今天作者要繼續給大家簡要介紹其餘的SQL 語句。
SQL 是一種完備的數據處理語言,不僅用於數據庫查詢,而且用於數據庫中的數據修改和更新,與支持SQL 查詢的Select 語句的複雜性相比較,更改數據庫內容的SQL 語句就格外簡單。然而對於一個DBMS 來說,數據更新所造成的風險大大超出了數據查詢。數據庫管理系統必須在更改期內保護所存儲的數據的一致性,確保有效的數據進入數據庫,數據庫必須保持一致性, DBMS 還必須協調多用戶的並行更新,以確保用戶和他們的更改不至於影響其他用戶的作業。
用於修改數據庫內容的SQL 語句主要有以下三個:
1、 Insert,向一個表中加入新的數據行
2、 Delete,從一個表中刪除數據行
3、 Update,更改數據庫中已經存在的數據
首先我們來看看Insert 的用法:
標準語法:
INSERT INTO table_name
(col1, col2...)
VALUES(value1, value2...)
下例要將書生作為一個新的銷售員加入表Salesreps 中
Insert Into
Salesreps (name,num,sales,hire_date,income)
values ('shusheng',9,10000,'23-Feb-99',2000)
在此語句中,列的名稱列在括號中以逗號隔開,接下去是Value 短語和括號中同樣以逗號隔開的每列數據,應該注意的是數據和列名稱的順序是相同的,而且若是字符串型則以單引號隔開。從概念上來講, Insert 語句建立的一個與表列結構相一致的數據行,用取自Values 子句的數據來填充它,然後將該新行加入表中,表中的行是不排序的,因此不存在將該行插入到表的頭或尾或兩行之間的這個概念。 Insert 語句結束後,新行就是表的一部分了。
Insert 語句還可以將多行數據添加到目標表中去,在這種形式的Insert 語句中,新行的數據值不是在語句正文中明確地指定的,而是語句中指定的一個數據庫查詢。添加的值來自數據庫自身的行,這乍看起來似乎有些奇怪,但是在某些特定的狀態下,這是非常有用的。比如,你想把1998 年12 月30 日之前產生的訂單編號、日期和數目從order 表中拷貝到另一個名為oldorder 的表中去,多行Insert 語句為拷貝數據提供了一種緊湊而高效的方法,如下:
Insert into oldorder (Num,Date,Amount)
Select Num,Date,Amount
From order
Where Date<'30-12-98'
這條語句看起來有些複雜,其實很簡單,語句標識了接收新行的表oldorder 和接收數據的列,完全類似於單行Insert 語句。語句的剩餘部分是一個查詢,它檢索order 表中的數據。 SQL 先執行對order 表的查詢,然後將查詢結果逐行插入到oldorder 表中去。
下面我們來看看Update 的用法, Update 語句用於更新單表中選定行的一列或多列的值。要更新的目標表在語句中定義, Set 子句則指定要更新哪些列併計算他們的值。 Update 語句總是包含Where 語句,而且Update 語句比較危險,所以您必須明確地認識到Where 語句的重要性, Where 語句被用來指定需要更新的行。
標準語法:
UPDATE table_name
SET columnname1 = value1
[, columname2 = value2]...
WHERE search_condition
以下是一個簡單的Update 語句的例子:
Update customers
Set credit=100000.00,id=99
Where name='asp'
在此例中我們將表customers 中客戶名為asp 的客戶的信貸值更新為10 萬並將他的ID 變更為99。再看下例:
Update customers
Set credit=200000.00,state=021
Where ID in (80,90,100,120)
我們可以發現,其實SQL 處理Update 語句的過程就是逐行遍歷所指定的表,更新其搜索條件結果為真的行,跳過其搜索條件結果為假或空的行。
最後,來看看Delete 語句。
標準語法:
DELETE FROM tablename
WHERE condition
由於它過於簡單,所以所造成的後果也是嚴重的,雖然其中的Where 子句是任選的,但它幾乎總是存在的,若將Where 子句從Delete 語句中省略掉,則目標表的所有行都將被刪除。看下例:
Delete from order Where ID=99
在文章的末尾,作者在給大家簡要介紹一下數據定義語言。它是用來創建和修改數據庫結構的一種語句,包括Create 和Drop 語句。
1、 Create 語句
標準語法:
CREATE TABLE table_name
( field1 datatype [ NOT NULL ],
field2 datatype [ NOT NULL ],
field3 datatype [ NOT NULL ]...)
如:
CREATE TABLE BILLS
( NAME CHAR(30),
AMOUNT NUMBER,
ACCOUNT_ID NUMBER)
儘管Create Table 比前面介紹的語句難理解一些,但仍然很直觀。它將bills 賦予一個新表,並指定表中三列的名稱和數據類型。表被建立後我們就可以添入數據了。如:
Insert into bills(name,amout,account_id) values('gates',100,1)
如果,你覺得不再需要保存產品信息,則可用Drop table 語句將該表及其所包含的所有數據從數據庫中刪除掉。
標準語法:
DROP TABLE table_name
至此,我們已經了解了所有常用的SQL 語句,可別小看這些貌似英文的簡單語句,它們的功能十分強大,當我們編寫asp 程序時必須使用他們對數據庫進行操作。從下一篇開始,作者將給大家介紹ASP 的內建ActiveX 組件,敬請關注。