390 likes | 511 Views
第十八章 資料庫 SQL. SQL 是一種結構化資料庫查詢語言,此一語言提供使用者建立、維護及查詢一個關聯式資料庫管理系統的命令。因為 SQL 語言具有易學習及閱讀的親合性,所以 SQL 已經被各種資料庫廠商採用,而成為一種共通的標準查詢語言。只要你學會 SQL ,即可操作各種資料庫如 Dbase 、 FoxPro 及 Paradox 等。 SQL 語言是由命令( Commands )、子句( Clauses )、運算子( Operators )及加總函數( Aggregate Functions )組成,分述如下:. 1. 命令( Commands ).
E N D
SQL是一種結構化資料庫查詢語言,此一語言提供使用者建立、維護及查詢一個關聯式資料庫管理系統的命令。因為SQL語言具有易學習及閱讀的親合性,所以SQL已經被各種資料庫廠商採用,而成為一種共通的標準查詢語言。只要你學會SQL,即可操作各種資料庫如Dbase、FoxPro及Paradox等。 SQL是一種結構化資料庫查詢語言,此一語言提供使用者建立、維護及查詢一個關聯式資料庫管理系統的命令。因為SQL語言具有易學習及閱讀的親合性,所以SQL已經被各種資料庫廠商採用,而成為一種共通的標準查詢語言。只要你學會SQL,即可操作各種資料庫如Dbase、FoxPro及Paradox等。 SQL語言是由命令(Commands)、子句(Clauses)、運算子(Operators)及加總函數(Aggregate Functions)組成,分述如下:
1.命令(Commands) SQL的命令分成資料定義語言(Data Definition Language)與資料操作語言(Data Manipulation Language),資料定義語言可用來建立新的資料庫、資料表、欄位及索引等,本書不予介紹;另一為資料操作語言,可用來建立查詢表、排序、過濾資料、萃取及修改、新增及刪除資料等動作。SQL的組成元素說明如下:
命 令 說 明 CREATE 建立新的資料表、欄位及索引表 DROP 從資料庫刪除資料表或索引表 ALTER 增加或修改欄位屬性 (1) 資料定義語言(DDL) 資料定義語言如下表:
命 令 說 明 SELECT 找出合於條件的記錄 INSERT 增加一筆記錄 UPDATE 更正合於條件的記錄 DELETE 刪除合於條件的記錄 (2) 資料操作語言(DML) 資料操作語言的命令如下表:
子 句 說 明 FROM 指定資料表 WHERE 設定條件 GROUP BY 設定分群 ORDER BY 設定輸出的順序 2.子句(Clause) 子句是用於設定欲操作的對象,SQL所用的子句如下表:
運算子 說 明 AND 邏輯AND OR 邏輯OR NOT 邏輯NOT 3.運算子(Operators) 運算子又分邏輯運算子(Logical Operators)與比較運算子(Comparison Operator),邏輯運算子如下表:
運算子 說 明 < 小於 <= 大於等於 > 大於 >= 大於等於 = 等於 <> 不等於 BETWEEN 設定範圍 LIKE 通配設定 IN 集合設定 比較運算子如下表:
加總函數 說 明 AVG 求指定條件的平均 COUNT 求指定條件的數量 SUM 求指定條件的和 MAX 求指定條件的最大值 MIN 求指定條件的最小值 4.加總函數(Aggregate Functions) 加總函數如下表: 以下將分四節分別介紹資料操作語言(DML)的SELECT、INSERT、UPDATE及DELETE。
18-1 SELECT SELECT是SQL敘述使用最頻繁的命令,其意為選擇的意思,可從一到數個資料表中選擇合乎條件的欄位與記錄,其傳回結果稱為資料集(Recordset)或結果集(Dataset),SELECT語法如下: SELECT 〔ALL|DISTINCT〕〈fieldlist〉 FROM〈tablelist〉IN databasename 〔WHERE 〈condition〉〕 〔GROUP BY 〈fieldlist〉〕 〔ORDER BY〈fieldlist 〔ASC|DESC〕〉〕
語法說明 • 1.SELECT〈fieldlist〉 fieldlist是用來放置所選用的欄位串列。欄位串列如來自不同的資料表則欄位之前要加資料表名稱,中間以逗號(,)隔開。欄位中間如有空白,則整個欄位應使用中括號括起。如果要選擇資料表的全部欄位,則可用星號(*)表示。此外,欄位串列可配合SUM(求和)、AVG(求平均)、MAX(求極大值)、MIN(求極小值)、COUNT(求計個數)等集合函數。
2.〔All | DISTINCT〕 〔ALL|DISTINCT〕是可以省略的項目(語法凡加中括號者皆是可以省略的項目),系統預設值為ALL,若加上DISTINCT則系統會剔除重覆的資料項。 • 3.FROM〈tablelist〉 用於指定來源資料表,資料表如有一個以上,中間應用逗號(,)或驚嘆號(!)隔開。 • 4.IN databasename • 用來連結一個外部資料庫(若要提高處理效率,最好使用附加資料表而不用IN子句)。 • 5.<alias>別名 資料表名稱有時很冗長,當我們在使用SQL敘述時,可以替這些資料表名稱取一個別名。如此做法,可以簡化SQL敘述。
6.〔WHERE〈condition〉〕 用來指定所要查詢的條件。各種條件可配合各種邏輯運算、關係運算、算術運算、集合運算及通配運算元。 • 7.〔GROUP BY〈fieldlist〉〕 其中GROUP BY用來將相同的資料集合併。 • 8. 〔ORDER BY〈fieldlist〔ASC|DESC〕〉〕 用來選擇某些欄位作為列印的先後順序,系統內定值為升冪(ASCending),如要指定降冪DESCending,只要將DESC緊跟在所需排序的欄位右方即可。
FROM項目使用 • 1.最簡單的查詢指令就是只含有SELECT和FROM兩個關鍵字。例如,以下敘述: SELECT * FROM friend 可以列出資料表friend中所有欄位資料,其中星號(*)代表所有欄位。下圖是執行後的結果。 • 2.如果所選的欄位不只一個,中間以(,)分開。例如,以下敘述: SELECT name, height FROM friend 可以列出資料表friend中name,height兩個欄位資料,下圖是執行後的結果。
3.如果要剔除相同的記錄項,則於欄位前加上DISTINCT。例如,以下敘述:3.如果要剔除相同的記錄項,則於欄位前加上DISTINCT。例如,以下敘述: SELECT DISTINCT educate FROM frend 其結果如下圖所示。 • 4.如果資料欄位來自不同的資料表,則於欄位前加上資料表名稱,中間以逗點(,)或驚嘆號(!)隔開。例如,以下敘述: SELECT stuname.name, stuname.id, stugrd.eng FROM stuname, stugrd WHERE stuname.id=stugrd.id 則是資料表關聯的範例,其結果如下圖所示。
補充說明 為什麼要關聯? 1.可聯結不同單位的資料: 同一個人的資料可能分佈在不同的單位,如果需要在同一地點查看不同單位的資料,就須使用“關聯”。例如,前例stuname及stugrd可以使用相同的欄位“學號”(id)給予關聯合併。 2.可以節省記憶空間: 於資料表strgrd中,同一個人成績可能會出現許多次,如果不使用關聯則每次輸入成績時,也要輸入基本資料,如此將造成資料的重覆鍵入,浪費儲存空間,如使用關聯則可以避免這種現象。
3.確保資料的一致性: 同一欄位的資料,若同時出現在不同的資料表,將會造成資料維護的困難,例如,學生姓名欄若同時存放在不同的資料表中,而此位學生改名時,則必須至所有的資料表更正,萬一有某一個資料表忘了修正,則會破壞資料的一致性。
查詢條件WHERE WHERE是用來指定查詢條件。例如,以下敘述: SELECT * FROM friend WHERE educate > 4 可用來查詢資料表friend中,educate>4(教育程度大於4)的所有欄位資料。下圖是執行後的結果。 WHERE中各欄位條件可以分別使用邏輯運算。關係運算、數值運算、集合運算及通配運算等。分別舉例說明如下:
1.邏輯運算 WHERE子句可用的邏輯運算子有NOT、OR、AND及XOR。例如,以下敘述: SELECT * FROM friend WHERE educate > 4 AND height > 167 可用來查詢friend資料表中,educate>4且height>167的所有欄位資枓。下圖是執行後的結果。 又例如,以下敘述: SELECT * FROM friend WHERE NOT educate < 3 OR weight > 60 可用來查詢教育程度(educate)不小於3或體重(weight)大於60的所有欄位資料,注意NOT的優先權大於OR。下圖是執行後的結果。
> 大於 < 小於 = 等於 >= 大於或等於 <= 小於或等於 <> 不等於 BETWEEN…AND… 指定的範圍 2.關係運算 WHERE子句可用關係運算子如下表所示:
以上關係運算子的使用,請看以下範例說明。例如,以下敘述:以上關係運算子的使用,請看以下範例說明。例如,以下敘述: SELECT * FROM friend WHERE height >= 168 可用來查詢friend資料表中身高大於等於168者的所有欄位資料。下圖是執行後的結果。 又例如,以下敘述: SELECT * FROM friend WHERE educate BETWEEN 4 AND 5 可用來查詢friend資料表中教育程度介於4和5之間,(含4和5,且4和5位置不可掉換)。下圖是執行後的結果。 又例如,以下敘述: SELECT * FROM fri WHERE birth BETWEEN #1/1/1964 # AND #12/31/1967#' 可用來查詢fri資料表中,生日介於1964~1967年次的所有欄位資料。下圖是執行後的結果。
符號 優先等級 +(正),-(負) 1 ^(次方) 2 *(乘),/(除) 3 +(加),-(減) 4 3.數值運算 WHERE條件內可用的數值運算子如下表:
例如,以下敘述: SELECT * FROM friend WHERE height-weight-110 > 0 可用來查詢friend資料表中體重超過標準體重的所有欄位資料。下圖是執行後的結果。
4.集合運算。 集合運算就是利用保留字IN所組成,其使用語法如下: WHERE〈fieldname〉〔NOT〕IN(〈valus list〉) 其中〈value list〉是指定的集合,集合中的元素如果超過1個,中間必須以逗號隔開。例如,以下敘述: SELECT * FROM friend WHERE educate IN (2,3,5) 可用來查詢friend資料表中教育程度是2,3,5的所有欄位資料,下圖是執行後的結果。 又例如,“WHERE〔address city〕NOT IN '台北','高雄','台中'”可用來查詢地址不在台北,高雄,台中者的資料。(欄位內如有空白必須用中括號括起)。
5.通配運算。 通配運算是利用LIKE保留字配合通配字元%、_、〔〕及^所組成,其中(%)號代表字元長度和字元不拘;底線符號(_)號則代表長度為1的任意字元;中刮號[ ]代表指定範圍或集合的單一字元;^可用於表示不在字串中的字元,
萬用字元 內 容 % 代表零個至多個字元的字串 _ 代表單一字元 〔〕 代表指定範圍或集合的單一字元 〔^〕 代表不在指定範圍或集合的單一字元 下表就是LIKE萬用字元的整理內容:
運算式 傳回值說明 LIKE 'D%' 'D'開頭的字串 LIKE '%D' 'D'結尾的字串 LIKE '%D%' 包含'D'的字串 LIKE '_D' 'D'結尾且只含二個字元的字串 LIKE 'D_' 'D'開頭且只含二個字元的字串 LIKE '_D_' 'D'為中間第二個字元的三個字元字串 LIKE '〔NY〕%' 'N'開頭或'Y'開頭的字串 LIKE '%〔NY〕' 'N'結尾或'Y'結尾的字串 LIKE '%〔NY〕%' 包含'N'或'Y'的字串 以上萬用字元簡易運算式範例如下表:
運算式 傳回值說明 LIKE '〔N-Y〕%' 'N'到'Y'開頭的字串 LIKE '〔^N〕%' 不是'N'開頭的字串 其使用語法如下,若需詳細說明請自行線上查閱Like運算子。 WHERE〈fieldname〉〔NOT〕LIKE〈search string〉 其中LIKE〈search string〉就是上表使用通配字元的運算式,例如,以下敘述: SELECT * FROM friend WHERE tel LIKE '07%' 可用來查詢friend資料表中,電話號碼(tel)為07開頭者。下圖是執行後的結果。 又例如,以下敘述: SELECT * FROM friend WHERE name LIKE '許%' 可用來查詢friend資料表中,姓“許”的名單。
GROUP BY項目的使用 SELECT指令中的GROUP BY項目可以用來將欄位中相同的值組合成群,其中SELECT除非用了函數,否則SELECT和GROUP BY所接欄位項目應相同。例如,以下敘述: SELECT educate, name FROM friend GROUP BY educate,name 可將列出的順序,依照教育程度成群排列。下圖是執行後的結果。
又例如,以下敘述: SELECT educate, AVG(height) as 身高平均 FROM friend GROUP BY educate 可用來列出friend資料表中各組教育程度的平均身高。下圖是執行後的結果。 再例如,以下敘述: SELECT educate, COUNT(*) 人數 FROM friend GROUP BY educate 可用來列出friend資料表中各組教育程度的人數。下圖是執行後的結果。
ORDER BY項目的使用 利用ORDER BY這個項目,可以將輸出的結果依照某一個欄位進行排序,系統內定值為升冪ASCending,如果希望排列方式為降冪Des cending,則應在欄位後面加上DESC。 以下敘述: SELECT * FROM friend ORDER BY educate 可用來列出friend資料表中各欄位的資料,輸出方式按照教育程度由小而大排列。下圖是執行後的結果。
又例如,以下敘述: SELECT educate, name, height FROM friend ORDER BY educate, height DESC 可用來輸出friend資料表中教育程度、姓名、身高等三個欄位,輸出按照教育程度由小而大排列,教育程度相同時,再依身高由大而小排列。下圖是執行後的結果。
ALIAS(別名)的使用 使用別名,表示在SQL敘述中重新命名資料表的名稱,但是真實的資料表名稱在資料庫中不會被改變。別名是用來使SQL敘述變得比較短及容易閱讀。例如,若有SQL敘述如下: select * From Customer, order, orpr, product where customer.id=orde.id And orde.orid=orpr.orid And orpr.prid=product.id Order By customer.id, orde.orid
若使用別名,則分別替customer、order、orpr及product取別名a、b、c及d,則SQL敘述可簡化如下:若使用別名,則分別替customer、order、orpr及product取別名a、b、c及d,則SQL敘述可簡化如下: Select * From customer a, orde b, orpr c, product d Where a.id=b.cuid And b.orid=c.orid And c.prid=d.id Order By a.id, b.orid 兩者皆可從4個資料表中擷取資料,但使用了別別(a,b,c,d)之後,可大幅縮短SQL敘述的程式碼。下圖是執行後的結果。
<範例>18-1a 本節程式集錦。 物件說明 • 1.MainMenu1:用於製作主功能表。 • 2.DataGrid1:用於展示SQL敘述的執行結果。 • 3.RichTextBox1:用於顯示欲執行SQL敘述。 程式說明 • 1.SQL保留字於程式設計中,大小寫不拘。 • 2.雙引號內的空白均不可省略,如上面的" ORDER BY…"的空白均不可省略。
18-2 INSERT INSERT可用來增加一筆記錄,其語法如下,範例請看18-4a。 INSERT INTO 資料表(欄位) VALUES (欄位值)
18-3 UPDATE UPDATE可用來更正合於條件的記錄,其語法如下,範例請看18-4a。 UPDATE 資料表 SET 欄位=新值 WHERE 條件式
18-4 DELETE DELETE可用來刪除資料表內合於條件的記錄,其語法如下,範例請看18-4a。 DELETE FROM 資料表 WHERE 條件式
<範例>18-4a 請讀者自行開啟範例e18-4a,執行程式並流覽其結果。