HTML網頁基礎語言 - 藍色部落itgroup.blueshop.com.tw

Download Report

Transcript HTML網頁基礎語言 - 藍色部落itgroup.blueshop.com.tw

第14章 SQL語言處理資料庫





14-1
14-2
14-3
14-4
14-5
指令
SQL語言的基礎
SQL語言的資料庫查詢
SQL子查詢、合併查詢與聚合函數
SQL語言的資料庫操作
使用Prepared Statement執行SQL
14-1 SQL語言的基礎-說明


「SQL」(Structured Query Language)為
「ANSI」(American National Standards
Institute)標準的資料庫語言,SQL指令可以查
詢資料表的記錄資料或插入、刪除和更新資料表
的記錄,目前MySQL、Access、SQL Server、
Informix、Oracle和Sybase等主要關聯式資料
庫管理系統都支援ANSI的SQL語言。
早在1970年,E. F. Codd建立關聯性資料庫的觀
念,同時就提出一種構想的資料庫語言,它是一
種完整且通用的資料存取方式,雖然當時並沒有
真正建立語法,但這便是SQL的源起。
14-1 SQL語言的基礎-種類



資料定義語言(Data Definition Language,
DDL):建立資料表、索引和視界(Views)等,
並且定義資料表的欄位。
資料操作語言(Data Manipulation
Language,DML):屬於資料表記錄查詢、
插入、刪除和更新指令。
資料控制語言(Data Control Language,
DCL):屬於資料庫安全設定和權限管理的相關
指令。
14-1 SQL語言的基礎-基本指令

在PHP程式是呼叫mysqli_query()函數來
執行SQL操作和查詢指令,在本章主要說
明四個SQL的基本指令,如下表所示:
指令
INSERT
UPDATE
DELETE
SELECT
說明
在資料表插入一筆新記錄
更新資料表已經存在的記錄資料
刪除資料表的記錄
查詢資料表的記錄,使用條件來查詢符合的記錄資料
14-1 SQL語言的基礎-PHP的
SQL查詢工具

PHP程式Ch14-1.php可以輸入SQL指令測
試查詢結果,我們只需在表單欄位輸入
SQL指令,就可以進行資料表的查詢,如
下圖所示:
14-2 SQL語言的資料庫查詢







14-2-1
14-2-2
14-2-3
14-2-4
14-2-5
14-2-6
14-2-7
SELECT敘述設定查詢範圍
WHERE條件子句
AND與OR多條件查詢
Order By排序子句
BETWEEN/AND資料範圍子句
IN和NOT運算子
LIMIT限制記錄數子句
14-2 SQL語言的資料庫查詢
SQL資料查詢指令只有一個SELECT指令,其完
整的指令語法如下所示:
SELECT column1, column2 FROM table
WHERE conditions
 SELECT指令的column1~2是記錄的欄位,
table為資料表,conditions是查詢條件,使用口
語來說是:「從資料表table取回符合WHERE條
件所有記錄的欄位column1和column2」。
 在conditions條件還可以包含一些運算子或子句,
例如:BETWEEN AND、ORDER BY等來指定
範圍或進行排序。

14-2-1 SELECT敘述設定查詢範
圍-顯示資料表的部分欄位
在SELECT敘述查詢資料表時,可以只顯示部分
欄位。SQL指令如下所示:
SELECT stdno, name, address FROM
students
 SELECT敘述顯示資料表students的欄位stdno
、name和address,各欄位使用逗號分隔。

14-2-1 SELECT敘述設定查詢範
圍-顯示資料表的所有欄位

在SELECT敘述並不需要一一列出所有欄位
的名稱,只需使用「*」符號代表記錄的所
有欄位名稱即可。SQL指令如下所示:
SELECT * FROM students

上述SQL指令取回資料表所有記錄和所有
欄位,即上一節測試SQL查詢工具的執行
結果。
14-2-1 SELECT敘述設定查詢範
圍-欄位值不重複
資料表記錄的欄位值如果有重複值,可以在
SELECT敘述加上DISTINCT指令,如果欄位擁
有相同值的記錄,就只會顯示其中一筆。SQL指
令如下所示:
SELECT DISTINCT totalcredit FROM students
 上述SQL指令字串的欄位totalcredit如果有重複
值,只會顯示其中一筆。

