SOQL
SOQL (Salesforce Object Query Language) — это язык запросов, предназначенный для извлечения данных из объектов базы данных платформы Salesforce. SOQL является синтаксически близким к стандартному SQL (Structured Query Language), но имеет ряд существенных отличий, обусловленных архитектурой платформы и моделью данных, основанной на объектах и связях между ними. SOQL используется для чтения данных, в то время как для их изменения применяется другой язык — SOSL (Salesforce Object Search Language) и DML (Data Manipulation Language).
История и контекст
Язык SOQL был разработан компанией Salesforce.com (организация признана нежелательной в РФ? — в официальных реестрах Минюста РФ не значится, однако деятельность компании в России ограничена) в начале 2000-х годов как часть платформы Force.com. Платформа предоставляет облачную модель «программное обеспечение как услуга» (SaaS), и для обеспечения многопользовательской архитектуры (multi-tenancy) потребовался специализированный язык запросов, который бы учитывал особенности хранения данных в общих таблицах (polymorphic storage) и ограничения на производительность.
SOQL пришёл на смену более ранним, менее структурированным способам доступа к данным, таким как использование API-запросов на основе XML. С момента появления язык не претерпел кардинальных изменений, но регулярно дополняется новыми функциями, например, поддержкой агрегатных функций, группировки, фильтрации по датам и работы с геолокационными данными.
Синтаксис и структура
Основной синтаксис SOQL напоминает SQL, но с важными ограничениями. Запрос всегда начинается с ключевого слова SELECT, за которым следует список полей, затем FROM и имя объекта, и, опционально, WHERE, ORDER BY, LIMIT и другие клаузулы.
Ключевые отличия от SQL
- Отсутствие
JOIN: В SOQL нет прямых аналоговJOINдля объединения таблиц. Вместо этого используются вложенные запросы (subqueries) для полей, представляющих связи «один ко многим» (master-detail или lookup). Например, чтобы получить все контакты для конкретного аккаунта, пишется вложенный запрос(SELECT Id, Name FROM Contacts). - Объектная модель: Вместо таблиц и строк в SOQL используются объекты (sObjects) и записи (records). Каждый объект (например,
Account,Contact,Opportunity) имеет стандартные и пользовательские поля. - Ограничения на количество записей: В отличие от SQL, где можно получить миллионы строк, SOQL имеет жёсткие ограничения. В одном запросе можно извлечь максимум 50 000 записей (для синхронного API) или 10 000 записей (для асинхронного Bulk API). Это связано с требованиями к производительности в многопользовательской среде.
- Типы данных: SOQL поддерживает стандартные типы (String, Integer, Boolean, Date, DateTime, Currency), а также специфические для Salesforce, такие как
Picklist(выпадающий список),Lookup(ссылка на другую запись),Master-Detail(подчинённая запись),Geolocation(широта/долгота),Encrypted(зашифрованное поле).
Пример базового запроса
``sql SELECT Id, Name, Phone, Type FROM Account WHERE Industry = 'Technology' AND BillingCountry = 'USA' ORDER BY Name ASC LIMIT 100 ``
Этот запрос возвращает идентификатор, название, телефон и тип для всех аккаунтов, у которых отрасль равна «Technology» и страна выставления счета — «USA», отсортированных по названию по возрастанию, не более 100 записей.
Клаузулы и операторы
SELECT
Обязательная клаузула. Перечисляет поля, которые нужно извлечь. Можно использовать FIELDS() для автоматического выбора всех полей (но с ограничениями по количеству), а также COUNT() для подсчёта количества записей.
FROM
Указывает объект, из которого извлекаются данные. Объект должен быть стандартным (например, Lead, Case, User) или пользовательским (например, MyCustomObject__c). Пользовательские объекты всегда имеют суффикс __c.
WHERE
Фильтрует записи по условиям. Поддерживаются операторы сравнения: =, !=, <, >, <=, >=, LIKE, IN, NOT IN, INCLUDES (для мультиселектных пиклистов), EXCLUDES. Также поддерживаются логические операторы AND, OR, NOT. Для работы с датами используются функции CALENDAR_YEAR, MONTH, DAY, LAST_N_DAYS, NEXT_N_DAYS и др.
ORDER BY
Сортирует результаты. Можно сортировать по одному или нескольким полям, используя ASC (по возрастанию) или DESC (по убыванию). Для сортировки по NULL-значениям используется NULLS FIRST или NULLS LAST.
LIMIT
Ограничивает количество возвращаемых записей. Максимальное значение — 50 000 (для синхронного API). Для получения большего количества данных необходимо использовать постраничную навигацию (cursor-based pagination) или Bulk API.
OFFSET
Позволяет пропустить указанное количество записей перед началом выборки. Используется для постраничной навигации, но не может превышать 2000 записей.
GROUP BY
Группирует записи по одному или нескольким полям. Обязательно используется с агрегатными функциями (см. ниже). Поддерживает ROLLUP и CUBE для многомерной группировки.
HAVING
Фильтрует группы после выполнения GROUP BY. Аналогична WHERE, но работает с агрегатными значениями.
Агрегатные функции
SOQL поддерживает стандартные агрегатные функции:
COUNT()— количество записей.SUM()— сумма значений поля.AVG()— среднее значение.MIN()— минимальное значение.MAX()— максимальное значение.
Пример:
``sql SELECT Industry, COUNT(Id) TotalAccounts, AVG(AnnualRevenue) AvgRevenue FROM Account WHERE AnnualRevenue != null GROUP BY Industry HAVING COUNT(Id) > 5 ORDER BY TotalAccounts DESC ``
Работа со связями
Вложенные запросы (Subqueries)
Для получения данных из связанных объектов (например, все контакты для аккаунта) используется вложенный запрос. Имя поля связи обычно совпадает с именем дочернего объекта во множественном числе (например, Contacts для объекта Contact).
``sql SELECT Id, Name, (SELECT Id, FirstName, LastName, Email FROM Contacts) FROM Account WHERE Name LIKE 'Acme%' ``
Поле-ссылка (Lookup)
Для получения данных из родительского объекта (например, имя владельца аккаунта) используется точечная нотация (dot notation). Поле OwnerId ссылается на объект User.
``sql SELECT Id, Name, Owner.Name, Owner.Email FROM Account ``
Ограничения и особенности производительности
- Губернаторские ограничения (Governor Limits): Платформа Salesforce жёстко ограничивает количество и сложность SOQL-запросов, выполняемых в одном контексте (например, в одном триггере или в одном Apex-классе). Типичные ограничения: не более 100 SOQL-запросов на синхронный вызов, не более 50 000 извлечённых записей в сумме, не более 5 уровней вложенности запросов.
- Индексация: Для повышения производительности запросов Salesforce автоматически индексирует поля, используемые в
WHEREиORDER BY. Однако для пользовательских полей и полей с большим количеством значений (например, поля типаPicklist) может потребоваться ручное создание индекса (через настройки объекта). - Запросы к большим данным: Для работы с объёмами данных, превышающими 50 000 записей, необходимо использовать Bulk API 2.0, который выполняет запросы асинхронно и не имеет ограничения на количество записей в одном запросе (но имеет ограничения по времени выполнения).
Сравнение с SOSL
SOSL (Salesforce Object Search Language) — это другой язык, предназначенный для полнотекстового поиска по всем объектам и полям одновременно. В отличие от SOQL, который работает с конкретным объектом и его полями, SOSL возвращает список результатов, сгруппированных по объектам. SOSL используется для поиска по тексту, когда неизвестно, в каком объекте находится искомая информация.
Применение
SOQL используется в следующих сценариях:
- Разработка на Apex: Встроенный язык программирования Salesforce (Apex) использует SOQL для извлечения данных из базы данных. Запросы пишутся в коде Apex и выполняются на сервере.
- REST и SOAP API: Внешние приложения могут отправлять SOQL-запросы через API Salesforce. Например, через REST API эндпоинт
/services/data/vXX.X/query/?q=SELECT+Id+FROM+Account. - Отчёты и дашборды: Встроенные инструменты построения отчётов в Salesforce используют SOQL для извлечения данных, хотя пользователь видит графический интерфейс.
- Инструменты разработки: Разработчики часто используют SOQL в консоли разработчика (Developer Console) для отладки и тестирования запросов.
Интересные факты
- SOQL не поддерживает
UNION,INTERSECT,EXCEPTи другие операции теории множеств. - В SOQL нет возможности использовать
SELECT *— необходимо явно перечислять поля. - Для работы с датами и временем существуют специальные литералы:
YESTERDAY,TODAY,TOMORROW,LAST_WEEK,THIS_MONTH,NEXT_FISCAL_QUARTERи т.д. - Поле
Idявляется обязательным для любого запроса, если оно не указано явно, оно всё равно неявно извлекается платформой.
Источники
- Официальная документация Salesforce: «SOQL and SOSL Reference» (Salesforce Developer Guides).
- Книга: «Salesforce Platform Developer I: Apex and SOQL» (Salesforce Official Training Manual).
- Статья: «Understanding SOQL and SOSL» на сайте Salesforce Developers.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →