SQL 是一種結構化資料庫查詢語言,此一語言提供使用者建立、維護及查詢一個關聯式資料庫管理系統的命令。因為 SQL 語言具有易學習及閱讀的親合性,所以 SQL 已經被各種資料庫廠商採用,而成為一種共通的標準查詢語言。只要你學會 SQL ,即可操作各種資料庫如 Dbase 、FoxPro 及 Paradox 等。SQL 語言是由命令( Commands )、子句( Clauses )、運算子( Operators )及加總函數( Aggregate Functions )組成,分述如下:
1. 命令( Commands )1. 命令( Commands )SQL 的命令分成資料定義語言( Data Definition Language )與資料操作語言( Data Manipulation Language ),資料定義語言可用來建立新的資料庫、資料表、欄位及索引等,本書不予介紹;另一為資料操作語言,可用來建立查詢表、排序、過濾資料、萃取及修改、新增及刪除資料等動作。 SQL 的組成元素說明如下:
(2) 資料操作語言( DML )資料操作語言的命令如下表:
命 令 說 明
SELECT 找出合於條件的記錄
INSERT 增加一筆記錄
UPDATE 更正合於條件的記錄
DELETE 刪除合於條件的記錄
2. 子句( Clause )2. 子句( Clause )子句是用於設定欲操作的對象, SQL 所用的子句如下表:
子 句 說 明
FROM 指定資料表
WHERE 設定條件
GROUP BY 設定分群
ORDER BY 設定輸出的順序
3. 運算子( Operators )3. 運算子( Operators )運算子又分邏輯運算子( Logical Operators )與比較運算子( Comparison Operator ),邏輯運算子如下表:
運算子 說 明
AND 邏輯 AND
OR 邏輯 OR
NOT 邏輯 NOT
4. 加總函數( Aggregate Functions )4. 加總函數( Aggregate Functions )
加總函數如下表:
以下將分四節分別介紹資料操作語言( DML )的SELECT 、 INSERT 、 UPDATE 及 DELETE 。
加總函數 說 明
AVG 求指定條件的平均
COUNT 求指定條件的數量
SUM 求指定條件的和
MAX 求指定條件的最大值
MIN 求指定條件的最小值
18-1 SELECT18-1 SELECTSELECT 是 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 項目使用FROM 項目使用 1. 最簡單的查詢指令就是只含有 SELECT 和 FROM兩個關鍵字。例如,以下敘述:
SELECT * FROM friend可以列出資料表 friend 中所有欄位資料,其中星號( * )代表所有欄位。下圖是執行後的結果。
2. 如果所選的欄位不只一個,中間以(,)分開。例如,以下敘述:
SELECT name, height FROM friend可以列出資料表 friend 中 name , height兩個欄位資料,下圖是執行後的結果。
3. 如果要剔除相同的記錄項,則於欄位前加上 DISTINCT 。例如,以下敘述:
SELECT DISTINCT educate FROM frend
其結果如下圖所示。 4. 如果資料欄位來自不同的資料表,則於欄位前加上資料表名稱,中間以逗點(,)或驚嘆號(!)隔開。例如,以下敘述:
SELECT stuname.name, stuname.id, stugrd.engFROM stuname, stugrd WHERE stuname.id=stugrd.id
則是資料表關聯的範例,其結果如下圖所示。
補充說明補充說明為什麼要關聯?1. 可聯結不同單位的資料:同一個人的資料可能分佈在不同的單位,如果需要在同一地點查看不同單位的資料,就須使用“關聯”。例如,前例 stuname 及 stugrd 可以使用相同的欄位“學號”( id )給予關聯合併。2. 可以節省記憶空間:於資料表 strgrd 中,同一個人成績可能會出現許多次,如果不使用關聯則每次輸入成績時,也要輸入基本資料,如此將造成資料的重覆鍵入,浪費儲存空間,如使用關聯則可以避免這種現象。
3.確保資料的一致性:同一欄位的資料,若同時出現在不同的資料表,將會造成資料維護的困難,例如,學生姓名欄若同時存放在不同的資料表中,而此位學生改名時,則必須至所有的資料表更正,萬一有某一個資料表忘了修正,則會破壞資料的一致性。
查詢條件 WHERE查詢條件 WHEREWHERE 是用來指定查詢條件。例如,以下敘述:
SELECT * FROM friend WHERE educate > 4
可用來查詢資料表 friend 中, educate > 4 (教育程度大於 4 )的所有欄位資料。下圖是執行後的結果。WHERE 中各欄位條件可以分別使用邏輯運算。關係運算、數值運算、集合運算及通配運算等。分別舉例說明如下:
1. 邏輯運算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 。下圖是執行後的結果。
以上關係運算子的使用,請看以下範例說明。例如,以下敘述:
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 friWHERE birth BETWEEN #1/1/1964 # AND #12/31/1967#'
可用來查詢 fri 資料表中,生日介於 1964~ 1967年次的所有欄位資料。下圖是執行後的結果。
例如,以下敘述:SELECT * FROM friend WHERE height-weight-110 > 0
可用來查詢 friend 資料表中體重超過標準體重的所有欄位資料。下圖是執行後的結果。
4. 集合運算。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. 通配運算。5. 通配運算。通配運算是利用 LIKE保留字配合通配字元 % 、 _ 、〔〕及 ^ 所組成,其中( % )號代表字元長度和字元不拘;底線符號( _ )號則代表長度為 1 的任意字元;中刮號 [ ]代表指定範圍或集合的單一字元; ^ 可用於表示不在字串中的字元,
以上萬用字元簡易運算式範例如下表:運算式 傳回值說明
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 運算子。
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 資料表中,姓“許”的名單。
運算式 傳回值說明
LIKE '〔 N-Y〕%' 'N' 到 'Y' 開頭的字串
LIKE '〔 ^N〕%' 不是 'N' 開頭的字串
GROUP BY 項目的使用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 項目的使用利用 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 (別名)的使用ALIAS (別名)的使用使用別名,表示在 SQL 敘述中重新命名資料表的名稱,但是真實的資料表名稱在資料庫中不會被改變。別名是用來使 SQL 敘述變得比較短及容易閱讀。例如,若有 SQL 敘述如下:
select * From Customer, order, orpr, productwhere customer.id=orde.idAnd orde.orid=orpr.oridAnd orpr.prid=product.idOrder By customer.id, orde.orid
若使用別名,則分別替 customer 、 order 、 orpr及 product 取別名 a 、 b 、 c 及 d ,則 SQL 敘述可簡化如下:
Select * From customer a, orde b, orpr c, product d
Where a.id=b.cuidAnd b.orid=c.oridAnd c.prid=d.idOrder By a.id, b.orid
兩者皆可從 4 個資料表中擷取資料,但使用了別別( a , b , c , d )之後,可大幅縮短 SQL 敘述的程式碼。下圖是執行後的結果。
< 範例 >18-1a< 範例 >18-1a本節程式集錦。
物件說明 1.MainMenu1 :用於製作主功能表。 2.DataGrid1 :用於展示 SQL 敘述的執行結果。 3.RichTextBox1 :用於顯示欲執行 SQL 敘述。程式說明 1.SQL保留字於程式設計中,大小寫不拘。 2.雙引號內的空白均不可省略,如上面的 " ORDER BY
…" 的空白均不可省略。
Top Related