14-2-1 SELECT敘述設定查詢範
圍-欄位別名(指令)
SELECT敘述查詢資料表時顯示的欄位名稱是資
料表定義的名稱,我們可以使用AS關鍵字來設定
顯示的別名。SQL指令如下所示:
SELECT stdno AS No, name AS
StudentName, address AS Home FROM
students
 上述SELECT敘述顯示資料表students的欄位
stdno、name和address,各欄位的別名是No、
StudentName和Home,欄位使用逗號分隔。

14-2-1 SELECT敘述設定查詢範
圍-欄位別名(圖例)

表格的標題列顯示的是欄位別名,而不是
欄位名稱。
14-2-2 WHERE條件子句-說明

在SELECT敘述的WHERE子句才是SQL查
詢的主角,SELECT敘述指明取出哪個資料
表和取得哪些欄位,WHERE子句的條件才
是查詢哪些記錄的條件。
14-2-2 WHERE條件子句-運算子

WHERE條件的欄位值可能是文字、數值或
日期/時間,可以使用的運算子,如下表所
示:
運算子
=
<>
>
>=
<
<=
LIKE
說明
相等
不相等
大於
大於等於
小於
小於等於
包含子字串
14-2-2 WHERE條件子句-條件值
為字串

WHERE條件的欄位如果使用字串需要加上單引
號或雙引號(在PHP程式Ch14-1.php的表單請
使用單引號),條件是字串比較,可以使用的運
算子和範例,如下表所示:
運算子
=
>
>=
<
<=
<>
範例
SELECT * FROM students WHERE stdno='95002'
SELECT * FROM students WHERE stdno>'95002'
SELECT * FROM students WHERE stdno>='95002'
SELECT * FROM students WHERE stdno<'95002'
SELECT * FROM students WHERE stdno<='95002'
SELECT * FROM students WHERE stdno<>'95002'
14-2-2 WHERE條件子句-條件值
為字串(範例1)
例如:查詢學號為「95002」的記錄,SQL指令
如下所示:
SELECT * FROM students WHERE
stdno='95002'
 上述SQL指令的查詢結果可以找到1筆符合條件的
記錄,如下圖所示:

14-2-2 WHERE條件子句-條件值
為字串(範例2)
例如:查詢學號不等於「95002」的記錄,SQL
指令如下所示:
SELECT * FROM students WHERE
stdno<>'95002'
 上述SQL指令的查詢結果找到5筆符合條件的記錄,
如下圖所示:

14-2-2 WHERE條件子句-包含字
串(說明)

在WHERE子句的條件欄位可以使用
【LIKE】包含運算子,LIKE運算子只需子
字串就符合條件,可以配合萬用字元的範
本字串進行比對,如下表所示:
萬用字元
%
_
說明
代表任何子字串
代表一個字元
14-2-2 WHERE條件子句-包含字
串(範例1)
例如:查詢學生是住在各「縣」的學生資料。
SQL指令如下所示:
SELECT * FROM students WHERE address
LIKE '%縣%'
 上述SQL指令的條件只需欄位值擁有子字串「縣」
就符合條件,一共找到2筆記錄,如下圖所示:

14-2-2 WHERE條件子句-包含字
串(範例2)
例如;生日是116~196幾年的學生資料。SQL指
令如下所示:。
SELECT * FROM students WHERE birthday
LIKE '1_6_%'
 上述SQL指令birthday欄位的生日是116~196
幾年,一共找到2筆記錄,如下圖所示:

14-2-2 WHERE條件子句-條件值
為數值

WHERE條件如果是數值欄位,就不需單引
號括起,可以使用的運算子和範例,如下
表所示:
運算子
=
>
>=
<
<=
<>
範例
SELECT * FROM students WHERE totalcredit=15
SELECT * FROM students WHERE totalcredit>15
SELECT * FROM students WHERE totalcredit>=15
SELECT * FROM students WHERE totalcredit<15
SELECT * FROM students WHERE totalcredit<=15
SELECT * FROM students WHERE totalcredit<>15
14-2-2 WHERE條件子句-條件值
為數值(範例1)
例如:查詢總學分totalcredit為15的記錄,SQL
指令如下所示:
SELECT * FROM students WHERE
totalcredit=15
 上述SQL指令可以找到2筆符合條件的記錄,如下
圖所示:

