模块
目录
索引 🔎︎

# 查询设计

「查询设计视图」允许您创建和编辑数据库查询。

要访问此命令...

在数据库文件窗口中，点击「查询」图标，然后选择「编辑 - 编辑」。

大部分数据库都使用查询来筛选或排序数据库表格，以在您的计算机上显示记录。视图提供与查询相同的功能，但在服务器端提供。如果您的数据库处于支持视图的服务器上，可以使用视图来筛选服务器上的记录以加速显示。

从数据库文档的「表」选项卡页面中选择「创建视图」命令，您可以看到「视图设计」窗口，它与这里介绍的「查询设计」窗口相似。

「查询设计」窗口布局可以用已创建的查询存储，不能用已创建的视图存储。

## 设计视图

为创建查询，请点击数据库文档中的「查询」图标，然后点击「在设计视图中创建查询」。

「设计视图」下方区域中的窗格是用来定义查询的。要定义一个查询，请指定查询包括的数据库字段名称以及用于显示这些字段的条件。要重新排列「设计视图」下方窗格中的列，请将列标题拖到新的位置，或者选择相应的列并按「命令 Ctrl+方向」键。

在「查询设计」窗口中的上方，显示了「查询设计」栏和「设计」栏的图标。

如果希望测试查询，请在数据库文档中双击该查询名称。查询结果显示在类似于「数据源视图」的表格中。注: 显示的表格只是临时的。

### 查询设计视图中的键

键 | 功能
F4 键 | 预览
F5 键 | 运行查询
F7 键 | 添加表格或查询

## 浏览

首次打开查询设计时，会出现对话框要求您先选择表格或查询，用作新查询的基础。

双击字段可以将其加入到查询。拖放可以定义关系。

在设计查询期间，无法修改选中的表格。

### 删除表格

要把一个表格从设计视图中移除，请点击表格窗口的上部边框，调出右键菜单。使用命令「删除」把表格从设计视图中移除。另外，您也可以使用删除键来移除。

### 移动表格并修改表格大小

可以根据需要来排列表格并改变其大小。要移动一个表格，拖动其上边框到希望放置的位置。要放大或缩小一个表格的显示比例，则拖动其边框或一个角，直到得到想要的大小。

## 表格关系

如果一个表格中的一个数据字段与另一个表格中的一个数据字段之间存在数据关系，那么您可以把此关系用于您的查询。

例如，有一个商品表格，其中的商品用商品编号标识；还有一个客户表格，用相应的商品编号记录了客户订购的全部商品。这两个表中的「商品编号」数据字段之间就存在关系。如果现在要建立查询，反馈某位客户订购的所有商品，就需要从这两个表格中检索数据。为此，必须在 LibreOffice 中指定这两个表格所含数据之间的关系。

为此，点击一个表格中的一个字段名称 (例如客户表中的「Item-Number」字段)，并按住鼠标按钮把它拖到另一个表格的字段名称上 (「Item」表格的「Item-Number」)。当松开鼠标按钮，您会看到一根线条将两个窗口中的这两个字段连接起来。在由此产生的 SQL 查询中将登记相应的条件，即这两个数据字段的内容必须相同。

只有使用 LibreOffice 作为关系数据库的界面，才能建立以多个关联工作表为基础的查询。

不能通过同一个查询访问多个数据库中的表格。只能在一个数据库中建立涉及多个表格的查询。

### 指定关系类型

如果双击两个链接字段之间的连线，或者调用菜单命令「插入 - 新建关系」，您可以在「关系」对话框中指定关系的类型。

也可以按住 Tab 键直到选中线条，然后按 Shift+F10 组合键来显示右键菜单并选择指令「编辑」。某些数据库只支持可能联接类型的子集。

### 删除关系

要删除两个表格间的关系，请用鼠标点击其连线并随后按删除键。

另外，也可以在「关系对话框中删除「相关字段」包含的相应条目，或者按 Tab 键找到高亮显示的连结向量，然后按 Shift+F10 键打开右键菜单并选择删除」命令。

## 定义查询

选择条件以定义查询。设计表格的每列都接受用于查询的数据字段。一行中的条件用布尔 AND 连接。

