SQL數據操作基礎(中級)8
2024-07-21 02:11:06
供稿:網友
更新記錄
要修改表中已經存在的一條或多條記錄,應使用sql update語句。同delete語句一樣,update語句可以使用where子句來選擇更新特定的記錄。請看這個例子:
update mytable set first_column=’updated!’ where second_column=’update me!’
這個update 語句更新所有second_column字段的值為’update me!’的記錄。對所有被選中的記錄,字段first_column的值被置為’updated!’。
下面是update語句的完整句法:
update {table_name|view_name} set [{table_name|view_name}]
{column_list|variable_list|variable_and_column_list}
[,{column_list2|variable_list2|variable_and_column_list2}…
[,{column_listn|variable_listn|variable_and_column_listn}]]
[where clause]
注意:
你可以對文本型字段使用update語句。但是,如果你需要更新很長的字符串,應使用updatetext語句。這部分內容對本書來說太高級了,因此不加討論。要了解更多的信息,請參考microsoft sql sever 的文檔。
如果你不提供where子句,表中的所有記錄都將被更新。有時這是有用的。例如,如果你想把表titles中的所有書的價格加倍,你可以使用如下的update 語句:
你也可以同時更新多個字段。例如,下面的update語句同時更新first_column,second_column,和third_column這三個字段:
update mytable set first_column=’updated!’
second_column=’updated!’
third_column=’updated!’
where first_column=’update me1’
技巧:
sql忽略語句中多余的空格。你可以把sql語句寫成任何你最容易讀的格式。
用select 創建記錄和表
你也許已經注意到,insert 語句與delete語句和update語句有一點不同,它一次只操作一個記錄。然而,有一個方法可以使insert 語句一次添加多個記錄。要作到這一點,你需要把insert 語句與select 語句結合起來,象這樣:
insert mytable (first_column,second_column)
select another_first,another_second
from anothertable
where another_first=’copy me!’
這個語句從anothertable拷貝記錄到mytable.只有表anothertable中字段another_first的值為’copy me!’的記錄才被拷貝。
當為一個表中的記錄建立備份時,這種形式的insert 語句是非常有用的。在刪除一個表中的記錄之前,你可以先用這種方法把它們拷貝到另一個表中。
如果你需要拷貝整個表,你可以使用select into 語句。例如,下面的語句創建了一個名為newtable的新表,該表包含表mytable的所有數據:
select * into newtable from mytable
你也可以指定只有特定的字段被用來創建這個新表。要做到這一點,只需在字段列表中指定你想要拷貝的字段。另外,你可以使用where 子句來限制拷貝到新表中的記錄。下面的例子只拷貝字段second_columnd的值等于’copy me!’的記錄的first_column字段。
select first_column into newtable
from mytable
where second_column=’copy me!’
使用sql修改已經建立的表是很困難的。例如,如果你向一個表中添加了一個字段,沒有容易的辦法來去除它。另外,如果你不小心把一個字段的數據類型給錯了,你將沒有辦法改變它。但是,使用本節中講述的sql語句,你可以繞過這兩個問題。
例如,假設你想從一個表中刪除一個字段。使用select into 語句,你可以創建該表的一個拷貝,但不包含要刪除的字段。這使你既刪除了該字段,又保留了不想刪除的數據。
如果你想改變一個字段的數據類型,你可以創建一個包含正確數據類型字段的新表。創建好該表后,你就可以結合使用update語句和select 語句,把原來表中的所有數據拷貝到新表中。通過這種方法,你既可以修改表的結構,又能保存原有的數據。
集合函數
到現在為止,你只學習了如何根據特定的條件從表中取出一條或多條記錄。但是,假如你想對一個表中的記錄進行數據統計。例如,如果你想統計存儲在表中的一次民意測驗的投票結果。或者你想知道一個訪問者在你的站點上平均花費了多少時間。要對表中的任何類型的數據進行統計,都需要使用集合函數。
microsoft sql 支持五種類型的集合函數。你可以統計記錄數目,平均值,最小值,最大值,或者求和。當你使用一個集合函數時,它只返回一個數,該數值代表這幾個統計值之一。
注意:
要在你的asp網頁中使用集合函數的返回值,你需要給該值起一個名字。要作到這一點,你可以在select語句中,在集合函數后面緊跟一個字段名,如下例所示:
select avg(vote) ‘the_average’ from opinion
在這個例子中,vote的平均值被命名為 the_average。現在你可以在你的asp網頁的數據庫方法中使用這個名字。
統計字段值的數目
函數count()也許是最有用的集合函數。你可以用這個函數來統計一個表中有多少條記錄。這里有一個例子:
select count(au_lname) from authors
這個例子計算表authors中名字(last name)的數目。如果相同的名字出現了不止一次,該名字將會被計算多次。如果你想知道名字為某個特定值的作者有多少個,你可以使用where子句,如下例所示:
select count(au_lname) from authors where au_lname=’ringer’
這個例子返回名字為’ringer’的作者的數目。如果這個名字在表authors中出現了兩次,則次函數的返回值是2。
假如你想知道有不同名字的作者的數目。你可以通過使用關鍵字distinct來得到該數目。如下例所示:
select count(distinct au_lname) from authors
如果名字’ringer’出現了不止一次,它將只被計算一次。關鍵字distinct 決定了只有互不相同的值才被計算。
通常,當你使用count()時,字段中的空值將被忽略。一般來說,這正是你所希望的。但是,如果你僅僅想知道表中記錄的數目,那么你需要計算表中所有的記錄─不管它是否包含空值。下面是一個如何做到這一點的例子:
select count(*) from authors
注意函數count()沒有指定任何字段。這個語句計算表中所有記錄所數目,包括有空值的記錄。因此,你不需要指定要被計算的特定字段。
函數count()在很多不同情況下是有用的。例如,假設有一個表保存了對你站點的質量進行民意調查的結果。這個表有一個名為vote的字段,該字段的值要么是0,要么是1。0表示反對票,1表示贊成票。要確定贊成票的數量,你可以所有下面的select 語句:
select count(vote) from opinion_table where vote=1
計算字段的平均值
使用函數count(),你可以統計一個字段中有多少個值。但有時你需要計算這些值的平均值。使用函數avg(),你可以返回一個字段中所有值的平均值。
假如你對你的站點進行一次較為復雜的民意調查。訪問者可以在1到10之間投票,表示他們喜歡你站點的程度。你把投票結果保存在名為vote的int型字段中。要計算你的用戶投票的平均值,你需要使用函數avg():
select avg(vote) from opinion
這個select語句的返回值代表用戶對你站點的平均喜歡程度。函數avg()只能對數值型字段使用。這個函數在計算平均值時也忽略空值。
計算字段值的和
假設你的站點被用來出售卡片,已經運行了兩個月,是該計算賺了多少錢的時候了。假設有一個名為orders的表用來記錄所有訪問者的定購信息。要計算所有定購量的總和,你可以使用函數sum():
select sum(purchase_amount) from orders
函數sum()的返回值代表字段purchase_amount中所有值的平均值。字段purchase_amount的數據類型也許是money型,但你也可以對其它數值型字段使用函數sum()。
返回最大值或最小值
再一次假設你有一個表用來保存對你的站點進行民意調查的結果。訪問者可以選擇從1到10 的值來表示他們對你站點的評價。如果你想知道訪問者對你站點的最高評價,你可以使用如下的語句:
select max(vote) from opinion
你也許希望有人對你的站點給予了很高的評價。通過函數max(),你可以知道一個數值型字段的所有值中的最大值。如果有人對你的站點投了數字10,函數max()將返回該值。
另一方面,假如你想知道訪問者對你站點的的最低評價,你可以使用函數min(),如下例所示:
select min(vote) from opinion
函數min()返回一個字段的所有值中的最小值。如果字段是空的,函數min()返回空值。
其它常用的sql表達式,函數,和過程
這一節將介紹一些其它的sql技術。你將學習如何從表中取出數據,其某個字段的值處在一定的范圍,你還將學習如何把字段值從一種類型轉換成另一種類型,如何操作字符串和日期時間數據。最后,你將學會一個發送郵件的簡單方法。
通過匹配一定范圍的值來取出數據
假設你有一個表用來保存對你的站點進行民意調查的結果。現在你想向所有對你的站點的評價在7到10之間的訪問者發送書面的感謝信。要得到這些人的名字,你可以使用如下的select 語句:
select username from opinion where vote>6 and vote<11
這個select 語句會實現你的要求。你使用下面的select 語句也可以得到同樣的結果:
select username from opinion where vote between 7 and 10
這個select 語句與上一個語句是等價的。使用哪一種語句是編程風格的問題,但你會發現使用表達式between 的語句更易讀。
現在假設你只想取出對你的站點投了1或者10的訪問者的名字。要從表opinion中取出這些名字,你可以使用如下的select 語句:
select username from opinion where vote=1 or vote
這個select語句會返回正確的結果,沒有理由不使用它。但是,存在一種等價的方式。使用如下的select可以得到相同的結果:
select username from opinion where vote in (1,10)
注意表達式in 的使用。這個select 語句只取出vote的值等于括號中的值之一的記錄。
你也可以使用in來匹配字符數據。例如,假設你只想取出bill gates或president clinton的投票值。你可以使用如下的select 語句:
select vote from opinion where username in (‘bill gates’,’president clinton’)
最后,你可以在使用between或in的同時使用表達式not。例如,要取出那些投票值不在7到10之間的人的名字,你可以使用如下的select 語句:
select username from opinion where vote not between 7 and 10
要選取那些某個字段的值不在一列值之中的記錄,你可以同時使用not 和in,如下例所示:
select vote from opinion
where username not in (‘bill gates’,’president clinton’)
你不是必須在sql語句中使用between或in,但是,要使你的查詢更接近自然語言,這兩個表達式是有幫助的。