14-2-2 WHERE條件子句-條件值
為數值(範例2)
例如:查詢總學分totalcredit欄位大於15的記錄,
SQL指令如下所示:
SELECT * FROM students WHERE
totalcredit>15
 上述SQL指令可以找到4筆符合條件的記錄,如下
圖所示:

14-2-2 WHERE條件子句-條件值
為日期/時間(說明)



目前各家資料庫管理系統都擁有支援的日期/時間
格式,筆者說明ANSI-SQL(MySQL支援)和
Access Jet-SQL的日期/時間格式。
Microsoft Jet-SQL只提供一種DATETIME資料
類型,能夠儲存ANSI-SQL的DATE、TIME和
TIMESTAMP三種資料類型。
標準ANSI-SQL提供三種日期/時間的資料類型,
如下表所示:
資料類型
DATE
TIME
TIMESTAMP
說明
日期格式,格式為 YYYY-MM-DD
時間格式,格式為 HH:MM:SS.nn
日期時間格式,格式為 YYYY-MM-DD HH:MM:SS.nn
14-2-2 WHERE條件子句-條件值
為日期/時間(運算子)

ANSI-SQL是使用單引號括起,Access的日期/
時間是使用「#」符號括起,如下表所示:
運算子
=
>
>=
<
<=
<>
範例
SELECT * FROM students WHERE birthday='1970-01-02'
SELECT * FROM students WHERE birthday=#1970-1-2#
SELECT * FROM students WHERE birthday>'1970-01-02'
SELECT * FROM students WHERE birthday>#1970-1-2#
SELECT * FROM students WHERE birthday>='1970-01-02'
SELECT * FROM students WHERE birthday>=#1970-1-2#
SELECT * FROM students WHERE birthday<'1970-01-02'
SELECT * FROM students WHERE birthday<#1970-1-2#
SELECT * FROM students WHERE birthday<='1970-01-02'
SELECT * FROM students WHERE birthday<=#1970-1-2#
SELECT * FROM students WHERE birthday<>'1970-01-02'
SELECT * FROM students WHERE birthday<>#1970-1-2#
14-2-2 WHERE條件子句-條件值
為日期/時間(範例1)
例如:查詢學生的生日birthday是1970-01-02
的記錄,SQL指令如下所示:
SELECT * FROM students WHERE
birthday='1970-01-02'
SELECT * FROM students WHERE
birthday=#1970-01-02#
 上述SQL指令(第2個是Access版本)可以找到1
筆符合條件的記錄,如下圖所示:

14-2-2 WHERE條件子句-條件值
為日期/時間(範例2)
例如:查詢學生的生日birthday欄位小於日期
1970-01-02的記錄,SQL指令如下所示:
SELECT * FROM students WHERE
birthday<'1970-01-02'
SELECT * FROM students WHERE
birthday<#1970-01-02#
 上述SQL指令(第2個是Access版本)可以找到2
筆符合條件的記錄,如下圖所示:

14-2-3 AND與OR多條件查詢AND且運算子
AND運算子連接的前後條件都必須同時成立,整
個條件才成立,例如:學生姓名包含「陳」且學
號小於等於「95003」。SQL指令如下所示:
SELECT * FROM students WHERE
stdno<='95003' AND name LIKE '%陳%'
 上述SQL指令可以找到1筆符合條件的記錄,如下
圖所示:

14-2-3 AND與OR多條件查詢OR或運算子
OR運算子連接的前後條件只需任何一個條件成立
即可,例如:學號小於「95003」或姓名包含
「張」子字串。SQL指令如下所示:
SELECT * FROM Students WHERE
stdno<'95003' OR name LIKE '%張%'
 上述SQL指令可以找到4筆符合條件的記錄,如下
圖所示:

14-2-3 AND與OR多條件查詢-複
雜的WHERE條件子句(範例)
SQL的WHERE條件可以複雜到連接3、4
個或以上的條件,在同一個WHERE條件使
用AND和OR來連結不同的條件。例如:學
號大於等於「95002」且小於等於
「95004」,或姓名含有「陳」子字串。
SQL指令如下所示:
SELECT * FROM students WHERE
stdno>='95002' AND
stdno<='95004' OR name LIKE '%陳
%'

14-2-3 AND與OR多條件查詢-複
雜的WHERE條件子句(圖例)

