4.2 使用SOQL查询数据(参考SOQL and SOSL Queries)
SOQL (Salesforce Object Query Language) 是专门用于查询 Salesforce 平台上存储的数据的语言。与其他查询语言(例如 SQL)相比,SOQL 是为了满足 Salesforce 的特殊环境和结构而设计的。
4.2.1 SOQL的结构与语法
基本结构:
SOQL 的基本结构是:
SELECT field1, field2,... FROM ObjectType WHERE conditions ORDER BY field ASC/DESC LIMIT n
SELECT: 指定您希望查询的字段。可以是单个字段,多个字段或对象的所有字段(使用*)。
FROM: 指定要查询的对象类型。
WHERE: 可选条件来过滤查询结果。
ORDER BY: 可选地对结果进行排序。
LIMIT: 可选地限制返回的记录数量。
示例:
SELECT Name, Age__c FROM Contact WHERE Age__c > 30 ORDER BY Name DESC LIMIT 10
这将查询名字和年龄字段,只获取年龄大于30的联系人,并按名字降序排列,最多返回10条记录。
4.2.2 使用WHERE条件过滤
WHERE 子句允许您指定过滤条件,以便查询返回您感兴趣的特定记录。
常用比较运算符:
=: 等于
!=: 不等于
<: 小于
<=: 小于或等于
>: 大于
>=: 大于或等于
LIKE: 模式匹配
IN: 值在指定的列表中
示例:
SELECT Name FROM Account WHERE Industry = 'Banking' AND AnnualRevenue > 1000000
此查询将返回银行行业且年收入超过100万的所有帐户的名称。
4.2.3 聚合查询和GROUP BY
在SOQL中,您还可以执行聚合查询,这可以帮助您汇总数据,例如计算平均值、总和、最大值和最小值。
常用的聚合函数:
COUNT(): 计数记录数
SUM(field): 求字段的总和
AVG(field): 计算字段的平均值
MAX(field): 获取字段的最大值
MIN(field): 获取字段的最小值
与聚合查询一起使用的GROUP BY子句允许您根据特定字段的值对查询结果进行分组。
示例:
SELECT Industry, COUNT(Id), AVG(AnnualRevenue) FROM Account GROUP BY Industry
此查询按行业分组帐户,返回每个行业的帐户数和年收入的平均值。
4.2.4 使用子查询
在SOQL中,子查询允许您查询一个对象,并基于与其相关的另一个对象的记录获取信息。这在Salesforce中是可能的,因为其数据模型具有许多内置的关系。
示例:
SELECT Name, (SELECT LastName FROM Contacts) FROM Account
这个查询返回每个帐户的名称和与之关联的所有联系人的姓氏。
4.2.5 使用关系查询
在Salesforce中,数据模型具有很多内置的关系,这些关系可以在SOQL查询中使用。使用“__r”后缀可以查询父对象的字段,这对于Master-Detail和Lookup关系都很有用。
示例:
SELECT Name, Account.Name FROM Contact WHERE Account.Industry = 'Banking'
这个查询返回在银行行业的帐户中的联系人的名称及其关联帐户的名称。
4.2.6 使用逻辑运算符
SOQL支持常见的逻辑运算符,如AND、OR和NOT,以帮助您构建复杂的查询条件。
示例:
SELECT Name FROM Account WHERE Industry = 'Banking' OR (AnnualRevenue > 1000000 AND NumberOfEmployees < 200)
这个查询返回行业为银行或年收入超过100万且员工数少于200的帐户的名称。
4.2.7 限制和排序结果
使用ORDER BY子句可以按照指定的字段对查询结果进行排序。此外,使用LIMIT子句可以限制返回的记录数量。
示例:
SELECT Name, AnnualRevenue FROM Account ORDER BY AnnualRevenue DESC LIMIT 5
这个查询返回年收入最高的前五个帐户的名称和年收入。
4.2.8 使用 OFFSET
OFFSET 子句用于跳过指定数量的记录,并从下一个记录开始返回查询结果。这对于分页非常有用。
示例:
SELECT Name FROM Account ORDER BY CreatedDate DESC LIMIT 10 OFFSET 20
这个查询将跳过最新的20个帐户,并返回接下来的10个帐户的名称。
4.2.9 使用日期函数
SOQL支持多种日期函数,如 YESTERDAY、TODAY 和 LAST_N_DAYS: n,它们可以帮助您根据日期范围进行查询。
示例:
SELECT Name, CreatedDate FROM Account WHERE CreatedDate = YESTERDAY
这个查询返回在昨天创建的所有帐户的名称和创建日期。
4.2.10 查询多态字段
在Salesforce中,有些字段是多态的,意味着它们可以引用多个不同类型的对象。一个常见的例子是WhoId字段,它可以引用Contact或Lead对象。使用TYPEOF关键字可以在这些字段上进行查询。
示例:
SELECT TYPEOF What
WHEN Account THEN Name, AnnualRevenue
WHEN Opportunity THEN Name, CloseDate
END
FROM Event
这个查询返回活动关联的Account或Opportunity的信息,具体取决于What字段的引用类型。
4.2.11 使用绑定变量
在Apex中,可以使用绑定变量在SOQL查询中引用变量的值。这可以使您的代码更加动态和灵活。
示例:
String myIndustry = 'Banking';
List<Account> accounts = [SELECT Name FROM Account WHERE Industry = :myIndustry];
此查询返回行业与Apex中定义的myIndustry变量值匹配的帐户的名称。
4.2.12 关联子查询
在SOQL中,您可以在查询中执行关联子查询来获取与主查询对象相关的子对象的记录。这是通过使用子对象的关系名称执行的。
示例:
SELECT Name, (SELECT LastName FROM Contacts) FROM Account
此查询会返回所有帐户及其关联的联系人的姓氏。
4.2.13 查询子集
要限制返回的字段,只需在SELECT语句中列出您想要的字段即可。
示例:
SELECT Name, Industry FROM Account WHERE AnnualRevenue > 5000000
此查询将返回年收入超过500万的帐户的名称和行业。
4.2.14 使用 NOT 和 NULL
在SOQL查询中,您可以使用NOT和NULL来查询没有特定值的记录或字段值为null的记录。
示例:
SELECT Name FROM Account WHERE Industry NOT IN ('Banking', 'Insurance') AND BillingCity IS NULL
此查询返回行业不是银行或保险,并且计费城市为null的帐户的名称。