第 8 章
介紹關聯式資料庫與
SQLite
⎯⎯⎯⎯⎯⎯⎯⎯ ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
8.1 何謂關聯式資料庫 8.2 建立一個表格(Table) 8.3 從表格中查詢資料 8.4 關聯資料模型 8.5 關聯的種類
8.6 兩個表格之互相聯結
8.7 SQL 子句:加總及平均
8.8 SQL 子句:分組
194 Android應用框架原理與程式設計36 技
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
8.1 何謂關聯式資料庫
關聯式資料庫(Relational Database)是目前市面上最重要、最流行的資料庫,
它應用數學方法來處理資料庫裡的資料。自從 1970 年代以來,業界所開發的資
料庫管理系統產品幾乎大多屬於這類型的,在資料庫發展史上,關聯式資料庫扮 演最重要的角色。
關聯式資料庫系統的主要特色是:關聯系統只有 「表格」 (Table)一種資料
結構;而其提供的SQL 語言則讓我們能輕易流暢地操作表格裡的資料。
SQLite 是 Android 裡 面 的 主 要 資 料 庫 服 務 組 件 。 是 一 種 關 聯 式 資 料 庫 (Relational Database) 。 若 要 使 用 SQLite , 您 需 要 瞭 解 關 聯 資 料 庫 管 理 系 統 (RDBMS) 的 工 作 原 理 , 包 括 資 料 庫 概 念 , 如 何 規 劃 資 料 庫 , 如 何 使 用 SQL Server 的 SQL 語言來存取資料庫裡的資料。
SQL 是英文(Structured Query Language)的縮寫,意思為結構化查詢語言。
我們可以透過 SQL 語言來與各種資料庫系統溝通。按照 ANSI(美國國家標準協 會)的規定,SQL 是關聯式資料庫系統的標準語言。SQL 語句可用來執行各式各 樣 的 資 料 操 作 , 例 如 更 新 資 料 、 查 詢 資 料 等 。 目 前 流 行 的 Oracle 、 Sybase、 Microsoft SQL Server、Access 等系統都採用標準的 SQL 語言。
8.2 建立一個表格(Table)
在關聯式資料庫中,資料是以行(Column)和列(Row)的形式而儲存的,這一 群的行和列的整合體,就稱為表格(Table),一群表格便組成了資料庫。其 SQL 語 句的格式為:
create table table_name
(column_name1 column_type, column_name2 column_type, …);
例如:
create table Student(stud_no text primary key, stud_name text);
就建立出一個表格。接著,可以存入資料於表格中,如下:
第 8 章 介紹關聯式資料庫與SQLite 195
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Student表格
stud_no stud_name
101 Mike 102 Linda 103 Tom
剛才說過了,所謂關聯資料庫就是它含有許多表格,而且表格跟表格之間會 有某種聯繫關係。如下:
圖 8-1 很多相互聯繫的表格構成一個資料庫(此圖摘自.Net 框架)
196 Android應用框架原理與程式設計36 技
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
8.3 從表格中查詢資料
在關聯式資料庫中,各表格之間用關係來組織,關係(Relationship)是表格之 間的一種連結途徑,藉由關係,可以輕易地存取資料庫的資料;另外,人們還可
以利用SQL 語句順暢地查詢資料庫的資料,例如:
select stud_no, stud_name from Student;
這個 SQL 語句查詢而得出的內容為:列出 Student 所有列(Row)的資料。在同 樣的查詢情況下,如果你想縮小查詢範圍(如僅想知道學號為‘102’的學生名字),
可以寫如下SQL 語句:
select stud_no, stud_name from Student where stud_no = ‘102’;
其結果是:
stud_no stud_name
102 Linda
如果你想知道學號為‘102’以外的學生名字,可以寫如下:
select stud_no, stud_name from Student where stud_no <> ‘102’ ; 其結果是:
stud_no stud_name
101 Mike 103 Tom
如果你想知道學號不是‘101’,而且學生名字不是‘Linda’的資料,可以寫為:
select stud_name from Student
where stud_no <> ‘101’ and stud_name <> ‘Linda’;
其結果是:
stud_name Tom
第 8 章 介紹關聯式資料庫與SQLite 197
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
8.4 關聯資料模型(Relational Data Model)
在關聯資料模型中,資料的結構就是一個二維(即以行和列的形式儲存)的表 格。一個二維的表格,就稱為一個關聯(Relation)。二維表格中儲存了兩種資料:
資料記錄本身,以及記錄間的關係。這裏的關係是透過不同的表格中具有相同的 欄 位 名 稱 來 達 成 的 。 例 如 前 面 的 Student 表 格 裡 含 有 學 號 、 姓 名 等 資 訊 , 而 Course 表格裡,可含有科目名稱以及選修該課程的學生學號等,如下:
Course表格
course_name stud_no DATABASE 101
ART 101 DATABASE 102
這兩個表格藉由學號欄位來建立兩者之間關係。此外,還可以繼續關聯下 去,例如再建立一個表格:
Teacher表格
couse_name teacher_name
DATABASE 張長豐
ART 高煥堂
MS OFFICE 林主任
HISTORY 張長豐
從這三個表格中的聯繫關係中,你可以找出:張長豐老師教那幾個科目?
他目前有幾位學生?
8.5 關聯的種類
關聯式資料庫是以關聯資料模型為基礎的資料庫,它利用表格和表格中的欄 位來描述其關係。一個表格就對應到我們觀念中的一個檔案,而欄位則代表該檔
198 Android應用框架原理與程式設計36 技
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
案的某種特性。例如,檔案“學生”可以用表格 Student (stud_no, stud_name, sex, age, grade, phone, …) 來描述,其中欄位 stud_no、stud_name、sex、grade、phone 等分別代表格了學號、姓名、性別、年齡、班級、電話等“學生”的基本性質。表 格與表格之間存在著一對一、一對多和多對多三種類型的聯結模式:
z 一對一關聯(1:1)
1:1 關聯是很常見的。例如,不同的國家有不同的首都,而且首都在特定的 國家裏,則“首都”與“國家”之間便是 1:1 關聯。也就是說,一個首都會對應到唯 一的國家,而一個國家可能沒有首都,即使有的話,也只有一個首都,不會有兩 個首都。
z 一對多關聯(1:N)
例如,一個國家有許多城市,而一個城市只會位於唯一個的國家境內,則
“國家”與“城市”之間便是 1:N 關聯。
z 多對多關聯(N:N)
例如,在一位老師可以教授許多科目,而一個科目也可以由多位老師來教 授,則老師表格與科目表格之間便是多對多的關聯。
8.6 兩個表格之互相聯結
SQL 語句可以將幾個不同表格的資訊聯接起來,成為一個新的表格。例如可
以利用SQL 語言中的 JOIN 操作來組合兩個表格中的記錄,只要在共同欄位之中
有一致的值即可聯結起來,而產生一個新表格。茲再重述一下 Student 和 Course
兩個表格:
Student表格
stud_no stud_name
101 Mike 102 Linda 103 Tom
第 8 章 介紹關聯式資料庫與SQLite 199
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Course表格
course_name stud_no DATABASE 101
ART 101 DATABASE 102
使用下述 SQL 語句,這就把兩個表格聯結起來:
select Student.stud_name, Course.course_name from Student, Course where Student.stud_no = Course.stud_no;
得出結果為:
Student.stud_name Course.course_name
Mike DATABASE Mike ART
Linda DATABASE
8.7 SQL 子句:加總及平均
在 SQL 語句中,可以將特定的欄位的所有值加總起來,也可以進行其他運 算。例如:
New_Course表格
course_name stud_no score1 score2 DATABASE 101 70.0 74.5
ART 101 60.0 45.0
DATABASE 102 95.0 90.5
使用下述 SQL 語句,這會進行加總了:
select SUM(score1), SUM(score2) from New_Course;
200 Android應用框架原理與程式設計36 技
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
得出結果為:
SUM(score1) SUM(score2)
225.0 210.0
除了加總之外,還可計算平均值:
select AVG(score1), AVG(score2) from New_Course 得出結果為:
AVG(score1) AVG(score2)
73.0 70.0
8.8 SQL 子句:分組
GROUP BY 子句可建立比較小的組(Group),並且對每一個組進行加總等運 算。換句話說,它產生每一組的整體性資訊。例如:
select course_name, SUM(score1), SUM(score2) from New_Course group by course_name
得出結果為:
course_name SUM(score1) SUM(score2) DATABASE 165.0 165.0
ART 60.0 45.0
藉由 GROUP BY 語句,可以讓 SUM()等函數對屬於一組的資料進行運算。當 你指定「GROUP BY 區域」時, 屬於同一個區域的一組資料將只會得到一行 (Column)的值。◆