SQL指令可以找到4筆符合條件的記錄,如
下圖所示:
14-2-3 AND與OR多條件查詢-擁
有括號的WHERE條件子句
在WHERE條件的括號擁有較高的優先順序,使
用括號可以推翻優先順序產生不同的查詢結果。
例如:姓名含有「陳」子字串,或地址含有「台
北縣」子字串,這兩個條件擁有括號,而且學號
小於「95002」。SQL指令如下所示:
SELECT * FROM students WHERE (name
LIKE '%陳%' OR address LIKE '台北縣' )
AND stdno<'95002'
 上述SQL指令可以找到1筆符合條件的記錄,如下
圖所示:

14-2-4 ORDER BY排序子句-由
小到大排序
在SQL指令加上ORDER BY子句指定排序的欄位,
例如:查詢總學分大於15的記錄,而且使用總學
分欄位進行排序。SQL指令如下所示:
SELECT * FROM students WHERE
totalcredit>15 ORDER BY totalcredit ASC

14-2-4 ORDER BY排序子句-由
大到小排序
排序順序如果需要由大到小,只需在最後加上
DESC關鍵字,如下所示:
SELECT * FROM students WHERE
totalcredit>15 ORDER BY totalcredit DESC
 上述SQL指令可以找到4筆符合條件的記錄,使用
總學分totalcredit欄位由大到小進行排序,如下
圖所示:

14-2-5 BETWEEN/AND資料範
圍運算子-日期/時間
BETWEEN/AND運算子定義WHERE條件子句的
範圍,範圍值可以是文字、數值和日期/時間。
SQL指令如下所示:
SELECT * FROM Students WHERE Birthday
BETWEEN '1969-01-01' AND '1970-12-31'
SELECT * FROM Students WHERE Birthday
BETWEEN #1969-01-01# AND #1970-1231#
 上述SQL指令(第2個是Access版本)是日期/時
間範圍,查詢1969年1月1日到1970年12月31
日出生的學生。

14-2-5 BETWEEN/AND資料範
圍運算子-數值
BETWEEN/AND指定數值範圍值的SQL指令,如
下所示:
SELECT * FROM students WHERE totalcredit
BETWEEN 10 AND 18
 上述SQL指令是數值範圍,查詢總學分在10到18
之間的學生,包含10和18,一共找到3筆記錄,
如下圖所示:

14-2-6 IN和NOT運算子-IN運算
子1
IN運算子可以設定一系列文字或數值清單,欄位
值必須是其中之一才符合條件,例如:學號需要
是特定的幾個學號。SQL指令如下所示:
SELECT * FROM students WHERE stdno IN
('95001', '95003', '95004')
 上述SQL指令只有學號欄位stdno是95001、
95003和95004才符合條件,一共找到3筆記錄,
如下圖所示:

14-2-6 IN和NOT運算子-IN運算
子2
查詢總學分是9、15和18的記錄,SQL指令如下
所示:
SELECT * FROM students WHERE totalcredit
IN (9, 15, 18)
 上述SQL指令只有總學分欄位totalcredit為9、
15和18才符合條件,一共找到3筆記錄,如下圖
所示:

14-2-6 IN和NOT運算子-NOT運
算子(說明)

NOT運算子可以搭配前面子句,取得與條
件相反的查詢結果,如下表所示:
運算子
NOT LIKE
NOT BETWEEN
NOT IN
說明
否定 LIKE 運算式
否定 BETWEEN/AND 運算式
否定 IN 運算式
14-2-6 IN和NOT運算子-NOT運
算子(範例)
例如:學號除了幾個指定字串外的記錄。SQL指
令如下所示:
SELECT * FROM students WHERE stdno NOT
IN ('95001', '95003', '95004')
 上述SQL指令只有學號欄位stdno不是95001、
95003和95004才符合條件,一共找到3筆記錄,
如下圖所示:

14-2-7 LIMIT限制記錄數子句-範
例1
在SQL指令可以使用LIMIT子句限制查詢到
的記錄數,例如:只取出查詢結果的前3筆
記錄。SQL指令如下所示:
SELECT * FROM students LIMIT 3
 上述SQL指令只顯示前3筆記錄,如下圖所
示:

14-2-7 LIMIT限制記錄數子句-範
例2
LIMIT子句還可以指定開始的記錄編號,例如:
只取出查詢結果的前3筆記錄且查詢的第1筆記錄
是從第2筆開始。SQL指令如下所示:
SELECT * FROM students LIMIT 1, 3
 上述SQL指令只顯示「,」逗號前,從1即第2筆
