# 使用 Direct Query 直接访问云数据库

使用 Direct Query 读取 SQL 数据库，而无需将数据导入或加载到内存中。

Direct Query 为用户提供了更多关于如何访问其数据的选项，以满足其个人需求。通过 Direct Query 访问数据允许用户将数据保留在其底层数据源中。这提高了用户与其数据交互的速度，以换取内存中 Qlik Cloud 应用程序提供的灵活性。

通常，建议您尽可能将数据导入到 Qlik Cloud 中。内存中的 Qlik Cloud 应用程序允许您更好地自定义体验并充分利用您的数据。但是，如果您发现自己处于无法通过导入数据来实现目标的情况，Direct Query 可能是您的解决方案。由于其简化的功能，Direct Query 应用程序还可以帮助新用户迈出创建功能齐全且快速的内存中应用程序的第一步。

您可以使用 数据模型管理器 创建您的 Direct Query 应用程序，以帮助选择表和字段，并定义它们之间的关系。有关更多信息，请参阅 [创建 Direct Query 应用程序](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/DirectQuery/create-direct-query-app.htm)。

您还可以在加载脚本中使用自定义 SQL 来为您的 Direct Query 应用程序定义数据模型。这允许您在构建数据模型时使用变量和 Qlik 表达式。有关更多信息，请参阅 [使用自定义 SQL 创建 Direct Query 应用程序](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/DirectQuery/create-data-model-custom-sql.htm)。

## Direct Query 用例示例

在以下情况下，您可能会考虑使用 Direct Query 而不是内存中应用程序：

Direct QueryDirect Query 用例

| 用例 | 目的和描述 |
| --- | --- |
| 大数据源 | 对于超过 2000 万行的应用程序，Direct Query 的初始化速度更快，资源消耗更少。当您的应用程序主要用于监控或状态报告，且仅进行少量或不进行选择时，这可能非常有用。 |
| 高效的内存中应用程序 | Direct Query 提供了将数据切片快速轻松地提取到 Qlik Cloud 引擎中的功能，并在所有受影响的表上应用过滤。有关更多信息，请参阅 [将 Direct Query 应用程序设置导出到模板应用程序](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/DirectQuery/export-to-template-app-direct-query.htm) |
| 用于回写的 Direct Query | 当设置基于 Qlik Automate 的回写以修改底层数据库数据时，Direct Query 可以直接显示修改后的数据库结果。内存中应用程序中的相同功能将要求用户再次导入修改后的表。 |
| 探索新的数据库和表 | Direct Query 可用于探索新的或不熟悉的数据库和表。这允许用户就是否需要从底层数据源导入数据做出明智的决定。 |

## 教程

有关如何使用 Qlik Sense 应用程序的教程，请参阅 [教程 - 以基础知识开始](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Tutorials/introduction-beginning-with-basics.htm)。

有关 Direct Query 的教程，请参阅以下内容：

