Skip to main content

SOQL クエリ入門

学習の目的

この単元を完了すると、次のことができるようになります。

  • 必須の句を使用して有効な SOQL クエリを構成する。
  • 複数の条件でクエリ結果を絞り込む。
  • クエリ結果を並び替える。

「Apex コーディングスキルの構築」トレイルでいきなりこのモジュールに取り組むには少し無理があります。このモジュールの先に進む前に、「システム管理者のための Apex の基本」「システム管理者のためのオブジェクト指向プログラミング」に戻ってバッジを獲得してください。

この 2 つのバッジをすでに獲得している場合は先に進みましょう! クラス、変数、sObject の作成方法の基本事項を習得しているため、Salesforce オブジェクトクエリ言語、略して SOQL (「ソクル」と発音します) について学習する下地ができています。

SOQL とは?

SOQL は、Salesforce データベースからレコードデータを取得する言語です。「システム管理者のためのオブジェクト指向プログラミング」で、データ操作言語 (DML) のステートメントを使用してレコードを挿入、更新、削除できることを学習しました。では、データベースにすでに存在するデータを取得したい場合はどうすればよいのでしょうか? SOQL を使用すればデータを簡単に取得できます。

SOQL クエリの作成は、レポートの作成とよく似ています。レポートを作成するときは、次の点を自問します。

  1. どのような項目を表示したいか?
  2. どこに項目を配置するか?

SOQL クエリを作成するときも同じことを自問します。クエリの場合、こうした質問に対する答えが項目やオブジェクトになります。

「SELECT Name, Email FROM Contact」の場合、SELECT と FROM が SOQL キーワードで、Name と Email が項目、Contact が Salesforce の標準オブジェクトです。

このクエリは SOQL キーワード (SELECTFROM)、レコード項目 (NameEmail)、オブジェクト (Contact 標準オブジェクト) で構成されています。

このクエリは何をするのでしょうか? データベースの取引先責任者レコードに関する特定の情報を取得します。では、こうした要素がどのように組み合わせられるのかを検証し、実際にクエリをいくつか記述してみましょう。まず、SOQL クエリの必須の要素から見ていきます。

必須の SOQL 句

SELECT

どの SOQL クエリも、SELECT 句 と FROM 句 という 2 つの句が基盤になります。句はパズルのピースと考えることができます。完全なクエリを構成する要素です。

「SELECT Name, Email FROM Contact」の場合、「SELECT Name, Email」が SELECT 句です。

どの SOQL クエリにも、SELECT キーワードで始まる SELECT 句があります。SELECT 句は、Salesforce レコードの 1 つ以上の項目を (カンマ区切りで) 指定します。この例のクエリは NameEmail の 2 つの項目を返します。

項目名に関する注意事項: システム管理者が他のシステム管理者との会話で「項目」と言う場合、「項目の表示ラベル」を指しているものと思われます。他方、開発者はコードで「API 参照名」を使用します。そのため、SOQL クエリにおける項目は、「項目の表示ラベル」ではなく、常に「項目の API 参照名」です。項目の API 参照名がわからなくても心配いりません。調べる方法があります。この点は、モジュールの後半で説明します。

FROM

SOQL クエリの作成に欠かせない 2 つ目の句が FROM 句です。

「SELECT Name, Email FROM Contact」の場合、「FROM Contact」が FROM 句です。

FROM キーワードから始まる FROM 句は、Salesforce データベースのオブジェクトを指定します。この場合は、Contact オブジェクトからデータを取得します。では、クエリを実行するとデータがどのように表示されるのか見てみましょう。

Trail Together の動画

エキスパートの説明を見ながらこのステップを実行したい場合は、Trailhead Live の Trail Together シリーズの一部である、こちらの動画をご覧ください。「リソース」セクションに、セッション全体へのリンクが記載されています。

SOQL を実際に使ってみる

この単元では、開発者コンソールのクエリエディターで SOQL クエリを構築する手順を説明します。この単元にハンズオン Challenge はありませんが、以下の手順を一緒に実行してみたい方は、この時点で新しい Trailhead Playground を作成します。「Trailhead Playground の管理」モジュールで詳細を確認してください。通常、Trailhead Playground の作成に 3 ~ 4 分を要します。このモジュールの後半でハンズオン Challenge に取り組むときもこの Playground を使用します。

メモ

必ず新しい Trailhead Playground を使用してください。既存の組織や Playground を使用すると、Challenge に取り組んでいるときに問題が発生することがあります。

クエリエディターを使用してクエリを構築する

  1. Trailhead Playground で、設定 をクリックして [開発者コンソール] を選択します。
  2. [File (ファイル)] | [Open (開く)] | [Objects (オブジェクト)] | [Contact] をクリックします。
    エンティティ種別とそのエンティティがリストされている [Open (開く)] ウィンドウ。[Entity Type (エンティティ種別)] では [Objects (オブジェクト)]、[Entities (エンティティ)] では [Contact] が強調表示されています。
  3. [Open (開く)] をクリックします。
    [Contact] オブジェクトが開き、関連付けられているすべての項目の名前とデータ型がリストされます。
  4. 下部パネルで [Query Editor (クエリエディター)] タブを選択します。(タブが表示されていない場合は、ウィンドウの下部にある上矢印をクリックします。)3 つのウィンドウパネルからなる [Query Editor (クエリエディター)] タブ
    [Query Editor (クエリエディター)] には 3 つのセクションがあります。左上のセクション (1) にはクエリが表示されます。ここでクエリを編集できます。左下のセクション (2) にはエラーが表示されます。右側のセクション (3) には SOQL クエリの実行履歴が保存されます。
  5. Ctrl キーを押しながらクリックする操作 (Windows) または CMD キーを押しながらクリックする操作 (Mac) で、EmailNameLanguages__c の各項目を選択します。
  6. [Query (クエリ)] をクリックします。
    選択したオブジェクトと項目に基づいて、[Query Editor (クエリエディター)] に SOQL クエリが表示されます。クエリビルダーで項目を選択すると、SOQL クエリにその項目 API 参照名が自動的に挿入されます。つまり、このツールを使用すれば、API 参照名を記憶したり検索したりする必要がありません。
  7. [Execute (実行)] をクリックします。
    クエリで Id、Email、Name、Languages__c の各項目が返されます。