(0是第1筆)開始的前3筆記錄,如下圖所示:

14-3 SQL子查詢、合併查詢與聚
合函數




14-3-1
14-3-2
14-3-3
14-3-4
SQL的聚合函數
SQL的子查詢
內部合併查詢INNER JOIN指令
外部合併查詢OUTER JOIN指令
14-3-1 SQL的聚合函數

SQL的聚合函數可以進行資料表欄位的筆
數、平均、最大、最小和加總的運算,提
供SQL查詢結果的進一步資訊,如下表所
示:
聚合函數
COUNT(Column)
AVG(Column)
MAX(Column)
MIN(Column)
SUM(Column)
說明
計算記錄筆數
計算欄位平均值
取得記錄欄位的最大值
取得記錄欄位的最小值
取得記錄欄位的總和
14-3-1 SQL的聚合函數-COUNT()
函數

COUNT()函數可以計算記錄的總筆數,
「*」參數統計所有記錄數,也可以指定統
計欄位,此時是指統計欄位不是NULL值的
記錄數,SQL指令範例如下表所示:
SQL 指令範例
SELECT COUNT(*) FROM students
SELECT COUNT(stdno) FROM students
SELECT COUNT(*) FROM students WHERE totalcredit>15
記錄數
6
6
4
14-3-1 SQL的聚合函數-AVG()函
數

AVG()函數可以計算欄位的平均值,SQL
指令範例如下表所示:
SQL 指令範例
SELECT AVG(totalcredit) FROM students
SELECT COUNT(*), AVG(totalcredit) FROM students
WHERE name LIKE '%會%'
平均值
18.0000
2, 20.5000
14-3-1 SQL的聚合函數-MAX()函
數

MAX()函數計算符合條件記錄中指定欄位
的最大值,SQL指令範例如下表所示:
SQL 指令範例
SELECT MAX(totalcredit) FROM students
SELECT MAX(totalcredit) FROM students WHERE
NOT(name LIKE '%陳%')
最大值
22
19
14-3-1 SQL的聚合函數-MIN()函
數

MIN()函數計算符合條件記錄中指定欄位的
最小值,SQL指令範例如下表所示:
SQL 指令範例
SELECT MIN(totalcredit) FROM students
SELECT MIN(totalcredit) FROM students WHERE name LIKE
'%會%'
最小值
15
19
14-3-1 SQL的聚合函數-SUM()函
數

SUM()函數計算符合條件記錄的欄位總和,
SQL指令範例如下表所示:
SQL 指令範例
SELECT SUM(totalcredit) FROM students
SELECT SUM(totalcredit) FROM students WHERE name NOT
LIKE '%陳%'
總和
108
86
14-3-2 SQL的子查詢-說明

在WHERE子句如果使用另一個SELECT指
令查詢其他資料表的記錄,稱為「子查詢」
(Subquery),其目的通常是為了取得所
需的條件值。
14-3-2 SQL的子查詢-範例
例如:在students資料表使用姓名name查詢學
號stdno,然後使用取得的學號stdno,在
classes資料表查詢此學生選課的總數,SQL指令
如下所示:
SELECT Count(*) FROM classes WHERE
stdno = (SELECT stdno FROM students
WHERE name='陳會安')
 上述SQL指令一共有2個SELECT指令,分別查詢
2個資料表,在students資料表取得姓名name
是【陳會安】的學號stdno後,再從classes資料
表使用聚合函數,計算出選課數為3筆記錄,如下
圖所示:

14-3-3 內部合併查詢INNER
JOIN指令-說明


SQL合併查詢指令是JOIN,可以將關聯式
資料庫分割的資料表合併成未分割前的結
果。SQL合併查詢分為:INNER JOIN和
OUTER JOIN指令。
INNER JOIN指令可以取回兩個資料表都
存在的記錄。
14-3-3 內部合併查詢INNER
JOIN指令-範例1
例如:查詢所有學生選課的課程編號資料,
SQL指令如下所示:
SELECT students.stdno,
students.name, classes.cno FROM
students INNER JOIN classes ON
students.stdno = classes.stdno
 上述SQL指令從students資料表取得學號