* [Direct Query - 第 1 部分：概述和操作](https://www.youtube.com/watch?v=ZiTgqYvFFho)

* [Direct Query - 第 2 部分：使用按需应用程序生成 (ODAG) 的混合分析解决方案](https://www.youtube.com/watch?v=15uIcFY6DJc)

信息注释Qlik Cloud 中的 Direct Query 功能不同于 QlikView 中的 Direct Query 语句。有关更多信息，请参阅 [Direct Query。](https://help.qlik.com/zh-CN/qlikview/May2022/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptRegularStatements/direct-query.htm)

## 支持的功能

与内存中应用程序相比，Direct Query 应用程序具有不同的功能。

Direct Query 支持以下内容：

* 数据连接类型：

  信息注释无法在 Direct Query 中使用 Qlik 数据网关 - 直接访问 数据连接。

  * Amazon Redshift

  * Azure SQL

  * Azure Synapse Analytics

  * Databricks

  * Google BigQuery

  * Microsoft SQL Server

  * PostgreSQL

  * Snowflake

    信息注释数据连接中支持标量函数的子集。

* 内存中数据分析仿真：

  * 集合分析的子集。

  * 任意复杂模型上的多表图表。内存中应用程序的现有模型要求仍然有效。例如，不允许表之间的关联循环。

  * 基本聚合类型：

    * Sum

    * Count

    * Min

    * Max

    * Avg

    * Only

  * 基于底层数据库提供的函数和操作集的聚合前和聚合后计算。

* 表关系类型：

  * 内部联接

  * 完全外部联接

* 迭代建模和仪表板创建。

* 可视化功能：

  * 标准图表：

    * 条形图

    * 子弹图

    * 按钮

    * 组合图

    * 容器

    * 筛选器窗格

    * 仪表图

    * KPI

    * 折线图

    * 地图

    * 玛丽麦高图

    * 饼图

    * 散点图

    * 表格

    * 文本和图像

    * 瀑布图

  * 仪表板捆绑：

    * 视频播放器

    * 变量输入

  * 可视化捆绑：

    * 漏斗图

    * 多 KPI

    * 雷达图

    * 桑基图

    * 词云

* 字段搜索功能的子集：

  * 没有特殊符号的搜索字符串（例如，用于模式搜索的“\*”和“?”，或用于基于表达式的搜索的“=”）被解释为对完整字符串值的按前缀搜索。

  * 模式搜索符号和功能：

    * “\*” - 任意 0 个或多个符号

    * “?” - 任意单个符号

  * 基于范围的搜索（基于“&gt;”、“&lt;”、“&gt;=”、“&lt;=”）：

    * 对于数值，下限/上限是根据数值检测的。例如，&gt;10&lt;100 等效于 &lt;100&gt;10。两者都被解释为 [SearchedField] &gt; 10 AND [SearchedField] &lt; 100。

    * 对于其他数据类型，下限/上限是通过它们在搜索条件中的顺序来检测的。例如，&gt;Value1&lt;Value2 与 &lt;Value2&gt;Value1 不同。在第二种情况下，假定 Value2 对应于下限，并将被解释为 [SearchedField] &lt; Value2 OR [SearchedField] &gt; Value1。

  * 基于表达式的搜索，假设表达式满足 Direct Query 限制。

  信息注释有关内存中搜索功能的完整列表，请参阅 [在选择或可视化中搜索](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/Selections/SelectionsToolbar/search-selections.htm)。

* $(=...) 表达式中的 Qlik 引擎函数。

  在 Direct Query 中的 KPI 或自定义 SQL 表达式中，可以使用以下 Qlik 脚本和图表函数：

  * [**GetUserAttr**](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/SystemFunctions/GetUserAttr.htm)

  * [**if**](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ConditionalFunctions/if.htm)

  * [**Chr**](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/StringFunctions/Chr.htm)

  * [**Replace**](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/StringFunctions/Replace.htm)

  * 字面量和字符串运算符

  使用上述一个或多个选项的表达式将专门在 Qlik 引擎中展开。

  信息注释不支持在同一个 $(=...) 表达式中混合使用远程原生 SQL 函数和 Qlik 引擎函数。

  要结合使用 Qlik 引擎函数和远程 SQL 数据库函数（可选包括 + 集合/选择），请使用嵌套的 $(=...) 表达式：

  `$(= ...<EngineFuncs> ... $(=... <set/selection &| Native SQL funcs>) ... )`

  例如：

  `'$(=Replace(GetUserAttr('userEmail'), '$(=Char(111))' , Chr(48)))'`

  在上述嵌套表达式示例中，Replace()、GetUserAttr() 和 Chr() 函数是 Qlik 引擎函数，并包含在最外层的 $(=…) 表达式中。然而，嵌套的 $(=Char(111)) 表达式并未引用引擎函数。它是一个远程 SQL 数据库函数（例如，在 MS SQL 中）。

  假设用户在 Qlik Cloud 中的电子邮件是 'root@qlik.com'，那么上述表达式的展开顺序如下：

  1. 通过远程 SQL 数据库展开 $(=CHAR(111)) 非引擎函数，结果为小写字母 o。

  2. 将 CHR(48) 引擎函数展开为字符 "0'。

  3. 将 GetUserAttr('userEmail') 展开为 'root@qlik.com'。

  4. 最后展开 ‘$(=Replace('root@qlik.com', ‘o' , ‘0’)’，最终结果为 'r00t@qlik.com'。

* [Direct Query 限制](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/DirectQuery/limitations-direct-query.htm)
* [在 Direct Query 应用程序中创建 ODAG 链接](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/DirectQuery/create-odag-links-direct-query.htm)
* [支持的数据类型](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/DirectQuery/data_type_direct_query.htm)