跳轉到內容

JET 資料庫/選擇

來自華夏公益教科書
JET 資料庫

簡介 · 建立和連線 · 資料型別 · 物件名稱和常量 · 資料完整性 · 安全 · 資料定義語言 · 選擇 · 插入 · 更新 · 刪除 · 函式 · 檢視和儲存過程 · 操作工具 · 整合和遷移 · 設計工具

Clipboard

待辦事項
where 子句、分組和分組選擇、排序、外部表、子查詢、虛擬表、OwnerAccess 選項


可以使用 Select 語句從表中檢索資料。該語句採用以下基本形式

Select [{limit-clause}] {column-list}
    [Into {new-tablename}]
    From {table-expression}
    [Where {where-clause}]
    [Group By {group-by-expression}]
    [Having {having-clause}]
    [Order By {order-list}]
    [With OwnerAccess Option]
{限制子句}
  • 所有(預設) - 選擇所有匹配的行
  • Distinct - 選擇具有所選列唯一值的匹配行
  • DistinctRow - 選擇在所有訪問的列中具有唯一值的匹配行,無論是否被選中
  • Top n [Percent] - 將返回的匹配行數限制為 n,或所有匹配行的 n%
{列列表} 一個星號 (*) 指定返回所有可用列;或一個逗號分隔的表示式列表,這些表示式計算為輸出列,其中每個表示式可以採用以下形式
表示式 [作為顯示名稱]

並且可以包含來自表或檢視的列、函式呼叫、常量或巢狀表示式。

{新表名} 將要插入匹配行的非現有表的名稱。
{表表達式} 表、檢視或子查詢的列表,逗號分隔或使用顯式聯接指令。每個表/檢視/子查詢可以有一個可選別名,形式為
表示式 [別名]

例如:

From account_details a, contact_details c, invoices i

可以使用 In 子句指定表位於外部資料庫中,該子句指定目標表所在的外部資料庫的 Windows 路徑。外部資料庫可以是另一個 JET 資料庫,也可以是 JET 驅動程式可以連線到的任何其他資料庫(包括 xBaseParadox 資料庫)。

{where 子句} 一組表示式,限制在 {表表達式} 中指定的表或檢視中匹配的行。where 子句可以包含多個表示式,這些表示式由邏輯 AndOrNot 運算子分隔,並由括號 (...) 分組
{group-by 表示式} 一個逗號分隔的表示式列表,這些表示式計算為分組的輸出列,用於返回聚合資料(例如總和、計數)
{having 子句} 一組表示式,限制返回聚合資料時匹配的行
{order 列表} 用於對匹配行進行排序的列列表

以下是一個簡單的選擇語句,它返回單個表中的所有行,其中包含該表中的所有列,並按一個列排序

Select * From S1 Order By a

在 JET SQL 中,與其他 SQL 方言一樣,對錶、檢視和子查詢的操作幾乎相同;在本節的其餘部分,可以被理解為物理表、檢視或用作虛擬表的子查詢。稍後將詳細介紹子查詢和虛擬表。

列列表

[編輯 | 編輯原始碼]

最簡單的 {列列表} 是星號,它指定返回 {表表達式} 中列出的中的所有可用列

Select * From S1

可以透過指定逗號分隔的列名列表來從中選擇單個列,並且可以根據需要為每個列提供別名

Select a, b as TheSecondColumn From S1

{表表達式} 中有多個時,會導致兩個結果列可能具有相同的名稱,可以使用名稱(或的別名)來指定要返回的列。以下兩個語句實現了相同的結果,第二個語句使用表別名使語句更簡潔

Select Invoice.InvoiceNumber, Invoice.CustomerNumber, Customer.CustomerName
    From Invoice, Customer
    Where Customer.CustomerNumber = 10 And Invoice.InvoiceNumber = 123

Select i.InvoiceNumber, i.CustomerNumber, c.CustomerName
    From Invoice i, Customer c
    Where c.CustomerNumber = 10 And i.InvoiceNumber = 123

除了指定中的列之外,{列列表} 中的列還可以是表示式。這樣的表示式可以是數學方程、函式呼叫、字串連線、常量或它們的混合。以下是一個示例,展示瞭如何從專案價格和數量計算擴充套件價格,以及如何將常量作為列引入

Select ID, (ItemPrice * ItemQuantity) As ExtendedPrice, 'A' As ReportPart
    From OrderItem

聯接表

[編輯 | 編輯原始碼]

查詢資料通常需要檢視多個表才能找到答案,尤其是在遵循良好的資料庫設計原則時。SQL 允許使用單個 Select 語句來實現這一點,方法是聯接

可以使用 JET SQL 將兩個或多個聯接在一起,這與其他 SQL 方言中的方式非常相似。以下是一些示例表,用於檢查 JET SQL 中的聯接語法

表 J1
JobName
公交車司機
醫生
電工
油漆工
銷售員
 
表 J2
WorkerName JobName
瑪麗 公交車司機
拉斐爾 電工
威廉 油漆工
布魯斯 醫生
胡安妮塔 醫生

笛卡爾積聯接

[編輯 | 編輯原始碼]

笛卡爾積聯接,有時稱為交叉聯接,是指將第一個中的每一行與第二個中的每一行聯接起來。這種聯接在生成來自兩個或三個類別的所有可能組合的列表時很有用。笛卡爾積聯接的語法是最簡單的聯接語法;只需在 {表表達式} 中用逗號分隔列出即可

