---
order: 4
---
# SQL查询

SQL查询可以执行SQL语句，语法和数据库语法一致。当需要自定义SQL查询数据，或者已有加工模型的SQL逻辑需要进行执行验证时，可以不用转换成加工而直接使用SQL查询实现。

\[\[toc]]

## 新建SQL查询{#new-sql}

点击顶部导航栏的**数据**，左上角点击**新建**>**SQL查询**，即可打开SQL查询界面。其中默认查询的数据源是**项目设置**>**数据**中设置的**默认数据库**（参考文档：[项目数据管理设置](../devops/project-manage/data-mgr-setting.md/#default))。
![新建SQL查询](./images/2020-04-22-12-30-12.png)

除此之外，系统支持以下2种不同的新建SQL查询入口：

1. 使用连接的数据源进行SQL查询
2. 在数据加工过程中进行SQL查询

### 使用连接的数据源进行SQL查询{#datasources-sql}

1. 当用户有数据源的查看权限时，可以直接选中数据源来查询该数据源下所有的物理表数据。点击切换到**数据源列表**，选择对应的数据源，右键菜单中选择**新建SQL查询**，默认查询的数据源为选择的列表中的数据源。
   ![数据源列表查询](./images/2020-04-12-12-12-30.gif)

2. 也可以选中物理表进行快速查询。在数据源列表下方的物理表列表中，选择一张物理表，右键菜单中选择**新建查询**，默认查询的数据源是选择的物理表所在的数据源，同时，SQL编辑区域中会自动带上查询语句。
   ![快速查询](./images/2020-04-12-13-12-30.gif)

### 在数据加工过程中进行SQL查询{#data-process-sql}

在制作数据加工过程中，或者已有的数据加工模型中的某个组件，想要通过SQL查询去验证数据是否正确时，可以切换到**SQL面板**，然后点击工具栏中的**SQL查询**，会切换到SQL查询的标签页，并且组件的SQL语句会自动复制到SQL查询标签页的编辑区域。
![数据加工SQL查询](./images/2020-04-12-14-12-30.gif)

::: tip 提示
新建的SQL查询不会自动查询数据，只有点击**执行**按钮后才会进行查询。若SQL查询并未保存，查询出的数据无法进行任何操作；保存为SQL模型后，可以右键点击字段进行重命名、字段类型转换或设置主键等操作，但无法对字段进行排序和拖拽移动。
:::

## 保存模型{#save-model}

点击保存按钮，即可将SQL查询保存为数据模型，操作和数据加工输出模型操作一致，可以参考文档：[输出加工结果](../data-process/data-output/README.md)。保存后的模型可以进行模型管理，可以参考文档：[模型管理](./model/README.md)。

## 界面操作介绍{#operate}

新建的SQL查询页签上方提供了SQL查询中需要用到的按钮，来实现SQL执行、中止等功能。

- 格式化：将输入的SQL语句按照标准的格式显示。
- 执行：支持**部分语句执行**和**全部语句执行**两种执行方式。
  - 部分语句执行：鼠标选中需要执行的部分语句，点击**执行**按钮。
  - 全部语句执行：直接点击**执行**按钮，或者全选所有语句，再点击**执行**按钮。
- 中止：在SQL语句执行过程中，查询耗时较长时，可以点击**中止**按钮，停止执行；如果有update、insert或者delete语句时，中止后，数据会回滚，与数据库操作一致。
- 切换数据源：当需要查询的物理表路径与页签左上角面包屑路径不一致时，可以通过点击页签左上角的面包屑来切换对应的数据源和数据库在查询的表名前面加上数据源名称前缀。
  ![切换数据源](./images/2020-04-22-12-20-12.png)

:::tip 提示
新建的SQL查询，查询物理表所在的数据源只有与页签左上角的面包屑路径一致时，才能查询出数据，否则会提示查询的物理表不存在。
:::

### 将查询结果复制到目标数据库表中{#copy-data-to}

将SQL查询保存为数据模型后，会在SQL查询页签上方增加**复制到**按钮，点击**复制到**按钮可以将查询到的数据复制到数据库表中，复制分为以下两种情况：

1. 目标数据表不存在，直接创建新的数据库表。
2. 目标数据表已存在，则会提示表已存在并需要进行冲突处理，可以在对话框中修改数据库表名；也可以在**处理方式**中选择**创建新表**、**覆盖同名表**、**清空同名表数据并插入数据**或**追加数据到同名表**四种处理方式进行处理。
   - **创建新表**：查询到的数据将重新创建一张新表，名称自动重命名为同名表，并在重命名的表尾部加入后缀1，默认为该选项。
   - **覆盖同名表**：删除已存在的表，然后重新新建一张数据库表。
   - **清空同名表数据并插入数据**：清空已存在的表数据，再重新写入查询到的表数据，如果查询的数据库表字段比目标表多或名称不符，则会出现错误提示。
   - **追加数据到同名表**：直接在数据库表中追加查询到的数据，如果查询的数据库表字段比目标表多或者名称不符，则会出现错误提示。

![复制到目标数据库表](./images/2021-10-22-14-30.png)

### 执行危险SQL{#dangerous-sql}

在SQL查询时有时候也会执行`update`、`delete`、`drop`等修改数据或表结构的危险SQL，一旦执行错误，可能会导致业务应用报错或者数据丢失。因此在执行下列危险SQL前会弹出警告对话框进行提示确认，确认无误后才会执行操作。

1. 执行`update`和`delete`命令时没带where条件。
2. 使用`truncate`命令删除表数据。
3. 使用`drop`命令删除数据库表。
4. 对数据库表进行重命名。
5. 修改数据库表结构，如增加、删除、修改字段属性等。
   ![多条危险SQL](./images/2021-12-24-15-46.png)

## SQL查询中使用参数{#sql-parameter}

SQL查询除了基本的查询语句，还支持传递动态参数，如接收来自仪表板或者报表中定义的参数，用于sql查询的输入参数。在SQL语句中，用`${参数名}`来引用定义好的参数（定义动态参数可参考文档：[设置动态加工参数](../data-process/setting-params.md)）。

## SQL查询和数据加工中SQL组件的区别{#difference}

1. sql查询通常是一个select语句，用于查询数据，查询的结果可以保存为数据模型。如果sql中包含insert，update，createtable等语句时，系统会提示不能保存，只能作为一个临时查询操作。
2. 数据加工的SQL组件，一般作为加工的输入表组件，是加工的一部分，可能有insert、update、createtable等语句。
