【Salesforce勉強日記#2】SOQLとSOSLの違いとは?データ検索をマスターする使い分けガイド
みなさん、こんにちは。アクセンチュアの北海道オフィス(AIH)で働いている高橋です。
Salesforceを学んでいて混同してしまうのはSOQLとSOSLという2つの言語です。どちらもデータを「検索」するためのものですが、この二つの違いと使い分けをすぐに説明できますか?
「とりあえずSOQLを使っているけど、SOSLって何?」「どっちを使えばいいのか分からない…」と感じている方も少なくないでしょう。
この記事では、Salesforceのデータ操作の基本であるSOQLとSOSL、それぞれの役割と明確な違い、そしてDMLとの関係性までを、分かりやすく解説します。
はじめに:Salesforceに存在する2つの「検索言語」
Salesforceに蓄積された膨大なデータの中から、必要な情報を的確に取り出すことは、業務効率化やデータ活用の基本です。そのための道具として、Salesforceは2つの強力な検索言語を用意しています。
- SOQL (Salesforce Object Query Language):データベースから条件に合うレコードを精密に取得するための言語。
 - SOSL (Salesforce Object Search Language):複数のオブジェクトを横断してキーワードに一致するテキスト情報を高速に検索するための言語。
 
この記事を読めば、この2つの言語の役割と使い分けが明確になり、あなたのSalesforce開発スキルを一段階引き上げる手助けとなるはずです。
SOQLとは?- データベースと対話する「精密なクエリ言語」
SOQLは、「どのオブジェクト」の「どの項目」を「どんな条件で」取得したいか、を正確に指定してレコードを取得するための言語です。一般的なデータベースで使われるSQLによく似ており、構造化された問い合わせを得意とします。
【SOQLの主な特徴】
- 
単一オブジェクトが主役:
FROM Accountのように、基本的には1つのオブジェクトを対象とします。(親子関係にある関連オブジェクトのデータも同時に取得可能) - 
項目を明示的に指定:
SELECT Id, Name, Phone FROM Accountのように、取得したい項目を自分で指定します。 - 
複雑な条件式:
WHERE句を使って、数値、日付、文字列などで複雑な絞り込みが可能です。(例:Amount > 1000000 AND CloseDate = THIS_YEAR) 
【使いどころ(こんな時に使う)】
- 「取引先」オブジェクトから、業種が「製造」のレコードをすべて取得したい。
 - 今月クローズ予定の「商談」レコードを、金額の大きい順に並べて表示したい。
 - 特定の取引先責任者のIDが分かっていて、その詳細情報を取得したい。
 
つまり、取得したいデータの場所(オブジェクト)と構造がある程度分かっている場合に非常に強力です。
-- 取引先(Account)から、年間売上が10億円以上の企業のIDと名前を取得
SELECT Id, Name FROM Account WHERE AnnualRevenue > 1000000000
SOSLとは?- Salesforce全体を横断する「高速なテキスト検索」
SOSLは、ユーザーが入力したキーワードを元に、複数のオブジェクトを横断して一括で検索します。Salesforce画面上部のグローバル検索バーの裏側で動いているのがこのSOSLであり、Googleのような全文検索をイメージすると分かりやすいでしょう。
【SOSLの主な特徴】
- 
複数オブジェクトを横断検索:
FIND '田中'のように検索すると、取引先、取引先責任者、商談など、複数のオブジェクトから「田中」というテキストを含むレコードを一度に探します。 - キーワード検索: 主に文字列での検索に使われ、Salesforceが検索対象としてインデックス化しているテキスト項目を自動で探します。
 - 関連性でソート: 検索結果は、キーワードとの関連性が高い順に返されます。
 
【使いどころ(こんな時に使う)】
- 「株式会社ABC」というキーワードが、取引先、商談、ケースのどこに含まれているか分からないので、全部探したい。
 - ユーザーが入力した単一の検索窓で、GoogleのようにSalesforce全体を検索する機能を作りたい。
 - どのオブジェクトにあるか見当がつかない情報を、とにかく高速に見つけ出したい。
 
-- Salesforce全体から「あいうえお商事」を検索し、見つかった取引先と取引先責任者の情報を返す
FIND 'あいうえお商事' IN ALL FIELDS RETURNING Account(Id, Name), Contact(LastName, FirstName)
【一覧比較】SOQL vs SOSL - 何がどう違うのか?
この2つの言語の違いを、役割や得意なことで比較してみましょう。
| 項目 | SOQL (構造化クエリ) | SOSL (全文検索) | 
|---|---|---|
| 役割 | レコードの精密な取得 | キーワードでの高速な検索 | 
| 検索対象 | 単一のオブジェクト (+関連オブジェクト) | 複数のオブジェクト | 
| 条件指定 | 
WHERE句で項目を指定 | 
FIND句でキーワードを指定 | 
| 戻り値 | レコードのリスト | オブジェクト毎のレコードリストのリスト | 
| 例えるなら | 図書館の蔵書目録で本を探す | Web検索エンジンでウェブを検索する | 
結論:どう使い分けるべきか?
ここまで見てきた特徴から、使い分けの判断基準は非常にシンプルです。
「探したいデータの場所(オブジェクト)が分かっているか?」
- 
分かっている場合 → SOQL
欲しいデータが明確なほとんどのケースで有効です。レポート作成、データ処理、詳細表示など、用途は多岐にわたります。 - 
分からない場合 → SOSL
キーワードだけを頼りに、Salesforce内を広範囲に探したい場合に最適です。主にユーザー向けの検索機能の実装で活躍します。 
【補足】DMLとの違い - 「読み取り」と「書き込み」
SOQLとSOSLを理解する上で、DML (Data Manipulation Language)との違いも押さえておきましょう。その役割は、一言でいうと正反対です。
- SOQL/SOSL:データを読み取るための言語です。データベースに「この情報をください」と問い合わせるだけで、既存のデータを変更することはありません。
 - 
DML:データを操作するための命令です。
INSERT(作成)、UPDATE(更新)、DELETE(削除)といった命令を使い、データベースのレコードを直接変更します。 
Discussion