### 指定字段名称

首先，从表格中选择所有要加入到查询的字段名称。这可以通过拖放或者直接双击表格窗口中的字段名称来实现。这里的拖放是指使用鼠标将字段名称从表格窗口拖到「查询设计」的下方区域中。拖放时，可以决定将选中字段加入「查询设计」窗口的哪一列中。可通过双击来选择字段名称。相应的字段将被加入「查询设计」窗口的下一个空白列。

### 删除字段名称

要将一个字段名称从查询中删除，请用鼠标点击该字段的标题，然后在该列的右键菜单中启动命令「删除」。

### 保存查询

使用「标准」工具栏上的「保存」图标来保存查询。将会看到一个要求您输入查询名称的对话框。如果数据库支持略图，您也可以输入略图名称。

#### 略图

请输入为查询/表格视图指定的架构名称。

#### 查询/表格视图名称

输入查询/表视图的名称。

### 筛选数据

要筛选查询的数据，请在「视图设计」的下方区域中设置所需条件。可以使用以下选项:

#### 字段

输入查询中所引用的数据字段的名称。筛选选项各行中的所有设置都是针对此字段。通过点击鼠标激活某个单元格，将显示一个箭头按钮，以供选择字段。「Table name.*」选项可选择所有的数据字段，指定条件对于所有表格字段均有效。

#### 别名

指定别名。此别名将替代字段名称显示在查询中。这样就可使用用户定义的列标签。例如，数据字段的名称为「PtNo」，而您却希望在查询中显示名「PartNum」，此时就可输入「PartNum」作为别名。

在 SQL 语句中，定义别名的方法如下:

SELECT column AS alias FROM table。

例如:

SELECT "PtNo" AS "PartNum" FROM "Parts"

#### 表格

在此列出所选数据字段对应的数据库表格。如果通过点击鼠标来激活某个单元格，将显示一个箭头按钮，以便为当前查询选择其他表格。

#### 排序

如果您点击此单元格，可以选择排序选项: 升序、降序和不排序。文本字段按字母顺序排序，数字字段按数字顺序排序。对于大部分数据库，管理员可以在数据库级别设置排序选项。

#### 可见

如果为某个数据字段选中「可见」属性，在查询结果中将显示该字段。如果数据字段只用于构成条件或计算，则不必显示该字段。

#### 条件

指定筛选数据字段内容的首要条件。

#### 或者

您可以在每一行输入一个附加筛选条件。单列中的多个条件将解析为布尔「或」。

此外，还可以通过行标题的右键菜单在「查询设计」窗口的下部区域插入基于函数的筛选:

### 函数

此处可供选择的函数取决于数据库引擎提供的函数。

如果使用的是嵌入式 HSQL 数据库，「函数」行的列表框提供以下选项:

选项 | SQL | 效果
无函数 |  | 无函数可执行。
平均值 | AVG | 计算一个字段的算术平均值。
记数 | COUNT | 确定表格中记录的数目。空字段可以计算在内 (a)，也可以排除在外 (b)。 a) COUNT(*):如果使用一个小星号作为参数，那么该表的全部记录都将计算在内。 b) COUNT(列): 将列名称作为参数传入，只统计该列包含值的记录。该列值为「null」的记录 (即字段不含任何字符) 不会纳入统计。
最大值 | MAX | 确定一个字段最大的记录值。
最小值 | MIN | 确定一个字段最小的记录值。
总计 | SUM | 计算各个相关字段的记录值的总和。
组合 | GROUP BY | 按照选中的字段名称对查询数据进行组合。根据指定的组合，执行相应的函数。在 SQL 中，此选项对应于「GROUP BY」子句。如果添加某个条件，则对应的条目将显示在 SQL「HAVING」子句中。

也可以直接在 SQL 语句中输入函数，其语法是:

SELECT FUNCTION(column) FROM table。

例如在 SQL 中调用计算总和的函数:

SELECT SUM("price") FROM "article"。

以上函数除「分组」函数外，就是所谓的「聚合函数」。这些就是用于从结果中计算数据以创建汇总的函数。列表框中没有列出的其他函数也是可能的。这与指定使用何种数据库引擎以及 Base 用于连接该数据库引擎的驱动程序当前能提供的功能有关。

