You are on page 1of 14

附錄 D SQL 查詢

D-1 認識 SQL 查詢

SQL 是「Structured Query Language」的簡寫,諸如 MySQL、Access、Oracle Database、


SQL Server 等關聯式資料庫均採用這個標準語言來進行資料庫查詢。SQL 不僅可
以用來進行資料庫查詢,還可以用來新增、更新與刪除記錄。

在開始介紹 SQL 指令的語法之前,請您先依照第 12-3-8 節的方法匯入隨書光碟


database\students.sql,這個資料庫的名稱為 students,包含一個名稱為 grade 的資料
表,裡面總共有 10 筆記錄。

使用 phpMyAdmin 執行 SQL 指令的步驟如下:

1. 以瀏覽器開啟 http://localhost/phpMyAdmin,並登入系統,在左窗格點按要
查詢的資料庫,在此我們選擇 [students (1)],接著會顯示如下畫面,請點取
[查詢視窗] 鈕。

D-2
D SQL 查詢

2. 出現如下網頁,請在 [在資料庫 students 執行以下指令] 欄位輸入「SELECT


name, nature, math, chinese FROM grade」,然後按 [執行],本章所有 SQL 指
令均在如下網頁中執行。

1. 輸入 SQL 指令

2. 點按此鈕

這個 SQL 指令可以從 grade 資料表篩選出 name、nature、math 和 chinese 四個


欄位,雖然 grade 資料表的 chinese 欄位放在 nature 欄位前面,但在使用 SQL
指令時可以不必依照欄位的順序進行篩選,唯一要注意的是篩選出來的欄位
順序會依照 SQL 指令所指定的欄位順序,而不是資料來源的欄位順序。

3. 執行結果如下圖所示:
執行 SQL 指令花費的時間

這是執行的
SQL
指令
視篩選出來的記錄
您可以在此設定如何檢
SQL
指令篩選出來的結果

D-3
D-2 篩選記錄

當我們想從資料表篩選記錄時,可以使用 SQL 指令中的 SELECT 陳述式,其語法


如下:

SELECT 欄位名稱
FROM 資料表名稱
[WHERE 搜尋子句]
[ORDER BY 排序子句 {ASC|DESC}]

以前一節的 grade 資料表為例,我們可以舉出一些 SQL 指令:

 從 grade 資料表篩選出所有記錄的 name、nature 和 chinese 三個欄位:

SELECT name, nature, chinese FROM grade

 從 grade 資料表篩選出所有記錄的所有欄位:

SELECT * FROM grade

 從 grade 資料表篩選出所有記錄的 name 和 nature 兩個欄位,然後分別將這兩


個欄位更名為「姓名」與「自然」:

SELECT name AS 姓名, nature AS 自然 FROM grade

 從 grade 資料表篩選出所有記錄的 name 欄位,然後將 chinese、math、nature


三個欄位相加後的分數產生為新的 total 欄位:

SELECT name, chinese+math+nature AS total FROM grade

D-4
D SQL 查詢

從 grade 資料表篩選出所有記錄的 name、chinese、math、nature 四個欄位,接著


將 chinese、math、nature 三個欄位相加後的分數產生為新的 total 欄位,執行結果
如下:

【提示】

這個 SQL 指令的語法如下:

SELECT name, chinese, math, nature, chinese+math+nature AS total FROM grade

D-5
D-2-1 SELECT ... FROM ... WHERE ... 語法 (篩選)

SELECT ... FROM ... 語法會傳回資料表的所有記錄,但有時我們需要將篩選範圍


限制在符合某些條件的記錄,例如國語 (chinese) 成績在 90 分以上之所有記錄的
「姓名」(name) 和「數學」(math) 兩個欄位,此時,我們得加上 WHERE 子句來
設定篩選範圍,例如:

SELECT name, math FROM grade WHERE chinese > 90

WHERE 子句可以包含任何邏輯運算,只要傳回值為 TRUE 或 FALSE 即可,下表


為 SQL 語法所支援的比較運算子和邏輯運算子:

比較運算子 說明 邏輯運算子 說明
= 等於 如果運算元均為 TRUE,傳回 TRUE,
AND
< 小於 否則傳回 FALSE。

> 大於 如 果 任 一 運 算 元 為 TRUE , 傳 回
OR
<= 小於等於 TRUE,否則傳回 FALSE。

>= 大於等於
如果運算元為 TRUE,傳回 FALSE,
!= NOT
不等於 否則傳回 TRUE。
<>

 從 grade 資料表篩選出 chinese 分數大於 90 或 math 分數大於 90 之記錄的 name、


