SOQL是支持我们与Salesforce数据库交互的查询语言。开发人员在编写Apex时通常会使用到SOQL,此外,它还允许管理员和开发人员从组织内部检索数据并在导出结果时生成强大的数据报告。
SOQL 查询对于编写代码的开发人员,以及通过使用子句扩展查询功能的管理员来说都是一个强大的工具,可以将一些复杂的数据操作转变为一项简单的任务。
虽然大多数开发人员对如何执行查询有基本的了解,但SOQL可以做的不仅仅是从数据库中检索记录。本篇文章将探讨SOQL查询的构成,以及如何将查询提升到一个新水平。
什么是查询(Query)?
查询的基本语法看起来相对简单,SELECT语句中有几个字段,就有了一个基本查询。我们可以将查询分解为不同的块(通常称为子句),这些块定义应该检索哪些数据,以及应该如何格式化数据。
所有查询都包含一个SELECT子句,这是查询的一部分,用于确定要返回的字段,后面跟着FROM关键字,说明被查询的对象。
WHERE子句
通过提供可以使用AND或OR运算符组合的逻辑运算符,用于筛选出要返回的记录。
TYPEOF子句
用于在引用多态查找时提供要选择的字段,例如查询与特定对象相关的任务。
WITH子句
用于指定附加查询行为;这可能是通过WITH SECURITY_ENFORCED强制执行字段级权限,或者在查询问题时指定数据类别。
ORDER BY 子句
以特定的方式对查询结果进行排序。
GROUP BY 子句
这个子句彻底改变了查询的行为。GROUP BY查询不是返回单个记录作为结果,而是将查询更改为聚合查询,返回基于集合数据集而不是单个行的数据。
关系查询(Relational Queries)
SOQL的另一个强大功能是能够跨越查询中的关系。例如,检索父帐户的名称,检索与某个帐户相关的联系人。
关系查询主要有以下两种类型:
子对父(Child to Parent)
当我们查询子对象时,它们沿着关系树上升,引用父对象的字段。
这些可以上升5个级别,引用祖父、曾祖父等的字段。
这些类型的关系是通过点符号来访问的,关键是要记住它使用的是关系名,对于自定义的关系,关系名称是以__r 结尾。
父对子(Parent to Child)
它们沿着关系树向下,引用作为查询记录子对象的记录和字段。
这些查询只能向下一级。也就是说,可以查询一个帐户的联系人,但不能查询与这些联系人相关的记录。
这些是通过SELECT子句中的子查询编写的,FROM是关系名称(例如Contacts或 My_Custom_Objects__r)。
聚合查询(Aggregate Queries)
聚合查询可以把大量复杂的数据集压缩成几行,为你提供所需的准确数据。
根据具体用例,可以使用以下聚合函数:
COUNT() / COUNT(fieldName):计算查询返回的行数。通常与Id字段或其他查找一起使用。
COUNT_DISTINCT(fieldName) :计算查询的唯一非空值的数量。
AVG(fieldName) :根据查询返回的行返回字段的平均值。
MIN(fieldName) :根据查询返回字段的最小值。可以在选项列表中使用,根据选项列表排序顺序返回。
MAX(fieldName) :根据查询返回字段的最大值。可以在选项列表中使用,根据选项列表排序顺序返回。
SUM(fieldName) :根据查询结果返回字段的数字总和。
GROUP BY子句还有两个兄弟子句,可以进一步增强查询能力,同时通过返回各种小计,提供与标准GROUP BY子句相同的数据。
初级开发动手实操
GROUP BY ROLLUP
与多个字段聚合一起使用(例如,计算各阶段的业务机会数量并合计其总额)。
采用聚合查询,并返回每个类别的小计。
包括每个字段组合的分类汇总行。
有最终总计行。
上面的查询将返回以下内容:
GROUP BY CUBE
与多个字段聚合一起使用(例如,计算各阶段的业务机会数量并合计其总额)。
为我们提供分组字段的所有组合的聚合。
包含比GROUP BY ROLLUP更多的信息。
字段排序无关紧要。
用于生成交叉表格报告。
上面的查询将返回以下内容:
通过使用HAVING子句可以进一步筛选这些查询。例如,假设有一个用特定关键字标记联系人的对象,我们希望找到标签为“United Kingdom”、“Salesforce Developer”和“Available”的所有联系人,可以使用以下查询来准确地找到这些联系人。
HAVING子句也可以附加到GROUP BY ROLLUP和GROUP BY CUBE查询中,以进一步自定义返回的确切结果。
Limits和Limitations
SOQL也有自己的限制。对于SOQL查询,这些限制可以根据运行查询的上下文而改变,以下是它的通用限制:
100k字符限制:整个查询(包括所有子句)的长度必须少于100k个字符。
WHERE子句中的字符串限制为4000个字符。这是针对单个字符串,而不是整个WHERE子句。
不超过55个子对父关系。
不超过20个父对子关系。
父对子关系只能在FROM子句中的对象上执行。
可能会在Apex中使用SOQL,Apex对如何使用SOQL有更多限制:
同步进程中最多100个查询
异步进程中最多200个查询
每个进程最多返回50000行
注意:聚合查询也计入此限制,但它们的使用量计算方式不同。查询返回的每1行都计为1行,不管数据是否是从几个记录中聚合的。例如,如果以下查询返回7行“ SELECT COUNT(Id), AccountId FROM Contact GROUP BY AccountId ”,不管统计的联系人数量如何,它只会消耗此限制中的7行。
网友评论