要使用列表框中没有列出的其他函数，得在「字段」下手动输入。

您也可以将别名指定给函数调用。如果不希望查询字符串显示在列标题中，请在「别名」下输入想要的替代名称。

SQL 语句中的相应函数是:

SELECT FUNCTION() AS alias FROM table

示例:

SELECT COUNT(*) AS amount FROM "article"

如果运行此类函数，则除了将这些列作为「组合」函数的参数外，不能再插入其他用于查询的列。

「示例」

在以下示例中，通过两个表格来进行查询: "Item" 表格带有字段 "Item_No"，"Suppliers" 表格带有字段 "Supplier_Name"。另外，这两个表格还有一个共同的数据字段 "Supplier_No"。

要建立一个包括所有提供多于 3 种货物的供货商的查询，必须执行下列步骤:。

1. 把表 "article" 和 表"supplier" 插入查询设计。

2. 假如此类型没有关系，那么链接两个表格的 "Supplier_No" 字段。

3. 双击表格「Item」中的「Item_No」字段。使用右键菜单显示「函数」行，然后选择「Count」函数。

4. 输入条件「>3」，然后禁用「可见」字段。

5. 在表格 "Suppliers" 中双击字段 "Supplier_Name"，然后选择组合函数。

6. 运行查询。

如果在表格 "Item" 中有字段 "preice" (货物的单价) 和字段 "Supplier_No" (货物的供应商)，那么您就能用以下查询得到供应商提供的货物的平均价格:

1. 将 "Item" 表格插入查询设计。

2. 双击 "Preice" 和 "Supplier_No" 字段。

3. 打开「函数」行，然后在 "price" 字段中选择平均值函数。

4. 你也可以在用于别名的行中输入「平均值」 (不带引号)。

5. 在 "Supplier_No" 字段选择组合。

6. 运行查询。

下面是现有的右键菜单命令和各式图标:

### 函数

显示或隐藏用于函数选择的行。

### 表格名称

显示或隐藏用于表格名称的行。

### 别名

显示或隐藏别名所在的行。

### 非重复值

查询时只检索非重复值。该功能适用于选中字段可能出现多次重复数据记录的情况。如果启用了「非重复值」命令，在查询结果中相同值仅显示一条记录 (DISTINCT)。否则，将显示所有符合查询条件的数据记录 (ALL)。

例如，如果地址数据库中含有多个「Smith」，您可以选中「非重复值」命令来指定「Smith」这个名字在查询结果中仅出现一次。

如果查询涉及多个字段，则所有字段值的组合必须唯一，该记录才会在结果中出现。例如，通讯簿中包括一条「芝加哥的 Smith」和两条「伦敦的 Smith」。使用「非重复值」命令查询「姓氏」和「城市」两个字段后，返回的查询结果中只会出现一条「芝加哥的 Smith」和一条「伦敦的 Smith」。

在 SQL 中，此命令对应于 DISTINCT 谓词。

### 限度

允许您限制查询返回的最大记录条数。

如果添加了「Limit」语句, 您将会得到不超过该数字指定的记录数。否则，您将会看到满足查询条件的所有记录。

### 指定筛选条件

在指定筛选条件时，您可以使用各种运算符和命令，包括关系运算符，以及用于查询数据库字段内容的 SQL 特定命令。如果使用 LibreOffice 语法来调用这些命令，则 LibreOffice 会自动通过内部解析器将它们转换成对应的 SQL 语法。也可以绕过内部解析器，直接输入 SQL 命令。下表简要介绍了一些运算符和命令:

运算符 | 含义 | 如果...，则条件满足
= | 等于 | ...该字段内容与指定的表达式一致。 运算符「=」不显示在查询字段中。如果输入一个不带运算符的数值，会自动假设采用「=」运算符。
<> | 不等于 | ...该字段内容与指定的表达式不一致。
> | 大于 | ...字段内容长于指定的表达式。
< | 小于 | ...字段内容小于指定的表达式。
>= | 大于或等于 | ...该字段内容大于或等于指定表达式。
<= | 小于或等于 | ...该字段内容小于或等于指定的表达式。