stdno和姓名name,classes資料表取得
課程編號cno,關聯欄位是ON指令的學號
stdno。

14-3-3 內部合併查詢INNER
JOIN指令-範例圖例1
14-3-3 內部合併查詢INNER
JOIN指令-範例2
例如:查詢所有學生選課的詳細課程資料,也就
是取得courses資料表的所有欄位,SQL指令如
下所示:
SELECT students.stdno, students.name,
courses.* FROM courses INNER JOIN
(students INNER JOIN classes ON
students.stdno = classes.stdno) ON
classes.cno = courses.cno
 上述SQL指令一共查詢三個資料表,只需將原來
FROM子句後的INNER JOIN使用括號括起當成
查詢結果的資料表,我們就可以進一步查詢
courses資料表的所有欄位,此時的關聯欄位是
課程編號cno。

14-3-3 內部合併查詢INNER
JOIN指令-範例圖例2
14-3-4 外部合併查詢OUTER
JOIN指令-LEFT JOIN
LEFT JOIN可以取回左邊資料表內的所有記錄。
例如:使用LEFT JOIN取得所有學生選課的課程
編號資料,左邊是students資料表,右邊是
classes資料表,SQL指令如下所示:
SELECT students.*, classes.cno FROM
students LEFT JOIN classes ON
students.stdno = classes.stdno
 上述SQL指令從students資料表取得學生資料,
classes資料表取得課程編號cno,關聯欄位是學
號stdno。

14-3-4 外部合併查詢OUTER
JOIN指令-LEFT JOIN(圖例)
14-3-4 外部合併查詢OUTER
JOIN指令-RIGHT JOIN
如果SQL指令需要取得右邊資料表的所有記錄資
料,就是使用RIGHT JOIN。例如:使用RIGHT
JOIN取得所有課程被哪些學生選課的資料,左邊
是classes資料表,右邊是courses資料表,SQL
指令如下所示:
SELECT classes.stdno, courses.* FROM
classes RIGHT JOIN courses ON
classes.cno = courses.cno
 上述SQL指令從classes資料表取得學號stdno,
courses資料表取得所有的課程資料,關聯欄位
是課程編號cno。

14-3-4 外部合併查詢OUTER
JOIN指令-RIGHT JOIN(圖例)
14-4 SQL語言的資料庫操作



14-4-1 新增資料表記錄
14-4-2 更新資料表記錄
14-4-3 刪除資料表記錄
14-4 SQL語言的資料庫操作
在資料表可以執行SQL操作指令來新增、刪除和
更新資料表的記錄資料,在PHP程式同樣是呼叫
mysqli_query()函數來執行SQL的操作指令:
INSERT、UPDATE和DELETE,如下所示:
if ( mysqli_query($link, $sql) )
echo "資料庫新增記錄成功, 影響記錄數: ".
mysqli_affected_rows($link) . "<br>";
}
 上述程式碼呼叫mysqli_query()函數執行參數
$sql的SQL指令,函數傳回true表示執行成功,
false表示失敗。

14-4-1 新增資料表記錄-語法

SQL新增記錄指令可以新增一筆記錄到資
料表,INSERT指令的基本語法,如下所示
:
INSERT INTO table (column1,column2,…..)
VALUES ('value1', 'value2 ', …)

上述SQL指令的table為準備插入記錄的資
料表名稱,column1~n是資料表內的欄位
名稱,不需全部欄位,value1~n是對應的
欄位值。
14-4-1 新增資料表記錄-注意事
項



