第十八章 資料庫 sql

39
第第第第 第第第 SQL

Upload: von

Post on 14-Jan-2016

58 views

Category:

Documents


0 download

DESCRIPTION

第十八章 資料庫 SQL. SQL 是一種結構化資料庫查詢語言,此一語言提供使用者建立、維護及查詢一個關聯式資料庫管理系統的命令。因為 SQL 語言具有易學習及閱讀的親合性,所以 SQL 已經被各種資料庫廠商採用,而成為一種共通的標準查詢語言。只要你學會 SQL ,即可操作各種資料庫如 Dbase 、 FoxPro 及 Paradox 等。 SQL 語言是由命令( Commands )、子句( Clauses )、運算子( Operators )及加總函數( Aggregate Functions )組成,分述如下:. 1. 命令( Commands ). - PowerPoint PPT Presentation

TRANSCRIPT

第十八章 資料庫 SQL第十八章

資料庫 SQL

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 的組成元素說明如下:

(1) 資料定義語言( DDL )資料定義語言如下表:

命 令 說 明

CREATE 建立新的資料表、欄位及索引表

DROP 從資料庫刪除資料表或索引表

ALTER 增加或修改欄位屬性

(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

比較運算子如下表:運算子 說 明

< 小於

< = 大於等於

> 大於

> = 大於等於

= 等於

<> 不等於

BETWEEN 設定範圍

LIKE 通配設定

IN 集合設定

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 。下圖是執行後的結果。

2. 關係運算2. 關係運算WHERE 子句可用關係運算子如下表所示:

> 大於

< 小於

= 等於

> = 大於或等於

< = 小於或等於

<> 不等於

BETWEEN…AND… 指定的範圍

以上關係運算子的使用,請看以下範例說明。例如,以下敘述:

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年次的所有欄位資料。下圖是執行後的結果。

3. 數值運算3. 數值運算  WHERE 條件內可用的數值運算子如下表:

符號 優先等級

+ (正), - (負) 1

^ (次方) 2

* (乘),/(除) 3

+ (加), - (減) 4

例如,以下敘述: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萬用字元的整理內容:

萬用字元 內 容

% 代表零個至多個字元的字串

_ 代表單一字元

〔〕 代表指定範圍或集合的單一字元

〔 ^ 〕 代表不在指定範圍或集合的單一字元

以上萬用字元簡易運算式範例如下表:運算式 傳回值說明

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

…" 的空白均不可省略。

18-2 INSERT 18-2 INSERT INSERT 可用來增加一筆記錄,其語法如下,範例請看 18-4a 。

INSERT INTO 資料表(欄位)VALUES (欄位值)

18-3 UPDATE 18-3 UPDATE UPDATE 可用來更正合於條件的記錄,其語法如下,範例請看 18-4a 。

UPDATE 資料表SET 欄位 = 新值WHERE 條件式

18-4 DELETE 18-4 DELETE DELETE 可用來刪除資料表內合於條件的記錄,其語法如下,範例請看 18-4a 。

DELETEFROM 資料表WHERE 條件式

< 範例 >18-4a< 範例 >18-4a請讀者自行開啟範例 e18-4a ,執行程式並流覽其結果。