LibreOffice 命令 | SQL 命令 | 含义 | 如果...，则条件满足
IS EMPTY | IS NULL | 为空 | ... 该字段不包含数据。对于带有三种可能状态的「是/否」字段，该命令自动查询不确定的状态 (既非「是」、也非「否」)。
IS NOT EMPTY | IS NOT NULL | 非空 | ... 字段不为空，即包含数据。
LIKE 占位符 (*) 表示任意数量的字符 占位符 (?) 表示一个字符 | LIKE 占位符 (%) 表示任意数量的字符 占位符 (_) 表示一个字符 | 是一个元素，位于 | ... 数据字段必须以给出的顺序包含指定的搜索字符串。 (*) 占位符的位置指定被搜索的字符串 (x) 是在占位符之前 (x*)、之后 (*x) 还是之间 (*x*)。在 LibreOffice 界面中，除了常见的文件系统占位符 (*) 以外，您还可以在 SQL 查询语句中使用 SQL (%) 字符作为占位符。 占位符 (*) 或 (%) 表示任意数量的字符。在 LibreOffice 界面中使用问号 (?)，在 SQL 查询中使用下划线 (_) 表示单个字符。
NOT LIKE | NOT LIKE | 不是一个元素，位于 | ... 该字段不含符合指定表达式的数据。
BETWEEN x AND y | BETWEEN x AND y | 位于区间 [x,y] 中 | ... 该字段包含位于 x 和 y 之间的数据值。
NOT BETWEEN x AND y | NOT BETWEEN x AND y | 不在区间 [x,y] 中 | ... 该字段包含不在 x 和 y 之间的数据值。
IN (a; b; c...) 注意，所有数值列表采用分号作为分隔符! | IN (a, b, c...) | 含有 a, b, c... | ... 该数据字段含有指定表达式 a, b, c,... 中的一个。可以指定任意数量的表达式，它们将用布尔「或」连接来获取查询结果。表达 a, b, c... 既可以是数字，也可以是字符
NOT IN (a; b; c...) | NOT IN (a, b, c...) | 不包含 a, b, c... | ... 该字段不含指定的表达式 a, b, c,...
= TRUE | = TRUE | 值为 True | ...该字段名称值为 True。
= FALSE | = FALSE | 有值 false | ... 字段数据值已设为 false。

### 示例

='Ms.' | 返回带有字段内容 "Ms." 的字段。
<'2001-01-10' | 返回2001年1月10日之前的日期
LIKE 'g?ve' | 返回字段内容含有「give」与「gave」的记录。
LIKE 'S*' | 返回字段内容为「Sun」的记录。
BETWEEN 10 AND 20 | 返回字段内容在 10 到 20 之间的数值的记录。 (既可以是文本字段也可以是数字字段。)。
IN (1; 3; 5; 7) | 返回数值为 1、3、5、7 的记录。如果数据字段包含一个项目编号，则可以创建查询，找出带有指定编号的特定项目。
NOT IN ('Smith') | 返回不包含「Smith」的记录。

「Like」转义序列: {escape '转义字符'}

示例: select * from Item where ItemName like 'The *%' {escape '*'}

该示例得到所有 ItemName 以「The *」开头的条目。这意味着通常被解释为占位符的字符也可以用于搜索，如「*」「?」「_」「%」「.」等。

「Outer Join」转义序列: {oj 外部连接}

示例: select Article.* from {oj item LEFT OUTER JOIN orders ON item.no=orders.ANR}

### 查询文字字段

为了查询文本字段的内容，必须将表达式设置在单引号内。是否区分大小写取决于使用的数据库。按照定义，「LIKE」区分大小写 (尽管一些数据库并不严格区分。)。

### 查询日期字段

「日期字段」以「#Date#」的形式表示，明确声明自己是日期。条件中使用的日期、时间以及日期/时间常量 (字面值) 可以使用「SQL 转义语法」类型，也可以使用默认的 SQL2 语法。

