Transcript 資料庫SQL
資料庫SQL
簡單報表
Mastar/Detail 列印
分群列印
習題
SQL 是一種結構化資料庫查詢語言, 此
一語言提供使用者建立、維護及查詢一
個關聯式資料庫管理系統的命令。因為
SQL 語言具有易學習及閱讀的親合性,
所以SQL 已經被各種資料庫廠商採用,
而成為一種共通的標準查詢語言。只要
你學會SQL, 即可操作各種資料庫如
Dbase 、FoxPro 及Paradox 等。
SQL 語言是由命令(Commands) 、子句
(Clauses) 、運算子(Operators) 及加總
函數(Aggregate Functions) 組成, 分述
如下:
1. 命令(Commands)
SQL 的命令分成資料定義語言(Data
Definition Language) 與資料操作語言
(Data Manipulation Language), 資料定義
語言可用來建立新的資料庫、資料表、
欄位及索引等, 本書不予介紹; 另一為資
料操作語言, 可用來建立查詢表、排序、
過濾資料、萃取及修改、新增及刪除資
料等動作。
SQL 的組成元素說明如下:
(1) 資料定義語言(DDL)
資料定義語言如下表:
(2) 資料操作語言(DML)
資料操作語言的命令如下表:
2. 子句(Clause)
子句是用於設定欲操作的對象, SQL 所用的子句
如下表:
3. 運算子(Operators)
運算子又分邏輯運算子(Logical
Operators) 與比較運算子
(ComparisonOperator), 邏輯運算子如下
表:
比較運算子如下表:
4. 加總函數(Aggregate Functions)
加總函數如下表:
對於初學者而言, 資料定義使用Database
Desktop 即可勝任愉快, 以下將分四節分
別介紹資料操作語言(DML) 的SELECT 、
INSERT 、UPDATE及DELETE 。
19 -1 SELECT
SELECT 是SQL 敘述使用最頻繁的命令, 其意為
選擇的意思, 可從一到數個資料表中選擇合乎條件
的欄位與記錄, 其傳回結果稱為資料集
(Recordset) 或結果集(Dataset), SELECT 語法如下:
SELECT [ALL | DISTINCT] <fieldlist>
FROM <tablelist> IN databasename <alias>
[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 。例如, 以下敘述:
SELECT DISTINCT educate FROM frend
其結果如下圖所示。
4. 如果資料欄位來自不同的資料表, 則於欄位前
加上資料表名稱, 中間以逗點(, ) 或驚嘆號(!)
隔開。例如, 以下敘述:
SELECT stuname.name, stuname.id, stugrd.eng
FROM
stuname, stugrd WHERE stuname.id=stugrd.id
則是資料表關聯的範例, 其結果如下圖所示。
學生基本資料表stuname 如下圖, 學生成績
資料表stugrd 如下下圖:
補充說明
為什麼要關聯?
1. 可聯結不同單位的資料:
同一個人的資料可能分佈在不同的單位,
如果需要在同一地點查看不同單位的資
料, 就須使用" 關聯" 。例如, 前例
stuname 及stugrd 可以使用相同的欄位"
學號" (id) 給予關聯合併。
2. 可以節省記憶空間:
於資料表strgrd 中, 同一個人成績可能會出現
許多次, 如果不使用關聯則每次輸入成績時,
也要輸入基本資料, 如此將造成資料的重覆鍵
入, 浪費儲存空間, 如使用關聯則可以避免這
種現象。
3. 確保資料的一致性:
同一欄位的資料, 若同時出現在不同的資料表,
將會造成資料維護的困難。例如, 學生姓名欄
若同時存放在不同的資料表中, 而此位學生更
改姓名時, 則必須至所有的資料表更正, 萬一
有某一個資料表忘了修正, 則會破壞資料的一
致性。
4. 正確的關聯亦是資料庫正規化的步驟。
查詢條件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 。下圖是執行後的結果。
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 年次的所有欄位資料,又例如
“BETWEEN ‘B’ AND ‘D’”可用來查詢B 和D
之間的字母, (字串內如須再用字串符號必須用
單引號(‘)代替)。下圖是執行後的結果。
3. 數值運算
WHERE 條件內可用的數值運算子如下
表:
例如, 以下敘述:
SELECT * FROM friend WHERE heightweight-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 運算子。
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, 如
果希望排列方式為降冪DESCending, 則應在欄位後面
加上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 敘述可簡化如下:
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 敘述的程式碼。下圖是執
行後的結果。
範例19-1a
本節程式集錦。
19 -2 INSERT
INSERT 可用來增加一筆記錄, 其語法如下,
範例請看17-4e 。
INSERT INTO 資料表(欄位)
VALUES (欄位值)
19 -3 UPDAT E
UPDATE 可用來更正合於條件的記錄,
其語法如下, 範例請看17-4e 。
UPDATE 資料表
SET 欄位= 新值
WHERE 條件式
19 -4
DELETE
DELETE 可用來刪除資料表內合於條件
的記錄, 其語法如下, 範例請看17-4e 。
DELETE
FROM 資料表
WHERE 條件式