JET 資料庫/選擇
可以使用 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]
{限制子句}
|
|
{列列表}
|
一個星號 (*) 指定返回所有可用列;或一個逗號分隔的表示式列表,這些表示式計算為輸出列,其中每個表示式可以採用以下形式
並且可以包含來自表或檢視的列、函式呼叫、常量或巢狀表示式。 |
{新表名}
|
將要插入匹配行的非現有表的名稱。 |
{表表達式}
|
表、檢視或子查詢的列表,逗號分隔或使用顯式聯接指令。每個表/檢視/子查詢可以有一個可選別名,形式為
例如:
可以使用 |
{where 子句}
|
一組表示式,限制在 {表表達式} 中指定的表或檢視中匹配的行。where 子句可以包含多個表示式,這些表示式由邏輯 And、Or 和 Not 運算子分隔,並由括號 (...) 分組 |
{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 中的聯接語法
|
|
笛卡爾積聯接,有時稱為交叉聯接,是指將第一個表中的每一行與第二個表中的每一行聯接起來。這種聯接在生成來自兩個或三個類別的所有可能組合的列表時很有用。笛卡爾積聯接的語法是最簡單的聯接語法;只需在 {表表達式} 中用逗號分隔列出表即可
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 相同。
|
|
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)