不論是欄位或值的清單,都需要使用逗號
分隔。
在INSERT指令VALUES的值中,數值不用
單引號包圍,文字需要單引號包圍,日期/
時間如果是MySQL加上單引號,Access加
上「#」符號。
INSERT指令的欄位名稱清單,並不需要和
資料表定義的欄位數目或順序相同,只需
選擇需要的欄位,但是括號內的欄位名稱
順序需和VALUES值的順序相同。
14-4-1 新增資料表記錄-範例
例如:在資料表students插入一筆學生記
錄的SQL指令,如下所示:
INSERT INTO students (stdno, name,
address, birthday, totalcredit)
VALUES ('95007','小龍女','台北縣新店
巿','1970-04-11',16)
 在PHP程式只需從表單欄位取得資料建立
SQL指令字串,就可以呼叫
mysqli_query()函數執行SQL指令來新增
一筆記錄。

14-4-2 更新資料表記錄-語法
SQL更新記錄指令是將資料表內符合條件的記錄,
更新成新的欄位值,UPDATE指令的基本語法,
如下所示:
UPDATE table SET column1 = ‘value1’
WHERE conditions
 table是資料表,SET子句column1是資料表的
欄位名稱,不用全部只需指定需要更新的欄位,
value1是更新的欄位值,如果更新的欄位不只一
個,請使用逗號分隔,如下所示:
UPDATE table SET column1 = 'value1' ,
column2 = 'value2' WHERE conditions

14-4-2 更新資料表記錄-注意事
項


WHERE後的條件是必要元素,如果沒有此
條件,資料表內所有記錄欄位都會被更新。
更新欄位值如果為數值不用單引號包圍,
文字需要使用單引號包圍,日期/時間如果
是MySQL加上單引號,Access加上「#」
符號。
14-4-2 更新資料表記錄-範例
例如:在資料表students更改學生住址和
總學分的SQL指令,如下所示:
UPDATE students Set address='台北縣
三重巿',totalcredit=21 WHERE stdno
= '95007'
 上述SQL指令的WHERE條件是學號stdno
欄位,然後使用SET子句更新所需的欄位資
料。

14-4-3 刪除資料表記錄-語法

SQL刪除記錄指令是將資料表內符合條件
的記錄刪除掉,DELETE指令的基本語法,
如下所示:
DELETE FROM table WHERE conditions

上述指令table是資料表,WHERE子句
conditions為刪除記錄的條件,口語來說
是:「將符合conditions條件的記錄刪除
掉」。
14-4-3 刪除資料表記錄-注意事
項



WHERE後的條件是DELETE指令的必要元
素,如果沒有此條件,資料表內的所有記
錄都會被刪除掉。
WHERE條件可以使用=、<>、>、<=和
>=等運算子。
WHERE條件如果不只一個條件,請使用邏
輯運算子AND或OR運算子連結。
14-4-3 刪除資料表記錄-範例

例如:在資料表students刪除一位學生記
錄的SQL指令,如下所示:
DELETE FROM students WHERE stdno =
'95007'

上述SQL指令的WHERE條件為學號stdno
欄位,也就是將符合學號條件的學生記錄
刪除掉。
14-5 使用Prepared Statement執
行SQL指令-建立SQL指令
PHP的ext/myqli擴充程式支援Prepared
Statement,可以預先建立SQL指令字串,然後
使用參數來指定欄位值,如下所示:
$sql ="INSERT INTO students (stdno, name,
address, ";
$sql.="birthday, totalcredit) VALUES
(?,?,?,?,?)";
 上述插入記錄的SQL指令一共有5個「?」號,表
示這些欄位值是參數,尚未指定其值。

14-5 使用Prepared Statement執
行SQL指令-建立物件
接著呼叫mysqli_prepere()函數建立Prepared
Statement物件$stmt,如下所示:
$stmt = mysqli_prepare($link, $sql);
 函數建立$stmt物件後,就可以呼叫
bind_param()方法,將參數對應到指定的變數
值,如下所示:
$stmt->bind_param(
"ssssi",$stdno,$name,$address,
$birthday,$totalcredit);

14-5 使用Prepared Statement執
行SQL指令-指定變數名稱
當我們將SQL指令的「?」參數對應到指定變數名
稱後,就可以指定變數值,如下所示:
$stdno = $_POST["Stdno"];
$name = $_POST["Name"];
$address = $_POST["Address"];
$birthday = $_POST["Birthday"];
$totalcredit = $_POST["Totalcredit"];
 上述程式碼指定變數值,相當於是指定SQL指令
中的參數值。

14-5 使用Prepared Statement執
行SQL指令-執行SQL指令
現在我們已經建立完整的SQL指令,可以
呼叫$stmt物件的execute()方法來執行
SQL指令,如下所示:
$stmt->execute();
echo "資料庫新增記錄成功, 影響記錄數: ".
$stmt->affected_rows . "<br>";
 上述程式碼在執行SQL指令後,顯示影響
記錄數的affected_rows成員變數值。

14-5 使用Prepared Statement執
行SQL指令-關閉物件
最後需要呼叫close()方法關閉$stmt物件,
如下所示:
$stmt->close();
