Salesforce Developer Tools
A focused set of free, browser-based utilities for Salesforce developers and admins. Format and build SOQL queries, and convert record IDs between their 15- and 18-character forms — all client-side, with nothing sent to a server.
Salesforce tools
SOQL vs SQL: what actually differs
SOQL (Salesforce Object Query Language) looks like SQL but queries the Salesforce object model rather than raw tables, and it is deliberately narrower. There is no SELECT * — every field you want must be named explicitly. There is no JOIN keyword; instead you traverse relationships with dot notation (child-to-parent) or nested subqueries (parent-to-child). SOQL is read-only: it never inserts, updates, or deletes — those operations are separate DML statements in Apex. Because Salesforce is a multi-tenant platform, every query also runs inside governor limits that a traditional database never imposes.
What SOQL adds on top of SQL is domain convenience: relationship traversal by API name, date literals such as TODAY, THIS_MONTH, and LAST_N_DAYS:30 that need no quoting, semi-joins with IN (SELECT …), aggregate functions with GROUP BY, and polymorphic TYPEOF clauses. When a query comes back as an unreadable single line, the SOQL Formatter re-indents it with keyword highlighting, and the SOQL Query Builder assembles one field-by-field so the syntax is correct before you ever run it.
Salesforce record IDs: 15 vs 18 characters
Every Salesforce record has an ID in two forms. The 15-character ID is case-sensitive and is what you see inside the Salesforce UI and APIs. The 18-character ID appends a 3-character, case-insensitive checksum suffix so the value survives systems that change case — spreadsheets, some databases, and CSV round-trips. Both point to the same record; the 18-character form simply cannot be corrupted by an accidental upper-casing that would otherwise make two distinct 15-character IDs collide.
The suffix is computed from the case pattern of the 15 characters. The ID is split into three groups of five; within each group, every character that is an uppercase letter sets a bit, producing a 5-bit number (0–31) that indexes into the alphabet A–Z plus 0–5 to yield one suffix character. That is why converting 15 → 18 is deterministic and needs no lookup, while 18 → 15 is just truncation. The first three characters of any ID are the key prefix identifying the object type — 001 Account, 003 Contact, 006 Opportunity, 500 Case, and so on. The Salesforce ID Converter converts and validates either direction in batches.
Rule of thumb: use 18-character IDs whenever data leaves Salesforce for Excel, a data warehouse, or an integration; keep 15-character IDs for Apex, SOQL, and anywhere case is guaranteed to be preserved.
Governor limits every developer meets
Multi-tenancy means your code shares infrastructure with every other org, so Salesforce enforces per-transaction governor limits. The ones that shape how you write SOQL are worth memorising: 100 SOQL queries per synchronous transaction (200 asynchronous), a total of 50,000 records retrieved by SOQL per transaction, 150 DML statements, and 10,000 records processed per DML operation. A single SOQL statement can specify at most LIMIT 50000, and OFFSET is capped at 2,000 rows.
The practical takeaways: never place a SOQL query inside a loop — bulkify by querying once into a collection. Keep filters selective and on indexed fields (Id, Name, external IDs, lookups) so large objects do not throw a non-selective query error. When you need to page through many records, combine LIMIT and OFFSET, or switch to a query locator for batch processing beyond the 2,000-row offset ceiling.
Relationships and subqueries
SOQL walks relationships instead of joining tables. Child-to-parent traversal uses dot notation and can climb up to five levels: SELECT Name, Account.Name, Account.Owner.Name FROM Contact. Parent-to-child traversal uses a nested subquery keyed on the child relationship name: SELECT Name, (SELECT LastName FROM Contacts) FROM Account.
Standard relationships use the plural relationship name (Account → Contacts); custom relationships use the __r suffix (for example Invoices__r for an Invoice__c child). You can nest up to 20 parent-to-child subqueries and filter with semi-joins and anti-joins (WHERE Id IN (SELECT AccountId FROM Opportunity WHERE …)). Getting relationship names and suffixes right is exactly where the visual SOQL Query Builder helps — it offers the valid fields and relationships so the query is well-formed before you paste it into the SOQL Formatter or run it in your org.