Select J1.JobName, J2.WorkerName From J1, J2
JobName              WorkerName
-------------------- --------------------
bus driver           Mary
doctor               Mary
electrician          Mary
painter              Mary
sales clerk          Mary
bus driver           Raphael
doctor               Raphael
electrician          Raphael
painter              Raphael
sales clerk          Raphael
bus driver           William
doctor               William
electrician          William
painter              William
sales clerk          William
bus driver           Bruce
doctor               Bruce
electrician          Bruce
painter              Bruce
sales clerk          Bruce
bus driver           Juanita
doctor               Juanita
electrician          Juanita
painter              Juanita
sales clerk          Juanita
(25 row(s) returned)

內部聯接

[編輯 | 編輯原始碼]

有兩種方法可以實現內部聯接,其中第一個中的每一行都透過表示式與第二個中的一個或多個行聯接起來。第一種方法是上面笛卡爾積聯接的擴充套件,使用 {where 子句} 表示式

Select J1.JobName, J2.WorkerName From J1, J2
    Where J1.JobName = J2.JobName

或者,可以在 {表表達式} 中提供內部聯接表示式。在實踐意義上,這與前面的示例沒有區別,但有些人發現它更清楚地顯示了聯接型別及其約束,與用作 {where 子句} 中選擇器或過濾器的表示式不同

Select J1.JobName, J2.WorkerName
    From J1
    Inner Join J2 On J1.JobName = J2.JobName
JobName              WorkerName
-------------------- --------------------
bus driver           Mary
electrician          Raphael
painter              William
doctor               Bruce
doctor               Juanita
(5 row(s) returned)

外部聯接

[編輯 | 編輯原始碼]

將兩個聯接起來,使得第一個與第二個中的零行或一個或多個行聯接起來,需要左外部聯接。從另一個角度看,這種聯接是指返回從第一個中選擇的所有行,無論第二個中是否有與之聯接的行;內部聯接只返回可以與第二個中的行聯接的第一個中的行。在 JET SQL 中,左外部聯接需要在 {表表達式} 中使用 LEFT JOIN 語句,並使用 ON 部分後的語句指定聯接的詳細資訊

Select J1.JobName, J2.WorkerName
    From J1
    Left Join J2 On J1.JobName = J2.JobName
JobName              WorkerName
-------------------- --------------------
bus driver           Mary
doctor               Juanita
doctor               Bruce
electrician          Raphael
painter              William
sales clerk          <NULL>
(6 row(s) returned)

左外部聯接的相反情況,即第二個與第一個中的零行或一個或多個行聯接起來,稱為右外部聯接。在 JET SQL 中,右外部聯接需要在 {表表達式} 中使用 RIGHT JOIN 語句

Select J1.JobName, J2.WorkerName
    From J1
    Right Join J2 On J1.JobName = J2.JobName

多重聯接

[編輯 | 編輯原始碼]

Select 語句聯接兩個以上的時,每對必須巢狀在括號中,以將聯接的表分組在一起

Select *
    From ((J1 Left Join J2 On J1.JobName = J2.JobName)
    Inner Join J3 On J2.WorkerName = J3.WorkerName)
    Left Join J4 On J3.x = J4.x

限制子句

[編輯 | 編輯原始碼]

{限制子句} 限制查詢返回的資料量,以及是否返回重複行。如果未指定它,則查詢將返回所有匹配選擇條件的行,包括重複項。這與 Select All 相同。

表 L1
ID FullName JobTitle
1 Joe Bloggs 油漆工
2 Milly Jones 醫生
3 Robert Green 電工
4 Joe Bloggs 作者
5 李 Wong 會計
6 Joe Bloggs 油漆工
7 李 Wong 水管工
 
表 L2
AccountNumber ID
123456789 1
987654321 2
134679258 3
976431852 4
456789123 4

Distinct

[edit | edit source]

Distinct 從結果集中刪除所有具有相同值的行。如果沒有 Distinct,則名稱為 Joe Bloggs 的帳戶將有 3 行,但使用 Distinct,以下語句將只返回一行 Joe Bloggs。

Select Distinct FullName
    From L1 Inner Join L2 On L1.ID = L2.ID
FullName
--------------------
Joe Bloggs
Milly Jones
Robert Green
(3 row(s) returned)

DistinctRow

[edit | edit source]

DistinctRow 從結果集中刪除所有重複的錶行,考慮所有在 {column-list} 中具有列的表的列 - 與 Distinct 有細微區別,後者僅考慮 {column-list} 中的列。

Select DistinctRow FullName
    From L1 Inner Join L2 On L1.ID = L2.ID
FullName
--------------------
Joe Bloggs
Milly Jones
Robert Green
Joe Bloggs
(4 row(s) returned)

當只選擇一個表時,DistinctRow 將被忽略。

Top n

[edit | edit source]

Top n 用於限制返回的行數,可以是特定數量的行,也可以是完整結果集的百分比。

Select Top 4 * From L1
ID          FullName             JobTitle
----------- -------------------- --------------------
1           Joe Bloggs           painter
2           Milly Jones          doctor
3           Robert Green         electrician
4           Joe Bloggs           author
(4 row(s) returned)
Select Top 40 Percent * From L1
ID          FullName             JobTitle
----------- -------------------- --------------------
1           Joe Bloggs           painter
2           Milly Jones          doctor
3           Robert Green         electrician
(3 row(s) returned)
華夏公益教科書