跳转到内容

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)
华夏公益教科书