第十七章 資料庫SQL 17-1 SELECT 17-2 INSERT 17-3 UPDATE 17-4 DELETE
SQL是一種結構化資料庫查詢語言,此一語言提供使用者建立、維護及查詢一個關聯式資料 庫管理系統的指令。因為SQL語言具有易學習及閱讀的親和性,所以SQL逐漸被各種資料庫廠商採用,而成為一種共通的標準查詢語言。只要你學會SQL,即可操作各種資料庫如Dbase、FoxPro或Paradox等等,此乃資料庫的大和解時代。 SQL語言是由命令(Commands)、子句(Clauses)、運算子(Operators)及加總函數(Aggregate Functions)組成,分述如下:
1. 命令(Commands) SQL的命令分成資料定義語言(Data Definition Language,DDL)與資料操作語言(Data Manipulation Language,DML),資料定義語言可用來建立新的資料庫、資料表、欄位及索引等,本書不予介紹;另一為資料操作語言,可用來建立查詢表、排序、過濾、萃取、修改、新增及刪除資料等動作。 SQL的組成元素說明如下:
1 資料定義語言(DDL) 資料定義語言如下表: 2 資料操作語言(DML) 資料操作語言的命令如下表: 命 令 說明 CREATE 命 令 說明 CREATE 建立新的資料表、欄位及索引表 DROP 從資料庫刪除資料表或索引表 ALTER 增加或修正欄位屬性 命 令 說明 SELECT 找出合於條件的記錄 INSERT 增加一筆或合併兩個資料表 UPDATE 更正合於條件的記錄 DELETE 刪除合於條件的記錄
2. 子句(Clause) 子句是用於設定欲操作的對象, SQL所使用的子句如下表: 子 句 說明 FROM 指定資料表 WHERE 子 句 說明 FROM 指定資料表 WHERE 設定條件 GROUP BY 設定分群 ORDER BY 設定輸出的順序
3. 運算子(Operators) 運算子又分邏輯運算子(Logical Operators)和 比較運算子(Comparison Operator), 邏輯運算子如下表: 比較運算子如下表: 運算子 說明 < 小於 <= 小於等於 > 大於 >= 大於等於 = 等於 <> 不等於 BETWEEN 設定範圍 LIKE 通配設定 IN 集合設定 運算子 說明 AND 邏輯AND OR 邏輯OR NOT 邏輯NOT
4. 加總函數(Aggregate Functions) 加總函數如下表: 對於初學者而言,資料定義使用Database Desktop即可勝任愉快,以下將分四節分別介紹資料操作語言(DML)的SELECT、INSERT、UPDATE及DELETE。 加總函數 說明 AVG 求指定條件的平均 COUNT 求指定條件的數量 SUM 求指定條件的和 MAX 求指定條件的最大值 MIN 求指定條件的最小值
17-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(求計個數)等集合函數。
SELECT 〔ALL|DISTINCT〕〈fieldlist〉 FROM〈tablelist〉IN databasename 〔WHERE 〈condition〉〕 〔GROUP BY 〈fieldlist〉〕 〔ORDER BY〈fieldlist 〔ASC|DESC〕〉〕 2. 〔ALL|DISTINCT〕是可以省略的項目(語法凡加中括號者皆是可以省略的項目),系統預設值為ALL,若加上DISTINCT則系統會剔除重覆的資料項。 3. FROM〈tablelist〉是用於指定來源資料表,資料表如有一個以上,中間應用逗號(,)或驚嘆號(!)隔開。 4. IN databasename用來連結一個外部資料庫(附註:若要提高處理效率,最好使用附加資料表而不用IN子句)。 5. 〔WHERE〈condition〉〕是用來指定所要查詢的條件。各種條件可再配合各種邏輯運算、關係運算、算術運算、集合運算及通配運算元。 6. 〔GROUP BY〈fieldlist〉〕其中GROUP BY用來將相同的資料集合併。 7. 〔ORDER BY〈fieldlist〔ASC|DESC〕〉〕用來選擇某些欄位作為列印的先後順序,系統內定值為升冪(ASCending),如要指定降冪DESCending,只要將DESC緊跟在所需排序的欄位右方即可。
FROM項目使用 1. 最簡單的查詢指令就是只含有SELECT和FROM兩個關鍵字,可以列出資料表friend中所有欄位資料,其中星號(*)代表所有欄位。 2. 如果所選的欄位不只一個,中間以(,)分開。可以列出friend資料表中name及height兩個欄位資料。 3. 如果要剔除相同的記錄項,則於欄位前加上DISTINCT。 4. 如果資料欄位來自不同的資料表,則於欄位前加上資料表名稱,中間以逗點(,)或驚嘆號(!)隔開。
補充說明: 為什麼要關聯? 1.可聯結不同單位的資料。 補充說明: 為什麼要關聯? 1.可聯結不同單位的資料。 同一個人的資料可能分佈在不同的單位,如果需要在同一地點查看不同單位的資料,就須使用“關聯”,如前例stuname及stugrd可以使用相同的欄位“學號”(id)給予關聯合併。 2.可以節省記憶空間。 於資料表stugrd中,同一個人的成績可能會出現許多次,如果不使用關聯則每次輸入成績時,也必須輸入其基本資料,如此將造成資料重複的鍵入而浪費記憶體,如果使用關聯則可解決這種問題。 3.確保資料的一致性。 同一欄位的資料,若同時出現在不同的資料表,將會造成資料維護上的困難。例如有某筆資料要更正,則必須至不同的資料表更正,萬一有某一個資料表忘了修正,則會破壞資料的一致性。 4.正確的關聯亦是資料庫正規化的步驟。
查詢條件WHERE WHERE是用來指定查詢條件,例如: 用來查詢friend資料表中, educate>4(教育程度大於4)的所有欄位資料。 WHERE子句可用的運算方式如下: 1. 邏輯運算。 2. 關係運算。 3. 數值運算。 4. 集合運算。 5. 通配運算。 分別舉例說明如下:
WHERE子句可用的邏輯運算子有NOT、OR、AND及XOR,請看以下範例說明。 2. 關係運算 WHERE子句可用的關係運算子如下表所示: 1. 邏輯運算 WHERE子句可用的邏輯運算子有NOT、OR、AND及XOR,請看以下範例說明。 2. 關係運算 WHERE子句可用的關係運算子如下表所示: > 大於 < 小於 = 等於 >= 大於或等於 <= 小於或等於 <> 不等於 BETWEEN…AND… 指定的範圍
WHERE條件內可用的數值運算子如下表 : 3. 數值運算 WHERE條件內可用的數值運算子如下表 : 4. 集合運算 集合運算就是利用保留字IN所組成,其使用語法如下: WHERE(fieldname)〔NOT〕IN(〈valus list〉) 其中〈value list〉是指定的集合,集合中的元素如果超過1個,中間必須以逗號隔開。 符號 優先等級 +(正),-(負) 1 ^(次方) 2 *(乘),/(除) 3 +(加),-(減) 4
5. 通配運算 通配運算是利用LIKE保留字配合通配字元% 、- 、〔〕及^所組成,其中百分比符號(%)代表字元長度和字元不拘,底線符號(-)則代表長度為1的任意字元,中括號([])代表某一指定範圍或集合的單一字元,箭號(^)可用於表示不在字串中的字元,下表就是LIKE萬用字元的整理。 萬用字元 內容 % 代表零個至多個字元的字串 _ 代表單一字元 〔〕 代表指定範圍或集合的單一字元 〔^〕 代表不在指定範圍或集合的單一字元
以上萬用字元的簡要運算式範例如下表: 其使用語法如下,若需詳細說明請自行線上查閱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〉就是上表使用通配字元的運算式
GROUP BY項目的使用 SELECT指令中的GROUP BY項目可以用來將欄位中相同的值組合成群,其中SELECT除非使用函數,否則SELECT和GROUP BY所接欄位項目應相同。
ORDER BY項目的使用 利用ORDER BY這個項目,可以將輸出的結果依照某一個欄位進行排序,系統內定值為升冪ASCending,如果希望排列方式為降冪DESCending,則應在欄位後面加上DESC。
範例 17-1A 本節程式集錦。 物件說明: 1.為了方便讀者閱讀,本程式將SQL保留字以大寫表示,讀者於程式設計中,均可大小寫不拘。 1. MainMenu1:用於製作主功能表。 2. Query1:用於存取資料內容。 3. DataSource1:用於連結Query1與DBGrid1。 4. DBGrid1:用於展示SQL敘述的執行結果。 5. Memol:類別為TMemo,用於顯示欲執行SQL敘述。 程式說明: 1.為了方便讀者閱讀,本程式將SQL保留字以大寫表示,讀者於程式設計中,均可大小寫不拘。 2.字串內的空白均不可省略,如上面“ORDER BY…”的空白均不可省略。
17-2 INSERT INSERT可用來增加一筆記錄, 其語法如下,範例請看16-4e。 INSERT INTO 資料表(欄位) VALUE (欄位值)
範例 16-4e 如何新增、刪除及更正資料。 程式說明: 1. Insert、Delete及Update因為不傳回資料集,所以應使用ExecSQL,而非Select的Open。 2. Select可一次至多個資料表抓取所需的欄位,但Insert、Delete及Update僅能至一個資料表修正記錄。 3. Insert、Delete及Update不能使用集合性函式,如SUM及AVG等。 4. 若要一次更動多個資料表應使用UpdateSQL物件。
17-3 UPDATE UPDATE可用來更正合於條件的記錄, 其語法如下,範例請看16-4e。 UPDATE 資料表 SET 欄位=新值 WHERE 條件式
17-4 DELETE DELETE可用來刪除資料表內合於條件的記錄,其語法如下,範例請看16-4e。 DELETE FROM 資料表 WHERE 條件式
習題 1. 假設您要開一家婚友介紹中心,您應如何規劃資料庫,您的瀏覽查詢功能有哪些,您的報表功能有哪些? 1. 假設您要開一家婚友介紹中心,您應如何規劃資料庫,您的瀏覽查詢功能有哪些,您的報表功能有哪些? 2. 假設您要開一家大型房屋仲介公司,應如何規劃您的資料庫,瀏覽查詢功能有哪些,報表功能有哪些?