mirror of
https://github.com/forcedotcom/afv-library.git
synced 2026-07-30 11:43:26 +08:00
228 lines
6.4 KiB
Markdown
228 lines
6.4 KiB
Markdown
<!-- Parent: platform-soql-query/SKILL.md -->
|
|
# SOQL Quick Reference
|
|
|
|
## Query Structure
|
|
|
|
```sql
|
|
SELECT fields
|
|
FROM object
|
|
[WHERE conditions]
|
|
[WITH filter]
|
|
[GROUP BY fields]
|
|
[HAVING conditions]
|
|
[ORDER BY fields [ASC|DESC] [NULLS FIRST|LAST]]
|
|
[LIMIT number]
|
|
[OFFSET number]
|
|
[FOR UPDATE]
|
|
```
|
|
|
|
---
|
|
|
|
## Operators
|
|
|
|
### Comparison Operators
|
|
|
|
| Operator | Description | Example |
|
|
|----------|-------------|---------|
|
|
| `=` | Equal | `Name = 'Acme'` |
|
|
| `!=` | Not equal | `Status != 'Closed'` |
|
|
| `<` | Less than | `Amount < 1000` |
|
|
| `<=` | Less than or equal | `Amount <= 1000` |
|
|
| `>` | Greater than | `Amount > 1000` |
|
|
| `>=` | Greater than or equal | `Amount >= 1000` |
|
|
| `LIKE` | Pattern match | `Name LIKE 'Acme%'` |
|
|
| `IN` | In list | `Status IN ('New', 'Open')` |
|
|
| `NOT IN` | Not in list | `Type NOT IN ('Other')` |
|
|
| `INCLUDES` | Multi-select contains | `Skills__c INCLUDES ('Java')` |
|
|
| `EXCLUDES` | Multi-select excludes | `Skills__c EXCLUDES ('Java')` |
|
|
|
|
### Logical Operators
|
|
|
|
| Operator | Description | Example |
|
|
|----------|-------------|---------|
|
|
| `AND` | Both conditions | `A = 1 AND B = 2` |
|
|
| `OR` | Either condition | `A = 1 OR B = 2` |
|
|
| `NOT` | Negate condition | `NOT (A = 1)` |
|
|
|
|
### LIKE Patterns
|
|
|
|
| Pattern | Matches |
|
|
|---------|---------|
|
|
| `'Acme%'` | Starts with "Acme" |
|
|
| `'%Corp'` | Ends with "Corp" |
|
|
| `'%test%'` | Contains "test" |
|
|
| `'A_me'` | "A" + any char + "me" |
|
|
|
|
---
|
|
|
|
## Date Literals
|
|
|
|
### Relative Dates
|
|
|
|
| Literal | Description |
|
|
|---------|-------------|
|
|
| `TODAY` | Current day |
|
|
| `YESTERDAY` | Previous day |
|
|
| `TOMORROW` | Next day |
|
|
| `THIS_WEEK` | Current week (Sun-Sat) |
|
|
| `LAST_WEEK` | Previous week |
|
|
| `NEXT_WEEK` | Next week |
|
|
| `THIS_MONTH` | Current month |
|
|
| `LAST_MONTH` | Previous month |
|
|
| `NEXT_MONTH` | Next month |
|
|
| `THIS_QUARTER` | Current quarter |
|
|
| `LAST_QUARTER` | Previous quarter |
|
|
| `NEXT_QUARTER` | Next quarter |
|
|
| `THIS_YEAR` | Current year |
|
|
| `LAST_YEAR` | Previous year |
|
|
| `NEXT_YEAR` | Next year |
|
|
| `THIS_FISCAL_QUARTER` | Current fiscal quarter |
|
|
| `THIS_FISCAL_YEAR` | Current fiscal year |
|
|
|
|
### N Days/Weeks/Months/Years
|
|
|
|
| Literal | Description |
|
|
|---------|-------------|
|
|
| `LAST_N_DAYS:n` | Last n days |
|
|
| `NEXT_N_DAYS:n` | Next n days |
|
|
| `LAST_N_WEEKS:n` | Last n weeks |
|
|
| `NEXT_N_WEEKS:n` | Next n weeks |
|
|
| `LAST_N_MONTHS:n` | Last n months |
|
|
| `NEXT_N_MONTHS:n` | Next n months |
|
|
| `LAST_N_QUARTERS:n` | Last n quarters |
|
|
| `NEXT_N_QUARTERS:n` | Next n quarters |
|
|
| `LAST_N_YEARS:n` | Last n years |
|
|
| `NEXT_N_YEARS:n` | Next n years |
|
|
|
|
### Specific Dates
|
|
|
|
```sql
|
|
-- Date only
|
|
WHERE CloseDate = 2024-12-31
|
|
|
|
-- DateTime
|
|
WHERE CreatedDate >= 2024-01-01T00:00:00Z
|
|
```
|
|
|
|
---
|
|
|
|
## Aggregate Functions
|
|
|
|
| Function | Description | Example |
|
|
|----------|-------------|---------|
|
|
| `COUNT()` | Count all rows | `SELECT COUNT() FROM Account` |
|
|
| `COUNT(field)` | Count non-null values | `SELECT COUNT(Email) FROM Contact` |
|
|
| `COUNT_DISTINCT(field)` | Count unique values | `SELECT COUNT_DISTINCT(Industry) FROM Account` |
|
|
| `SUM(field)` | Sum of values | `SELECT SUM(Amount) FROM Opportunity` |
|
|
| `AVG(field)` | Average of values | `SELECT AVG(Amount) FROM Opportunity` |
|
|
| `MIN(field)` | Minimum value | `SELECT MIN(Amount) FROM Opportunity` |
|
|
| `MAX(field)` | Maximum value | `SELECT MAX(Amount) FROM Opportunity` |
|
|
|
|
---
|
|
|
|
## Date Functions
|
|
|
|
| Function | Returns | Example |
|
|
|----------|---------|---------|
|
|
| `CALENDAR_YEAR(date)` | Year (e.g., 2024) | `SELECT CALENDAR_YEAR(CloseDate) FROM Opportunity` |
|
|
| `CALENDAR_QUARTER(date)` | Quarter (1-4) | `SELECT CALENDAR_QUARTER(CloseDate) FROM Opportunity` |
|
|
| `CALENDAR_MONTH(date)` | Month (1-12) | `SELECT CALENDAR_MONTH(CloseDate) FROM Opportunity` |
|
|
| `DAY_IN_MONTH(date)` | Day (1-31) | `SELECT DAY_IN_MONTH(CreatedDate) FROM Account` |
|
|
| `DAY_IN_WEEK(date)` | Day (1=Sun, 7=Sat) | `SELECT DAY_IN_WEEK(CreatedDate) FROM Account` |
|
|
| `DAY_IN_YEAR(date)` | Day (1-366) | `SELECT DAY_IN_YEAR(CreatedDate) FROM Account` |
|
|
| `WEEK_IN_MONTH(date)` | Week (1-5) | `SELECT WEEK_IN_MONTH(CreatedDate) FROM Account` |
|
|
| `WEEK_IN_YEAR(date)` | Week (1-53) | `SELECT WEEK_IN_YEAR(CreatedDate) FROM Account` |
|
|
| `HOUR_IN_DAY(date)` | Hour (0-23) | `SELECT HOUR_IN_DAY(CreatedDate) FROM Account` |
|
|
| `FISCAL_YEAR(date)` | Fiscal year | `SELECT FISCAL_YEAR(CloseDate) FROM Opportunity` |
|
|
| `FISCAL_QUARTER(date)` | Fiscal quarter | `SELECT FISCAL_QUARTER(CloseDate) FROM Opportunity` |
|
|
| `FISCAL_MONTH(date)` | Fiscal month | `SELECT FISCAL_MONTH(CloseDate) FROM Opportunity` |
|
|
|
|
---
|
|
|
|
## Relationship Queries
|
|
|
|
### Child-to-Parent (Dot Notation)
|
|
|
|
```sql
|
|
-- Standard objects
|
|
SELECT Contact.Name, Contact.Account.Name FROM Contact
|
|
|
|
-- Custom objects (use __r)
|
|
SELECT Child__c.Name, Child__c.Parent__r.Name FROM Child__c
|
|
```
|
|
|
|
### Parent-to-Child (Subquery)
|
|
|
|
```sql
|
|
-- Standard objects
|
|
SELECT Id, (SELECT Id FROM Contacts) FROM Account
|
|
|
|
-- Custom objects (use __r)
|
|
SELECT Id, (SELECT Id FROM Children__r) FROM Parent__c
|
|
```
|
|
|
|
---
|
|
|
|
## WITH Clauses
|
|
|
|
| Clause | Description |
|
|
|--------|-------------|
|
|
| `WITH SECURITY_ENFORCED` | Enforce FLS (throws exception if no access) |
|
|
| `WITH USER_MODE` | Respect sharing and FLS |
|
|
| `WITH SYSTEM_MODE` | Bypass sharing rules |
|
|
|
|
---
|
|
|
|
## Governor Limits
|
|
|
|
| Limit | Synchronous | Asynchronous |
|
|
|-------|-------------|--------------|
|
|
| Total SOQL Queries | 100 | 200 |
|
|
| Records Retrieved | 50,000 | 50,000 |
|
|
| QueryLocator Rows | 10,000,000 | 10,000,000 |
|
|
| OFFSET Maximum | 2,000 | 2,000 |
|
|
| Subqueries | 20 | 20 |
|
|
| Relationship Depth | 5 levels | 5 levels |
|
|
|
|
---
|
|
|
|
## Index Usage
|
|
|
|
### Always Indexed
|
|
|
|
- `Id`
|
|
- `Name`
|
|
- `OwnerId`
|
|
- `CreatedDate`
|
|
- `LastModifiedDate`
|
|
- `RecordTypeId`
|
|
- External ID fields
|
|
- Master-Detail fields
|
|
|
|
### Selective Query Rules
|
|
|
|
- Query is selective if WHERE returns < 10% of first 1M records
|
|
- Or uses an indexed field with < 1M matching records
|
|
- Non-selective queries on large tables fail
|
|
|
|
---
|
|
|
|
## CLI Commands
|
|
|
|
```bash
|
|
# Basic query
|
|
sf data query --query "SELECT Id, Name FROM Account LIMIT 10" --target-org my-org
|
|
|
|
# JSON output
|
|
sf data query --query "SELECT Id, Name FROM Account" --target-org my-org --json
|
|
|
|
# CSV output
|
|
sf data query --query "SELECT Id, Name FROM Account" --result-format csv --target-org my-org
|
|
|
|
# Bulk export (for large results, > 2,000 records)
|
|
sf data export bulk --query "SELECT Id, Name FROM Account" --target-org my-org --output-file accounts.csv
|
|
|
|
# Query plan (uses REST API explain endpoint)
|
|
sf api request rest "/query/?explain=SELECT+Id+FROM+Account+WHERE+Name='Test'" --target-org my-org --json
|
|
```
|