第 10 章 SQL 定義 操作與控制指令 *10 1 SQL 語言的基礎 *10 2 SQL 查詢工具 10 3 資料庫的實體資料模型 10 4 資料定義語言 10 5 資料操作語言 10 6 資料控制語言 *10 7 產生 SQL Server 指令碼精靈 1
10 11 SQL 語言的基礎 10 1 1 SQL 結構化查詢語言 10 1 2 1 關聯式資料庫管理系統的查詢最佳化 2
10 1 11 1 SQL 結構化查詢語言 說明 SQL (Structured d Query Language) ) 的全名是結構化查詢語言, 筆者簡稱為 SQL 語言, SQL 語言是 ANSI (American National Standards Institute) 制定的標準資料庫語言, 其版本分為 : 1989 年的 ANSI SQL 89 1992 年制定的 ANSI SQL 92, 也稱為 SQL 2, 這是目前關聯式資料庫的標準語言 最新版 ANSI SQL 99 稱為 SQL 3, 適用在物件關聯或導向式資料庫的 SQL 語言 3
10 1 11 1 SQL 結構化查詢語言 種類 SQL 語言依指令功能, 可以分成三類, 如下所示 : 1. 資料定義語言 DDL(Data Definition Language): 建立資料表 視界和索引等的 SQL 指令 2. 資料操作語言 DML(Data Manipulation Language): ) 資料表記錄插入 刪除 更新和查詢指令 3. 資料控制語言 DCL(Data ( Control Language): ) 資料庫安全管理的權限設定指令 4
10 1 2 關聯式資料庫管理系統的查詢最佳化 執行順序圖例 SQL 指令需要轉換成低階機器語言指令來執行查詢, 其轉換的步驟即查詢處理模組 (Query Processor) 子系統的執行順序, 如下圖所示 : 5
10 1 2 關聯式資料庫管理系統的查詢最佳化 SQL 查詢的步驟 第一步 : 在查詢剖析器檢查 SQL 語言的語法是否正確, 且驗證屬性和關聯表名稱是否存在 第二步 : 在查詢最佳化模組將它轉換成中間格式關聯式代數建立的 查詢樹 (Query Tree), 然後執行最佳化處理產生 執行計劃 (Execution Plan) ) 第三步 : 使用 RDBMS 提供的選擇 合併 投影等關聯代數運算子的演算法, 從執行計劃產生所需的程式碼 第四步 : 使用直譯或編譯方式將程式碼轉換成機器語言後, 就可以執行 SQL 指令產生查詢結果 6
10 1 2 關聯式資料庫管理系統的查 詢最佳化 查詢樹 (Query Tree) 查詢樹 (Query Tree) 是一棵關聯式代數運算式的樹狀結構, 查詢樹的節點規則, 如下所示 : 關聯表是樹的葉節點 (Leaf Nodes) 關聯式代數運算子是中間節點 (Internal Nodes) ) 7
10 1 2 關聯式資料庫管理系統的查 詢最佳化 查詢樹圖例 SELECT Students.name, Classes.room FROM Students, Classes WHERE Students.sid sid = Classes.sidsid and Students.GPA >= 3.0 and Classes.c_no = CS222 8
10 1 2 關聯式資料庫管理系統的查 詢最佳化 查詢最佳化模組 查詢最佳化模組 (Query Optimizer) 的功能是在最佳化查詢樹, 讓查詢樹執行的更有效率 最佳化的作法有很多種, 最簡單的方式是將查詢樹的節點轉換成更有效率且相等功能的節點, 這些最佳化規則稱為啟發式查詢最佳化 (Heuristic Query Optimization) 技術 9
10 1 2 關聯式資料庫管理系統的查 詢最佳化 查詢最佳化技術 1 啟發式查詢最佳化 (Heuristic Query Optimization): 這是規則基礎的最隹化, 使用關聯式代數已知的轉換規則產生最有效率的執行計劃, 例如 : 將卡笛生乘積運算和之後的選擇運算以合併運算來取代 造句法式查詢最佳化 (Syntactical Query Optimization): 以查詢樹自行造句找出所有同等功能的可能關聯式代數運算式, 其最佳化的依據主要在評估是否有索引可以改進執行效率, 以便找出最佳的執行計劃 10
10 1 2 關聯式資料庫管理系統的查 詢最佳化 查詢最佳化技術 2 成本基礎式查詢最佳化 (Cost Based B dquery Optimization): 使用 RDBMS 各種資訊評估使用那一種順序執行關聯式代數運算式擁有最低的成本, 以找出最有效率的存取方式, 這是 SQL Server 和目前大多數 RDBMS 採用的最佳化技術 語意式查詢最佳化 (Semantic Query Optimization): 語意式查詢最佳化需要查詢最佳化模組了解資料庫綱要, 可以自行依所知的系統限制來簡化或刪除查詢結果是空集合的部分查詢, 而且可以自行評估是否使用索引來加速資料存取 11
10 1 2 關聯式資料庫管理系統的查 詢最佳化 執行計劃 執行計劃 (Execution Plan) 是從已經最佳化的查詢樹轉換而得的一個執行策略 執行計劃包含如何存取每一個關聯表的資料存取方式 例如 : 關聯表使用那一個屬性排序, 或是否存在其他屬性的索引 12
10 1 2 關聯式資料庫管理系統的查 詢最佳化 執行計劃演算法 選擇運算 : 使用線性搜尋 (Linear Search) 二元搜尋 (Binary Search) 或雜湊表搜尋法 (Hash Table Search) 來找尋值組, 在索引部分可以使用叢集索引 (Clustering Index) 或 B 樹演算法 合併運算 : 使用巢狀迴圈合併 (Nested loop Join) 單迴圈合併(Single loop Join) 排序合併 (Sort Merge Join) 和雜湊合併 (Hashing Merge Join) 等多種合併演算法 投影運算 : 沒有特別的演算法, 因為只是刪除一些關聯表的屬性 13
10 2 SQL 查詢工具 10 2 1 Query Express 查詢工具 10 2 2 2 使用 Query Express 查詢工具 14
10 2 1 1 Query Express 查詢工具 說明 Query Express 查詢工具是 Joseph Albahari 所開發的 SQL 查詢工具, 它的操作介面類似舊版 SQL Server 2000 版的 Query Analyzer Query Express 不只可以作為 SQL Server 或 Oracle 的客戶端工具, 它還可以作為 MSDE 和 SQL Server 2005 Express 的查詢工具 Query Express 支援.NET Framewrok 2.0 版, 它是使用 C# 和 ADO.NET 建立的客戶端資料庫應用程式, 使用 OLE DB 連接資料庫伺服器來執行 SQL 指令 15
10 2 1 1 Query Express 查詢工具 架構 主從架構的資料庫系統, 客戶端工具 Query Express 使用微軟 OLE DB 來連接伺服端 SQL Server Oracle 或與 OLE DB 相容的資料庫伺服器 16
10 2 2 使用 Query Express 查詢工具 啟動 Query Express 請將書附光碟 QExpress.zip 壓縮檔案解開後, 按二下 QueryExpress.exe 程式檔案啟動 Query Express, 如下圖所示 : 17
10 2 2 使用 Query Express 查詢工具 結束 Query Express 結束 Query Express 請執行 檔案 結束 指令, 即可中斷連接 關閉查詢視窗和結束 Query Express 的執行 18
10 2 2 使用 Query Express 查詢工具 開啟與執行 SQL 指令碼 當在編輯視窗輸入 SQL 指令後, 只需按上方工具列的 儲存查詢 鈕, 就可以儲存成副檔名為.sql 的程式碼檔案 對於書附光碟眾多的 SQL 指令碼檔案, 我們可以使用 Query Express 來載入和執行 19
10 3 資料庫的實體資料模型 Students 資料表 當完成第 6 章和第 7 章的 School 學校資料庫設計後, 我們就可以依據資料庫設計來建立實體資料模型 (Physical Data Model), ) 然後在資料庫使用 SQL 指令新增所需的資料表 Students 資料表 欄位名稱 資料類型 長度 欄位說明 sid CHAR 4 學生的學號, 主鍵 name VARCHAR 12 姓名 tel VARCHAR 15 電話 birthday DATETIME N/A 生日 GPA FLOAT N/A 學生成績 20
10 3 資料庫的實體資料模型 Instructors 與 Courses 資料表 Instructors 資料表欄位名稱資料類型長度欄位說明 eid CHAR 4 講師的員工編號, 主鍵 name VARCHAR 12 講師姓名 rank VARCHAR 10 講師的等級 department VARCHAR 5 所屬科系 Courses 資料表 欄位名稱 資料類型 長度 欄位說明 cno c_no CHAR 5 課程編號, 主鍵 title VARCHAR 30 課程名稱 credits INT N/A 學分數 21
10 3 資料庫的實體資料模型 Classes 資料表 Classes 資料表 欄位名稱 資料類型 長度 欄位說明 eid CHAR 4 講師的員工編號, 參考 Instructors 資料表的 eid 欄位 sid CHAR 4 學生學號, 參考 Students 資料表的 sid 欄位 c_no CHAR 5 課程編號, 參考 Courses 資料表的 c_no 欄 位 time DATETIME N/A 上課時間 room VARCHAR 8 教室編號 score FLOAT N/A 這門課程的成績 22
10 4 資料定義語言 10 4 1 CREATE TABLE 新增關聯表 10 4 2 ALTER TABLE 更改關聯表綱要 10 4 3 DROP TABLE 刪除整個關聯表 10 4 4 TRUNCATE TABLE 刪除關聯表內容 10 4 5 CREATE INDEX 建立索引 10 4 6 DROP INDEX 刪除索引 23
10 4 資料定義語言 SQL 的資料定義語言 (DDL) 是用來建立關聯式資料庫綱要, 也就是在資料庫建立每一個關聯表綱要 視界 索引和設定完整性限制條件 DDL 指令可以分成數種 : 建立資料表指令 :SQL 指令建立基底關聯表是使用 CREATE TABLE 指令, 同時還可以設定關聯表的完整性限制條件 建立視界指令 : 建立視界 (Views) 的指令是 CREATE VIEW, 詳細的說明請參閱第 13 章 建立索引指令 : 建立資料表索引的 DDL 指令 24
10 4 1 CREATE TABLE 新增關聯表 CREATE TABLE 語法 CREATE TABLE table_name ( column1 datatype [ NOT NULL NULL ] [ DEFAULT value1 ], column2 datatype [ NOT NULL NULL ] [ DEFAULT value2 ], column3 datatype [ NOT NULL NULL ] [ DEFAULT value3 ],. columnn datatype [ NOT NULL NULL ] [ DEFAULT valuen ] [, PRIMARY KEY (column_list) ] [, FOREIGN KEY (column_list) list) REFERENCES table_name (column_list) [, CHECK (expr) ] ) 25
10 4 1 CREATE TABLE 新增關聯表 語法說明 NOT NULL NULL: 欄位值是否可以為空值 ; 如果沒有指明, 預設是 NULL, 可為空值 DEFAULT: 指定欄位的預設值, 如果欄位沒有輸入資料, 預設是填入之後的 value1~n 值 PRIMARY KEY (): 指定資料表的主鍵, 括號內是主鍵的欄位, 如果是複合鍵, 欄位需使用逗號分隔 FOREIGN KEY () REFERENCES table_name (): 指定資料表的外來鍵, 括號為外來鍵的欄位清單, REFERENCES 是參考的資料表 table_name, 括號是參考資料表的主鍵 CHECK (): 設定欄位的限制條件, 在括號內是條件的運算式 26
10 4 1 CREATE TABLE 新增關聯表 建立 Students 資料表 建立 Students 資料表 :Ch10 4 1 1.sql 4 1 1 l 在 School 資料庫建立 Students 資料表,SQL 指令如下所示 : CREATE TABLE Students ( sid CHAR(4) NOT NULL, name VARCHAR(12) NOT NULL, tel VARCHAR(15), birthday DATETIME, GPA FLOAT, PRIMARY KEY (sid), CHECK (GPA >= 0.0 and GPA <= 4.0) ) 27
10 4 1 CREATE TABLE 新增關聯表 建立 Instructors 資料表 建立 Instructors 資料表 :Ch10 4 1 2.sql 4 1 2 l 在 School 資料庫建立 Instructors 資料表的 SQL 指令, 主鍵是 eid 欄位, 如下所示 : CREATE TABLE Instructors ( eid CHAR(4) NOT NULL, name VARCHAR(12) NOT NULL, rank VARCHAR(10), department VARCHAR(5) ), PRIMARY KEY (eid) ) 28
10 4 1 CREATE TABLE 新增關聯表 建立 Courses 資料表 建立 Courses 資料表 :Ch10 4 1 3.sqlh l 在 School 資料庫建立 Courses 資料表的 SQL 指令, 主鍵是 c_no 欄位, 如下所示 : CREATE TABLE Courses ( c_no CHAR(5) NOT NULL, title VARCHAR(30) NOT NULL, credits INT DEFAULT 3, PRIMARY KEY (c_no) ) 29
10 4 1 CREATE TABLE 新增關聯表 建立 Classes 資料表 建立 Classes 資料表 :Ch10 4 1 4.sql4 1 4 l 在 School 資料庫建立 Classes 資料表的 SQL 指令, 如下所示 : CREATE TABLE Classes ( eid CHAR(4) NOT NULL, sid CHAR(4) NOT NULL, c_no CHAR(5) NOT NULL, time DATETIME, room VARCHAR(8), score FLOAT, PRIMARY KEY (eid, sid, c_no) cno), FOREIGN KEY (eid) REFERENCES Instructors (eid), FOREIGN KEY (sid) REFERENCES Students (sid), FOREIGN KEY (c_no) REFERENCES Courses (c_no) ) 30
10 4 2 ALTER TABLE 更改關聯表綱要 新增 / 刪除欄位 ( 語法 ) 新增 / 刪除資料表欄位 如果資料表的欄位需要增減, 並不需要重新建立資料表, 可以使用 ALTER TABLE 指令來新增 / 刪除欄位, 其基本語法如下所示 : ALTER TABLE table_name ADD column_name datatype DROP COLUMN column_ name 31
10 4 2 ALTER TABLE 更改關聯表綱要 新增 / 刪除欄位 ( 範例 ) 新增資料表欄位 :Ch10 4 2 1.sql 在 Students 資料表新增 SSN 欄位的身份證字號, 資料型態是 CHAR(10), 其 SQL 指令如下所示 : ALTER TABLE Students ADD SSN CHAR(10) 刪除資料表欄位 :Ch10 4 2 2.sqlq 在 Students 資料表刪除欄位 SSN, 其 SQL 指令如下所示 : ALTER TABLE Students DROP COLUMN SSN 32
10 4 2 ALTER TABLE 更改關聯表綱要 新增主鍵 ( 語法 ) 新增 / 刪除資料表的主鍵 如果在建立資料表時沒有指定主鍵, 可以使用 ALTER TABLE 指令新增資料表的主鍵, 其基本語法如下所示 : ALTER TABLE table_name ADD PRIMARY KEY (column_list) DROP PRIMARY KEY 33
10 4 2 ALTER TABLE 更改關聯表綱要 新增主鍵 ( 範例 ) 請先執行檔案名稱 :Ch10 4 2 3.sql 建立 Employees 資料表, 但是沒有指定主鍵 新增主鍵 :Ch10 4 2 4.sql 接著使用 ALTER TABLE 指令新增 Employees 的主鍵 SSN, 其 SQL 指令如下所示 : ALTER TABLE Employees ADD PRIMARY KEY (SSN) 34
10 4 2 ALTER TABLE 更改關聯表綱要 新增外來鍵 ( 語法 ) 新增 / 刪除資料表的外來鍵 如果在建立資料表時沒有指定外來鍵, 可以使用 ALTER TABLE 指令新增資料表的外來鍵, 也就是建立關聯表間的關聯性 (Relationships), 其基本語法如下所示 : ALTER TABLE table_name ADD CONSTRAINT constraint_name FOREIGN KEY (column_list) REFERENCES table_name (column_list) DROP CONSTRAINT constraint_name 35
10 4 2 ALTER TABLE 更改關聯表綱要 新增外來鍵 ( 範例 1) 新增外來鍵 :Ch10 4 2 5.sqlh l 繼續以上一節的 Employees 資料表為例, 使用 ALTER TABLE 指令新增 Employees 資料表的外來鍵 eid 欄位, 它是參考到 Instructors 的 eid 欄位, 其 SQL 指令如下所示 : ALTER TABLE Employees ADD CONSTRAINT constraint_eid FOREIGN KEY (eid) REFERENCES Instructors (eid) 36
10 4 2 ALTER TABLE 更改關聯表綱要 新增外來鍵 ( 範例 ) 補充 foreign key (branch name) references branch on delete no action cascade set null set default on update cascade 範例 : foreign key (branch name) references branch on delete cascade 37
10 4 2 ALTER TABLE 更改關聯表綱要 新增外來鍵 ( 範例 2) 刪除外來鍵 :Ch10 4 2 6.sql 在 Employees 資料表刪除外來鍵, 也就是刪除名為 constraint_eid 的限制條件, 其 SQL 指令如下所示 : ALTER TABLE Employees DROP CONSTRAINT constraint_eid 38
10 4 2 ALTER TABLE 更改關聯表綱要 新增 / 刪除欄位的限制條件 ( 語法 ) 新增 / 刪除欄位的限制條件 ALTER TABLE 指令可以新增 / 刪除資料表欄位的限制條件, 其基本語法如下所示 : ALTER TABLE table_name tbl ADD CONSTRAINT constraint_name DEFAULT value FOR column_name CHECK (expr) DROP CONSTRAINT constraint_name name 39
10 4 2 ALTER TABLE 更改關聯表綱要 新增 / 刪除欄位的限制條件 ( 範例 1) 新增欄位預設值 :Ch10 4 2 7.sql 在 Employees 資料表新增 name 欄位預設值, 其 SQL 指令如下所示 : ALTER TABLE Employees ADD CONSTRAINT default_ name DEFAULT ' 陳會安 'FOR name 40
10 4 2 ALTER TABLE 更改關聯表綱要 新增 / 刪除欄位的限制條件 ( 範例 2) 新增欄位的限制條件 :Ch10 4 2 8.sql 在 Students 學生資料表新增生日 birthday 欄位限制條件, 其 SQL 指令如下所示 : ALTER TABLE Students ADD CONSTRAINT check_ birthday CHECK (birthday >= '1950 1 1' and birthday <= '2000 12 31') 41
10 4 3 DROP TABLE 刪除整個關聯表 對於資料庫已經存在的基底關聯表, 可以使用 DROP TABLE 指令刪除指定的資料表, 刪除的範圍包含資料表索引 記錄和視界, 其基本語法如下所示 : DROP TABLE table_name 上述語法是從資料庫刪除 table e_ name 的資料表 刪除資料表 :Ch10 4 3.sql 刪除 Employees 資料表的 SQL 指令, 如下所示 : DROP TABLE Employees 42
10 4 4 TRUNCATE TABLE 刪除關聯表內容 資料庫已經存在的基底關聯表, 如果想刪除資料表的記錄, 但是保留關聯表綱要, 可以使用 TRUNCATE TABLE 指令來刪除指定資料表的內容, 其基本語法如下所示 : TRUNCATE TABLE table_name 刪除資料表的內容 :Ch10 4 4 4 4.sql 刪除 Classes 資料表內容, 其 SQL 指令如下 : TRUNCATE TABLE Classes 43
10 4 5 CREATE INDEX 建立索引 說明 以單層有序索引 (Single l Level lod Ordered dindex) ) 來說, 使用主鍵排序建立的索引稱為 主索引 (Primary Index) 非主鍵但有排序的索引稱為叢集索引 (Clustering Index); 其他非排序欄位稱為 次索引 (Secondary d Index), ) 也稱為非叢集索引 (Non clustering Index) 一個基底關聯表只能擁有一個主索引或叢集索引來決定記個主索引或叢集索引來決定記錄的排序方式, 如果還有其他索引一定是次索引, 在一個基底關聯表可以擁有多個次索引 SQL Server 可以建立叢集和非叢集索引, 當在資料表指定主鍵時, 預設建立此欄位的叢集索引 ( 當然我們也可稱它為主索引 ), 其他欄位的索引稱為非叢集索引 ( 即次索引 ) 關於索引可參考課本 Ch22 ( 電子檔 ) 44
( 補充 ) 22 3 索引檔 資料庫的索引機制是為了加速資料存取, 以便在資料庫儲存的龐大資料中, 能夠快速找到所需的記錄資料 如果資料庫使用索引檔案加速資料存取, 在磁碟上就擁有兩個檔案, 一為儲存記錄的資料檔 (Data File), ) 一為索引檔 (Index File) 45
22 3 1 索引檔的基礎 索引項目 索引 (Index) d 是一種額外存取結構來加速記錄的存取, 這是使用關聯表的某些欄位為基礎所建立的索引檔 基本上, 關聯表的每一個欄位都可以建立索引來加速搜尋, 同一個關聯表可以建立不同欄位的多個索引檔 索引檔如同資料庫一般, 也是由記錄或稱為索引項目 (Index Entries) 來組成, 項目主要分為兩個部分, 如下圖所示 : 46
22 3 2 2 單層有序索引 種類 主索引 (Primary i Index): 如果循序式檔案結構是使用鍵值 (Key) 排序, 使用鍵值建立的索引稱為主索引 叢集索引 (Clustering Index): 如果循序式檔案結構是以非鍵值欄位 (Non key) 排序, 也就是說不是主鍵的欄位, 此時欄位可能有多筆記錄擁有相同值, 以此欄位建立的索引結構稱為叢集索引 次索引 (Secondary Index): 也稱為非叢集索引 (Non clustering Index), 這是循序式檔案結構不是排序欄位的其它欄位所建立的索引 47
22 3 2 2 單層有序索引 主索引 主索引是使用循序式檔案結構的唯一鍵值建立的索引, 即主鍵 (Primary Key), 如下圖所示 : 48
22 3 2 2 單層有序索引 叢集索引 叢集索引 (Clustering Index) 叢集索引是指循序式檔案結構的排序欄位不是鍵值欄位, 也就是說, 它是使用非鍵值欄位 (Nonkey) 進行排序, 稱為叢集欄位 (Clustering g Field) ) 索引項目的指標是指向第一個出現叢集欄位值的磁碟區塊, 所以在同一個磁碟區塊可能擁有多種叢集欄位值, 如下圖所示 : 49
22 3 2 單層有序索引 叢集索引 ( 多種叢集欄位值 ) 50
22 3 2 2 單層有序索引 次索引 次索引是循序式檔案結構非排序欄位的其它欄位建立的索引, 稱為索引欄位 (Indexing Field) 如果索引欄位值都是唯一的, 也稱為 次鍵 (Secondary Key), 如下圖 : 51
22 3 2 2 單層有序索引 密集索引檔 密集索引檔 (Dense Index Files) 在資料檔每一筆記錄的鍵值在密集索引檔都有對應的索引項目, 如下圖所示 : 52
22 3 2 2 單層有序索引 稀疏索引檔 稀疏索引檔 (Sparse Index Files) 稀疏索引檔的索引項目只擁有資料檔的部分鍵值, 通常是使用在循序式檔案結構以鍵值排序的情況, 如下圖所示 : 53
22 4 2 2 B + 樹的多層索引 54
10 4 5 CREATE INDEX 建立索引 語法 DDL 的 CREATE INDEX 指令可以建立基底關聯表的索引, 其基本語法如下所示 : CREATE [ UNIQUE ] INDEX index_namename ON table_name (column_name[(length)],... ) [ ASC DESC ] 上述語法可以建立 SQL Server 資料表的非叢集索引, UNIQUE 是指索引值為唯一, 表示不能有 2 筆記錄擁有相同索引值 ;index_name 是索引名稱, column_name 欄位如果不只一個, 請使用逗號分隔 length 欄位是長度, 可以使用部分欄位值來建立索引資料 ;ASC 是由小到大排序,DESC 是由大到小 55
10 4 5 CREATE INDEX 建立索引 範例 建立資料表的索引 :Ch10 4 5.sql 在 Students 學生資料表新增欄位 name 索引資料, 其 SQL 指令如下所示 : CREATE INDEX index_students d ON Students(name) 56
10 4 6 DROP INDEX 刪除索引 DDL 的 DROP INDEX 指令可以刪除基底關聯表的索引資料, 其基本語法如下所示 : DROP INDEX table_name.index_name 上述 table_name 是資料表名稱,index_namei d 是索引名稱 刪除資料表的索引 :Ch10 4 6.sql 在 Students t 學生資料表刪除索引資料的 SQL 指令, 如下所示 : DROP INDEX Students.index_students 57
10 5 資料操作語言 10 5 1 INSERT 新增記錄 10 5 2 UPDATE 更新記錄 10 5 3 DELETE 刪除記錄 *10 5 4 Management Studio 編輯資料表 58
10 5 資料操作語言 SQL 的資料操作語言 (DML) 可以新增 刪除和更新資料表的記錄 ; 換句話說,DDL 是建立資料庫綱要,DML 是建立資料庫副本 (Instance) SQL 語言的資料表操作指令一共有 3 個 ( 註 ), 如下表所示 : INSERT: 在資料表插入一筆新記錄 UPDATE: 更新資料表的記錄 這些記錄是已經存在的 DELETE: 刪除資料表的記錄 註 : 也有將查詢敘述 SELECT 視為 DML 的一種 59
10 5 1 1 INSERT 新增記錄 語法 SQL 語言的 INSERT 指令可以新增一筆記錄到資料表, INSERT 指令的基本語法, 如下所示 : INSERT INTO table (column1,column2,..) VALUES ('value1', 'value2', ) 上述 SQL 指令的 table 為新增記錄的資料表名稱, column1~n 是資料表內的欄位名稱, 不需全部欄位, 不過需要包含所有非空值欄位,value1~ 是對應的欄位值 60
10 5 1 1 INSERT 新增記錄 注意事項 INSERT 指令的注意事項, 如下所示 : 不論是欄位或值的清單, 都需要使用逗號分隔 在 INSERT 指令 VALUES 的值中, 數值不用單引號包圍, 字元與日期 / 時間需要單引號括起 INSERT 指令的欄位名稱清單, 並不需要和資料表定義的欄位數目或順序相同, 只需列出需要值的欄位, 不過括號內的欄位名稱順序要和 VALUES 值的順序相同 61
10 5 1 1 INSERT 新增記錄 範例 新增記錄 :Ch10 5 1 1.sql 在 Students 新增一筆學生記錄的 SQL 指令, 如下所示 : INSERT INTO Students VALUES ('S001','' 陳會安 ', '02 22222222','1967/09/03',3.7) INSERT INTO Students (name, sid) VALUES (' 陳會安 ', 'S001') 上述 SQL 指令皆可新增一筆記錄 62
10 5 2 UPDATE 更新記錄 語法 SQL 語言的 UPDATE 指令可以將資料表符合條件的記錄, 更新指定欄位的內容, 基本語法如下所示 : UPDATEtable SET column1 = 'value1' WHERE conditions table 是資料表,SET 子句 column1 是資料表的欄位名稱, 不用全部只需更新欄位,value1 是更新欄位值 更新的欄位不只一個請使用逗號分隔, 如下 : UPDATEtable SET column1 = 'value1', column2 = 'value2' WHERE conditions 63
10 5 2 UPDATE 更新記錄 注意事項 UPDATE 指令的注意事項, 如下所示 : WHERE 子句是 UPDATE 指令的必要元素 ( 幾乎 ) 因為如果沒有此條件, 資料表所有記錄欄位都會被更新 更新欄位值如果為數值不用單引號包圍, 字元與日期 / 時間需要使用單引號包圍 WHERE 條件可以使用 = <> > <= 和 >= 等比較運算子 WHERE 條件如果不只一個條件, 可以使用邏輯運算子 and 或 or 連結 64
10 5 2 UPDATE 更新記錄 範例 更新記錄 :Ch10 5 2.sql 在資料表 Students 更改學號 S001 生日和 GPA, 其 SQL 指令如下所示 : UPDATE Students SET birthday='1968 09 12', GPA=3.0 WHERE sid = 'S001' 65
10 5 3 DELETE 刪除記錄 語法 SQL 語言的 DELETE 指令可以將資料表符合條件的記錄刪除掉,DELETE 指令的基本語法, 如下所示 : DELETE FROMtable WHERE conditions table 是資料表,WHERE 子句 conditions 為刪除記錄的條件, 意義是 : 將符合 conditions 條件的記錄刪除掉 66
10 5 3 DELETE 刪除記錄 注意事項與範例 DELETE 指令的注意事項, 如下所示 : WHERE 子句是 DELETE 指令的必要元素 ( 幾乎 ) 因為如果沒有此條件, 資料表內的所有記錄都會被刪除掉 刪除記錄 :Ch10 5 3.sql 在資料表 Students 刪除學號 S001 記錄, 其 SQL 指令如下所示 : DELETE FROM Students WHERE sid = 'S001' 67
10 5 4 Management Studio 編輯資料表 SQL Server 在建立 School 資料庫和使用 SQL 指令新增四個資料表後, 就可以使用 Management Studio 在資料表新增測試的記錄資料 68
10 6 資料控制語言 說明 SQL 語言的資料控制語言 (Data Control Language,DCL) g ) 可以定義資料庫安全管理所需的規則, 授予或撤回使用者的相關權限, 讓使用者 : 只能執行授權的操作和處理擁有權限的資料 限制無法執行或取得沒有授權的操作或資料 69
10 6 資料控制語言 GRANT 指令 GRANT 指令可以授予資料庫使用者的權限, 其基本語法如下所示 : GRANT { ALL [ PRIVILEGES ] privileges [ (column [,columnn]) ] [,privileges ] } ON table_name TO user_name [,user_name...] 上述語法可以在 ON 子句指定授予哪一個 table_name 資料表的權限, 在 privileges 權限的括號中可以指定擁有哪些欄位的權限 70
10 6 資料控制語言 REVOKE 指令 REVOKE 指令是對應 GRANT 指令, 可以徹回某位使用者所授予的權限, 其基本語法如下所示 : REVOKE { ALL [ PRIVILEGES ] privileges [ (column [,columnn]) ] [,privileges ] } ON table_name FROM user_name [,user_name...] 上述語法可以在 ON 子句指定徹回哪一個 table_name 資料表的權限, 在 privileges 權限的括號中可以指定徹回哪些欄位的權限 71
Privileges: Select, delete, insert, update, drop, E.g.: grant select on branch to Tom, Helen l revoke select on branch from Tom, Helen 72
10 7 產生 SQL Server 指令碼精靈 * Management Studio 提供指令碼精靈來自動產生資料庫綱要的 SQL 指令碼檔案 其主要目的是如果資料庫損壞時, 可以使用這些 SQL 指令檔還原損壞的資料庫綱要 73