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)