SQL查询导出示例
要开始开发使用SQL查询导出的SQL查询,您需要熟悉基本的SQL查询语法。以下概念是编写关系维度模型的基本查询的关键:
- 基本的SQL语法,包括:
- 连接,特别是自然连接(很少需要使用外部连接)
- GROUP BY表达式,内置聚合,如MIN, MAX, COUNT等。
- PostgreSQL 9.0 SQL语法,如果您需要非标准的SQL语法
- PostgreSQL函数和操作符(用于转换和格式化数据,特别是数字和日期输出)
- 基本的维度建模和数据仓库概念,Kimball Group dimension modeling Techniques页面是一个很好的资源
第一步
如果您完成以下步骤,您就可以最好地使用报告数据模型。
第一步:阅读手册
是的,有文件记录。是的,你需要阅读它。构建SQL查询导出的报表数据模型通过一组关系表和函数提供了应用程序编程接口(API)。因此,该模型中的事实和维度具有定义良好的关于其名称、数据类型和关系的文档。打开产品内帮助链接或相关主题在这里.文档分为四个部分:
- 介绍—提供了维度建模、术语、数据类型的基本概述,并快速入门编写SQL查询。
- 事实——为维度模型中公开的所有事实提供API,包括每个列的名称和类型,并为每个事实表提供图形化的星型/雪花型维度模式
- Dimensions -为维度模型中暴露的所有维度提供API,
- 函数——为几个辅助函数提供API,这些辅助函数对于编写更复杂的查询非常有用,特别是历史查询和趋势查询。
步骤2:运行示例查询
产品中内置了几个示例查询。尝试使用其中一个示例运行一个报告,以熟悉流程。然后获取一个查询并尝试自定义它。
步骤3:写下你的第一个查询
最后,跳进去。最好的学习方法是实践。
最佳实践
以下是在编写SQL查询时要记住的一些简单的最佳实践和设计技巧:
自然连接
在编写查询时,通常只需要使用自然join。在极少数情况下,可能需要左、右或外连接,但通常情况不是这样。在执行JOIN时,您将注意到JOIN应该始终使用相同的列名。所有应该联接的主键和外键具有相同的列名。这有助于发现简单的连接错误,即您不小心将一个列从一个表连接到另一个表,但实际上连接与连接没有关系(SQL不会阻止您这样做)。这也使得using关键字的使用变得简单和容易。
使用关键字
PostgreSQL支持USING表达式,强烈推荐使用。这种简单的JOIN表示法将简化查询,并使查询更具可读性。我们的示例将使用它们,所以我们建议您的查询也使用它们。
别名
对列名使用清晰、详细和可读的别名。这不仅使CSV中的输出更加清晰,而且还有助于SQL设计人员了解输出应该是什么。例如,如果输出包含资产名称和站点名称列,则不要两次使用“name”别名。相反,更喜欢像“site_name”和“asset_name”这样的名称来区分它们。当别名表名时,我们倾向于使用每个表名的首字母。所以fact_asset_vulnerability_finding
是别名favf
.你可以随意使用你自己的风格,但它应该是清晰和容易阅读的。
风格
你会注意到我们的例子使用了我们认为清晰易读的风格。这包括缩进和大写SQL关键字。使用这样的样式确实有助于提高可读性,特别是对于具有嵌套和子选择的更复杂的查询。
与表情
WITH表达式还可以用来增强样式。对于特别复杂和长的查询,可以使用WITH表达式将大型查询划分为更小的、更有逻辑的、具有明确名称的部分。在某些情况下,如果同一个表被多次引用,还可以使用WITH表达式来优化查询的性能。
构建自底向上
我们强烈建议您以小迭代的方式构建查询。通常在维度模型中,您将从事实表开始。这通常会回答一个业务问题(例如,我的站点有什么漏洞?)从这里开始,首先尝试格式化、操作和翻译您的数字数据。然后转到维度数据。根据需要逐个连接维度表,并根据需要添加过滤、分组和排序。
性能
使用所有资产的范围构建查询可能会非常耗时且效率低下。除非指定范围筛选器,否则查询将针对您有权限访问的所有资产运行。在构建查询时,使用报告配置中的范围过滤器来减少结果的大小,以便在开发和测试周期中快速响应。以下是基本步骤:
- 创建一个新的报告配置
- 选择测试范围的子集(单个站点、资产或资产组—越小越好)
- 编辑、预览和保存您的查询内容
- 将范围修改为最终首选项
- 保存报告并运行它
SQL查询导出报告
使用SQL查询导出报告功能,您可以直接针对Security Console数据库运行SQL查询,然后将结果输出到CSV文件。