数据类型元素 | SQL 转义语法 #1 - 可能已过时 | SQL 转义语法 #2 | SQL2 语法
日期 | {D'YYYY-MM-DD'} | {d 'YYYY-MM-DD'} | 'YYYY-MM-DD'
时间 | {D'HH:MM:SS'} | {t 'HH:MI:SS[.SS]'} | 'HH:MI:SS[.SS]'
日期时间 | {D'YYYY-MM-DD HH:MM:SS'} | {ts 'YYYY-MM-DD HH:MI:SS[.SS]'} | 'YYYY-MM-DD HH:MI:SS[.SS]'

示例: select {d '1999-12-31'} from world.years

示例: select * from mytable where years='1999-12-31'

所有日期表达式 (日期常量) 必须用单引号括起来。 (详情请参阅您使用的特定数据库及连接器的参考手册。)

### 查询「是/否」字段

要查询「是/否」字段，请在 dBASE 表中使用下列语法:

状态 | 查询条件 | 示例
是 | 对于 dBASE 表格: 不等于任何给定的值 | =1 返回所有「是/否」字段状态为「是」或「至」的记录 (黑色标记)。
否 | . | =0 返回所有「是/否」字段状态为「否」或「关闭」的记录 (无选择)。
Null | IS NULL | IS NULL 返回所有是/否字段无「是」或「否」这两种状态的记录 (灰色标记)。

所用的语法取决于使用的数据库系统。同时还需要注意，「是/否」字段的定义可能会有所不同 (仅有 2 种状态，而不是 3 种)。

### 参数查询

参数查询允许用户在运行时输入值。这些值用在条件中，用于选择要显示的记录。此类的每个值都有参数名称与之关联，用于提示用户查询正在执行。

在「设计」视图以及「SQL」视图中，参数名称均有冒号前缀。名称用在值可以出现的地方。如果相同值在查询中出现多次，可使用相同的参数名称。

最简单的情况，当用户输入用于比较的值时，参数名称及其冒号前缀可直接在「条件」行输入。在「SQL 模式」下，应这样输入:「WHERE "字段" = :参数名称」

参数名称不能包含这些字符「<space>`!"$%^*()+={}[]@'~#<>?/,」。也不能与字段名称或 SQL 保留字相同。可以与别名相同。

用于根据文字字段内容的一部分构造选择条件时，可以这样「"LIKE '%' || :字段部分 || '%'"」将隐藏列作为条件添加。这将选择精确匹配的记录。如果需要大小写不敏感的测试，一种解决方案是用「LOWER (字段名称) 作为字段，用「LIKE LOWER ( '%' || :字段部分 || '%' )」作为条件。注意条件中的空格很重要; 如果省略，SQL 解析器将把整个条件作为待匹配的字符串来解析。「SQL 模式」下应这样输入: LOWER ( "字段名称" ) LIKE LOWER ( '%' || :字段部分 || '%' )」。

参数查询可用作「子表单」的数据源，以便用户限制显示的记录。

### 输入参数值

「参数输入」对话框会要求用户输入参数值。输入每个查询参数的值，然后点击「确定」或按「回车」键确认。

用户输入的值可由 SQL 相关条件允许的任意字符构成; 具体取决于底层数据库系统。

用户可以使用 SQL 通配符「%」 (任意字符串) 或「_」 (任意单个字符) 作为值的一部分，以便用更复杂的条件检索记录。

## SQL 模式

SQL 意为 "Structured Query Language" (结构化查询语言)，描述用于查询、更新和管理关系数据库的指令。

由于不用输入 SQL 代码，因此对 LibreOffice 中的大多数查询而言您并不需要了解 SQL。当您在「查询设计」中创建查询后，LibreOffice 会自动将指令转换成对应的 SQL 语法。如果使用「设计视图打开/关闭」按钮切换至 SQL 视图，则可看到已建立查询的 SQL 命令。

您可以直接用 SQL 代码构建查询语句。但要注意，特殊语法由您使用的数据库系统决定。

如果手动输入 SQL 代码，您可以创建 SQL 特有的查询语句。「查询设计」中的图形界面不支持该类查询。必须在原生 SQL 模式中执行此类查询。

在 SQL 视图中点击「直接运行 SQL 指令」图标，可以建立不由 LibreOffice 处理的查询，并直接发送给数据库引擎。