クエリが実行されると、結果に要求したとおりの内容が示されます。さらに、クエリエディターを使用した場合は、自動的に Id も返されます。便利ですよね?

省略可能な SOQL 句

SELECT 句 と FROM 句は必須ですが、SOQL にはクエリを絞り込むことを目的とする省略可能な句もあります。

Trailhead Playground で作成するサンプルクエリでは、返されるレコードがごく少数です。上記のクエリでは 20 件のレコードが返されました。けれども、レコードが何千件もある場合にはどうなるでしょうか? それほどのデータを処理するには相当のコンピューティング機能が必要です。SOQL に全レコードのサブセットを返す方法があればよいと思いませんか? 実際、その方法が存在します。

WHERE

WHERE 句は、レコードが選択されて返されるために満たすべき条件を設定します。WHERE 句の使い方は、リストビューやレポートで検索条件を使用して表示されるデータを制限する場合と同じです。たとえば、Stella という名の取引先責任者を探している場合、次のとおり、クエリの末尾に WHERE FirstName = 'Stella' を追加できます。

SELECT Name, Email FROM Contact WHERE FirstName = 'Stella'

また、1 つ以上の条件を使用して、WHERE 句による絞り込みを定義することもできます。AND、OR、IN という 3 つの演算子を使用すれば、数通りの方法で絞り込みを実行できます。では、いくつかの例を見てみましょう。

AND
AND を使用すると、2 つの条件を満たすレコードが返されます。このクエリでは、名が Stella で姓が Pavlova のすべてのレコードが返されます。


SELECT Name, Email
FROM Contact
WHERE FirstName = 'Stella' AND LastName = 'Pavlova'

OR
OR を使用すると、2 つの条件の 1 つを満たすレコードが返されます。このクエリでは、姓が James または Barr のレコードが返されます。


SELECT Name, Email
FROM Contact
WHERE LastName = 'James' OR LastName = 'Barr'

IN
IN を使用すると、3 つ以上の条件の 1 つ以上を満たすレコードが返されます。IN 句は通常、選択リストの値または LIST や SET の値を返す場合に使用します。OR 条件が多数あるため複雑になる可能性がある場合、IN を使用すればクエリが簡潔になります。このクエリでは、姓が James、Barr、Nedaerk、Forbes のいずれかであるすべてのレコードが返されます。

SELECT Name, Email FROM Contact
WHERE LastName IN ('James', 'Barr', 'Nedaerk', 'Forbes')

LIMIT

LIMIT キーワードは、返されるレコードの最大数を設定します。LIMIT を使えば、テスト時にクエリが大量のデータセットを処理する間待っている必要がなくなります。SOQL の使い方を学んでいくうちに、多数のレコードが返されないようにする適切な方法がわかってきますが、それまでは LIMIT が簡単な解決策です。では、この例のクエリに LIMIT を追加してみましょう。

  1. 開発者コンソールのクエリエディターに戻ります。
  2. 次のとおり、クエリの末尾に LIMIT 5 と入力します。
    SELECT Email, Name FROM Contact LIMIT 5
  3. [Execute (実行)] をクリックします。

[Query Results (クエリ結果)] ペインに 5 件の結果が示されます。

ORDER BY

結果の件数を管理する方法はわかりましたが、結果を整理するにはどうすればよいのでしょうか? ORDER BY 句を使用して、特定の項目の値を基準に結果を並び替えます。必要に応じて、ORDER BY 句に修飾子を使用し、昇順 (デフォルト) または降順を指定します。このやり方はスプレッドシートと同じです。最後に、空の項目が多数ある場合は、NULLS 修飾子を使用して NULL 値を最初 (デフォルト) または最後にまとめます。


構文
説明

ASC
結果を昇順で返します。
SELECT Name, Email FROM Contact
ORDER BY Name ASC
LIMIT 5

DESC
結果を降順で返します。

SELECT Name, Email FROM Contact
ORDER BY Email DESC
LIMIT 5

NULLS
FIRST | LAST
null レコードを最初 (NULLS FIRST) または最後 (NULLS LAST) に返します。
SELECT Name, Email FROM Contact
ORDER BY Email
NULLS LAST

ASC の例では、SELECT Name, Email FROM Contact ORDER BY Name ASC LIMIT 5 で、名前を基準に昇順に並び替えられた 5 人の取引先責任者の Name 項目と Email 項目が返されます。

取引先責任者オブジェクトの名前項目 (昇順) とメール項目をリストするクエリ結果

NULLS の例として、SELECT Name, Email FROM Contact ORDER BY Email NULLS LAST を実行すると、メールを基準に名前とメールが昇順で返されます (昇順がデフォルトの並び替え順であるため)。メールアドレスのないレコードは最後にまとめられます。

名前項目とメール項目をリストしたクエリ結果

SOQL の優れた機能の基本事項を学習しただけで、大量のデータセットを取得して結果を絞り込み、各自のニーズに合わせて返されたデータを整理できるようになりました。

リソース

Salesforce ヘルプで Trailhead のフィードバックを共有してください。

Trailhead についての感想をお聞かせください。[Salesforce ヘルプ] サイトから新しいフィードバックフォームにいつでもアクセスできるようになりました。

詳細はこちら フィードバックの共有に進む