chinese 和 math 三個欄位:

SELECT name, chinese, math FROM grade WHERE chinese > 90 OR math > 90

 從 grade 資料表篩選出 chinese 分數小於 90 且 math 分數大於 90,或 chinese


分數小於 90 且 nature 分數大於 90 之記錄的所有欄位:

SELECT * FROM grade WHERE chinese < 90 AND (math > 90 OR nature > 90)

D-6
D SQL 查詢

除了前述的比較運算子和邏輯運算子之外,SQL 語法亦支援 LIKE 運算子,這個


運算子接受 % 萬用字元,% 表示任何長度的字串 (包括 0)。

 從 grade 資料表篩選出 name 是以「陳」開頭之記錄的所有欄位,請注意,字


串的前後要記得加上單引號 ('):

SELECT * FROM grade WHERE name LIKE '陳%'

 從 grade 資料表篩選出 name 是以「陳」開頭之記錄的 name 及 math 欄位,請


注意,字串的前後要記得加上單引號 ('):

SELECT name, math FROM grade WHERE name LIKE '陳%'

WHERE 條件子句亦接受如下句型:

 我們可以在 WHERE 條件子句中加入 IN 判斷欄位資料的範圍,以下面的 SQL


指令為例,它會篩選出 chinese 欄位為 80、85 或 88 之記錄的所有欄位:

SELECT * FROM grade WHERE chinese IN (80, 85, 88)

 如果資料的範圍為文字字串,那麼千萬別忘了在字串的前後加上單引號 ('),
例如:

SELECT * FROM grade WHERE name IN ('陳小新', '陳俊榮', '孫小美')

 我們可以在 WHERE 條件子句中加入 BETWEEN 限制篩選範圍,以下面的


SQL 指令為例,它會篩選出 math 欄位在 80 ~ 90 (包含 80 和 90) 之記錄的所
有欄位:

SELECT * FROM grade WHERE math BETWEEN 80 AND 90

D-7
D-2-2 SELECT ... FROM ... ORDER BY ... 語法 (排序)

有時我們會需要將篩選出來的記錄依照遞增或遞減順序來進行排序,舉例來說,
假設要依照國語成績由低到高的遞增順序來進行排序,那麼得加上 ORDER BY 排
序子句:

SELECT * FROM grade ORDER BY chinese ASC

由於 ORDER BY 排序子句預設的排序方式為遞增,因此,ASC 可以省略不寫,倘


若要改為由高到低的遞減順序,則要改寫為如下:

SELECT * FROM grade ORDER BY chinese DESC

事實上,我們也可以根據不只一個欄位來進行排序,舉例來說,假設要先依照
chinese 成績的高低進行遞減排序,再依照 math 成績的高低進行遞減排序,那麼
可以寫成如下:

SELECT * FROM grade ORDER BY chinese DESC, math DESC

從 grade 資料表篩選
出所有欄位,然後
將 chinese、math、
nature 三個欄位相
加後的分數產生為
新的 total 欄位,再
依照 total 欄位由高
到低進行排序。

D-8
D SQL 查詢

【提示】

這個 SQL 指令的寫法如下:

SELECT no, name, chinese, math, nature, chinese+math+nature AS total


FROM grade ORDER BY chinese+math+nature DESC

請注意,下面的寫法是錯誤的,因為 total 欄位實際上是不存在的:

SELECT no, name, chinese, math, nature, chinese+math+nature AS total


FROM grade ORDER BY total DESC

從 grade 資 料 表 篩 選 出
name、math、nature 三個
欄位,然後將 math、nature
兩個欄位相加後的分數
產生為新的 logic 欄位,再
將 logic 欄位在 165 分以上
者依照 math 分數由高到
低進行排序。

【提示】

這個 SQL 指令的寫法如下:

SELECT name, math, nature, math+nature AS logic


FROM grade WHERE math+nature > 165 ORDER BY math DESC

D-9
D-2-3 SELECT ... LIMIT 語法 (設定最多傳回筆數)

有時符合查詢條件的記錄可能有很多筆,但我們並不需要看到所有記錄,只是想
看看前幾筆記錄。舉例來說,假設我們希望 grade 資料表的記錄依照國語分數由
高到低進行排序,但只要看看前 5 筆記錄,那麼可以加上 LIMIT 語法來設定最多
傳回筆數:

SELECT * FROM grade ORDER BY chinese DESC LIMIT 5

LIMIT 語法還支援另一種寫法,例如:

SELECT * FROM grade ORDER BY chinese DESC LIMIT 3, 5

這表示依照 chinese 分數由高到低進行排序,傳回的記錄從第 4 筆開始,共傳回 5


筆,所以是得到第 4 ~ 8 筆記錄。

從 grade 資料表篩選出所有欄位,然後將 chinese、math、nature 三個欄位相加後的


分數產生為新的 total 欄位,再依照 total 欄位由高到低將前 3 名顯示在瀏覽器。

D-10
D SQL 查詢

D-3 新增、更新與刪除記錄

D-3-1 使用 INSERT 陳述式新增記錄

SQL 指令的 INSERT 陳述式可以在資料表內插入新的記錄,其語法如下:

INSERT INTO 資料表名稱 (欄位 1, 欄位 2, 欄位 3) Values (資料 1, 資料 2, 資料 3)

假設要在 grade 資料表內插入一筆新的記錄,其欄位資料分別為「A8608011」、


「陳小貞」、「88」、「95」、「92」,那麼可以寫成如下:

INSERT INTO grade (no, name, chinese, math, nature) VALUES ('A8608011', '陳小貞', 88, 95, 92)

D-3-2 使用 UPDATE 陳述式更新記錄

SQL 指令的 UPDATE 陳述式可以更新資料表內現有的記錄,其語法如下:

UPDATE 資料表名稱 SET 欄位 1=資料 1, 欄位 2=資料 2 WHERE 條件

假設要將 grade 資料表內 no 欄位為「A8608011」之記錄的 name 欄位更新為「張


小毛」、nature 欄位更新為「100」,那麼可以寫成如下:

UPDATE grade SET name='張小毛', nature=100 WHERE no='A8608011'

D-3-3 使用 DELETE 陳述式刪除記錄

SQL 指令的 DELETE 陳述式可以刪除資料表內現有的記錄,其語法如下:

DELETE FROM 資料表名稱 WHERE 條件

假設要刪除 grade 資料表內 nature 分數低於 85 且 math 分數低於 85 的記錄,那麼


可以寫成如下:

DELETE FROM grade WHERE nature < 85 AND math < 85

D-11
D-4 建立與刪除資料庫 / 資料表

D-4-1 建立資料庫

SQL 指令的 CREATE DATABASE 陳述式可以建立資料庫,語法如下,DEFAULT


CHARACTER SET utf8 COLLATE utf8_general_ci 是要讓資料庫支援多國語言:

CREATE DATABASE 資料庫名稱 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci

假設要建立名稱為 web_database 的資料庫,可以寫成如下:

CREATE DATABASE web_database DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci

D-4-2 刪除資料庫

SQL 指令的 DROP DATABASE 陳述式可以刪除資料庫,語法如下:

DROP DATABASE 資料庫名稱

假設要刪除名稱為 web_database 的資料庫,可以寫成如下:

DROP DATABASE web_database

D-4-3 建立資料表

SQL 指令的 CREATE TABLE 陳述式可以建立新的資料表,語法如下:

CREATE TABLE 資料表名稱 (欄位名稱 1 資料型態 [欄位選項][, 欄位名稱 2 資料型態


[欄位選項] …… [, 欄位名稱 n 資料型態 [欄位選項]]][, PRIMARY KEY (欄位名稱)])

假設要建立一個名稱為 email 的資料表,裡面只有一個名稱為 address 的欄位,資


料型態為 TEXT,欄位選項為 NOT NULL,可以寫成如下:

CREATE TABLE email (address TEXT NOT NULL)

D-12
D SQL 查詢

換看另一個比較複雜的例子,假設要建立一個名稱為 guestbook 的資料表,其欄位


結構如下:

欄位名稱 資料型態 欄位選項


id INT UNSIGNED、NOT NULL、AUTO_INCREMENT、
PRIMARY KEY。
name VARCHAR(8) NOT NULL
content MEDIUMTEXT NOT NULL
date DATETIME NOT NULL

可以寫成如下:

CREATE TABLE guestbook (id INT UNSIGNED NOT NULL AUTO_INCREMENT,


name VARCHAR(8) NOT NULL,
content MEDIUMTEXT NOT NULL,
date DATETIME NOT NULL, PRIMARY KEY (id ))

D-4-4 刪除資料表

SQL 指令的 DROP TABLE 陳述式可以刪除資料表,語法如下:

DROP TABLE 資料表名稱

假設要刪除名稱為 guestbook 的資料表,可以寫成如下:

DROP TABLE guestbook

D-13
D-14

You might also like