資料庫SQL

Download Report

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 條件式