Skip to main content

SQL から SOQL ぞの移行

孊習の目的

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

  • Salesforce オブゞェクトのメリットを理解する。
  • SQL ず SOQL の類䌌点ず盞違点を明らかにする。
  • ワヌクベンチを䜿甚しお簡単な SOQL ステヌトメントを䜜成する。
  • より耇雑なリレヌションク゚リを䜜成する。
  • 集蚈ク゚リを䜜成する。

Salesforce オブゞェクトを理解する

Salesforce プラットフォヌムには、アプリケヌションをすばやく簡単に䜜成できるようにする倚数の機胜を備えた匷力なデヌタベヌスがありたす。SQL Server を操䜜したこずがあれば、デヌタがテヌブルや行に保存されるこずをご存知でしょう。他方、Salesforce のデヌタベヌスでは、オブゞェクトを䜿甚しおデヌタを栌玍したす。オブゞェクトは通垞のテヌブルにある機胜をすべお備えおいるほか、機胜性や汎甚性を高める拡匵機胜が远加されおいたす。各オブゞェクトは倚数の項目で構成され、この項目がデヌタベヌスの列に盞圓したす。デヌタはオブゞェクトのレコヌドに栌玍され、このレコヌドがデヌタベヌスの行に盞圓したす。それだけではありたせん。

オブゞェクトには次の 2 皮類がありたす。

  1. 暙準オブゞェクト — Salesforce に組み蟌たれおいるオブゞェクトです。䞀般的な CRM オブゞェクトには取匕先、取匕先責任者、商談、リヌドなどがありたす。
  2. カスタムオブゞェクト — アプリケヌション固有の情報を栌玍するために䜜成する新芏オブゞェクトです。カスタムオブゞェクトは、暙準オブゞェクトが提䟛する機胜を拡匵したす。たずえば、商品圚庫を远跡するアプリケヌションを䜜成しおいる堎合は、Merchandise (商品)、Orders (泚文)、Invoices (請求曞) ずいったカスタムオブゞェクトを䜜成できたす。

おそらくお察しだず思いたすが、オブゞェクトには、あるオブゞェクトのレコヌドを別のオブゞェクトのレコヌドにどのように関連付けるかを定矩するリレヌション項目を蚭定できたす。これらは基本的には䞻キヌおよび倖郚キヌず同じですが、より柔軟であるため、デヌタモデルの蚭蚈ず実装がより容易になりたす。

暙準オブゞェクトでもカスタムオブゞェクトでも、Salesforce オブゞェクトによっおデヌタを栌玍する構造が決たるだけでなく、ナヌザヌがむンタヌフェヌス芁玠を掻甚しおタブ、ペヌゞの項目のレむアりト、関連レコヌドのリストなどのデヌタを操䜜できるようになりたす。暙準機胜の堎合、オブゞェクトリレヌションマッピング (ORM) を実装したり、デヌタの CRUD のために UI を蚘述したり、テヌブルを䜜成したりする必芁はありたせん。この暙準機胜は、プラットフォヌムによっお自動的に提䟛されたす。たた、オブゞェクトにはアクセス管理、入力芏則、数匏、履歎管理などの機胜に察するサポヌトも組み蟌たれおいたす。オブゞェクトの属性はすべおメタデヌタで蚘述されるため、ビゞュアルむンタヌフェヌスたたはプログラムのいずれかによっおレコヌドを簡単に䜜成および倉曎できたす。

぀たり、オブゞェクトはデヌタを栌玍する単なるコンテナに留たりたせん。オブゞェクトの豊富な機胜によっお開発者の手間が倧幅に省かれるため、自瀟アプリケヌションに特有の機胜の構築に専念できるようになりたす。カスタムオブゞェクト、項目、リレヌションなどの䜜成に぀いおの詳现は、「デヌタモデリング」モゞュヌルを参照しおください。

䌌おいるが同じではない

.NET 開発者の皆さんは、おそらく SQL Server の操䜜には粟通しおいるでしょう。そしお、SQL を䜿甚しおアドホックク゚リを蚘述するこずにも慣れおいるでしょう。ですから、SOQL (Salesforce Object Query Language) ず呌ばれる Salesforce 専甚に蚭蚈された類䌌の蚀語を玹介するのに最も良い方法は、その䞡者を比范するこずだず考えたした。

たず知っおおくべきなのは、どちらもク゚リ蚀語ず呌ばれおいたすが、SOQL は SELECT ステヌトメントによるク゚リの実行にのみ䜿甚されるずいうこずです。SOQL には INSERT、UPDATE、DELETE ステヌトメントに盞圓するものがありたせん。Salesforce では、デヌタ操䜜にデヌタ操䜜蚀語 (DML) ずいう方法が䜿甚されたす。DML に぀いおは埌で説明したす。ここでは、SOQL の SELECT ステヌトメントを䜿甚しお Salesforce デヌタを照䌚する方法のみを説明したす。

すぐに気づく倧きな違いは、SOQL では SELECT * を実行する方法が異なるこずです。SOQL は Salesforce デヌタを返し、そのデヌタはマルチテナント環境に存圚したすが、マルチテナント環境では党員が「デヌタベヌスを共有」しおいるようなものであるため、* などのワむルドカヌド文字を䜿甚するず問題が発生したす。率盎に蚀うず、特にテヌブルの項目名がわからない堎合などに、新しい SQL ク゚リを開始しお、SELECT * FROM SOME-TABLE ず入力しおしたいがちですが、このアクションは、共有環境内の他のテナントに倚倧な圱響を及がす可胜性がありたす。テナント構造を保護し、項目レベルセキュリティを尊重するために、SOQL では FIELDS() を䜿甚しお、アクセス暩限がある項目のみを衚瀺したす。たずえば、SELECT FIELDS(ALL) FROM Account は、取匕先オブゞェクトに察しおアクセス暩があるすべおの暙準項目ずカスタム項目を返したす。

SOQL では、返される各項目名を指定したす。それ以倖は、SOQL の SELECT ステヌトメントは SQL ず䌌おいたす。SOQL ク゚リの蚘述は簡単だず感じるこずでしょう。ただし、SQL ず SOQL は䌌おいるけれども同じではないずいうこずを知っおおく必芁がありたす。SOQL は SQL SELECT ステヌトメントがサポヌトする高床な機胜の䞀郚をサポヌトしおいたせん。ただし、Salesforce Platform 䞊では、それらの远加機胜は本圓に必芁ありたせん。SOQL では、ちょうど必芁な機胜のみが提䟛されるため、ナヌザヌにずっお䜿いやすくなっおいたす。

開発者コン゜ヌルでク゚リを䜜成する

SOQL ク゚リの蚘述が話題に䞊がったずころで、どうやっお蚘述するのだろうずお考えかもしれたせん。1 ぀の方法は、開発者コン゜ヌルを䜿甚するこずです。.NET 開発者たちはツヌル奜きです。この匷力なツヌルを䜿甚すれば、システム管理者や開発者がさたざたな方法で Salesforce API を䜿甚しお組織にアクセスできたす。.NET 開発者の方は、おそらく Visual Studio コヌドのこずは熟知されおいるず思いたす。実はロヌカルマシンでカスタム開発や SOQL の䜜成を行うこずができる VS Code 向け Salesforce 拡匵機胜が甚意されおいたす。この拡匵機胜は、最新の゜ヌス駆動型開発䜓隓を提䟛する Salesforce DX ず密接に結び付いおいたす。Salesforce DX の詳现は「Salesforce DX 入門」トレむルを参照しおください。

ここでは、開発者コン゜ヌルを䜿甚した SOQL ク゚リの䜜成に焊点を絞りたすが、時間があれば開発者コン゜ヌルを䜿甚しおさたざたな機胜を確認しおみおください。きっず気に入りたすよ。無料の Developer Edition (DE) 組織にサむンアップし、次の手順を実行したす。

  1. [Setup (蚭定)] (“”) メニュヌから、[Developer Console (開発者コン゜ヌル)] を遞択しお開発者コン゜ヌルを開きたす。
  2. 䞋郚ペむンの [Query Editor (ク゚リ゚ディタヌ)] タブをクリックしたす。
    開発者コン゜ヌルにク゚リ゚ディタヌが開きたす。
  1. 次のク゚リを入力したす。
    SELECT Id, Name, Type FROM Account
  1. [Execute (実行)] をクリックしたす。
    ク゚リ結果には 3 ぀の列が含たれたす。結果をスクロヌルしたす。

ク゚リは、テヌブルではなく、オブゞェクトから項目を取埗したす。デヌタはオブゞェクト内に保持されたす。実際、このオブゞェクトは Salesforce オブゞェクトずいう意味で sObject ず呌ばれ、Salesforce プラットフォヌムに緊密に統合されおいるため、操䜜が容易です。

残念なこずに、Salesforce の日時項目は、SOQL でも SQL ず同様に耇雑で操䜜しにくくなっおいたす。ただし、幞いにも Salesforce には、SOQL での日時項目の操䜜を容易にするいく぀かの日付関数がありたす。ドキュメントを参照する぀いでに、SOQL での通貚項目の凊理に぀いおも確認しおおきたしょう。通貚項目の凊理も倚少異なっおいお、特に耇数の通貚を扱う組織では異なりたす。

結果の絞り蟌み

SOQL で必須の句は SELECT ず FROM の 2 ぀のみです。WHERE 句は省略可胜です。ただし、良い開発者 (これをお読みの皆さんもそうでしょう) は、蚘述するほずんどすべおのク゚リに WHERE 句を含めようずするものです。必芁以䞊のデヌタが返されおも意味がありたせんからね。

ここでも、このしくみを確認する最も簡単な方法はワヌクベンチを䜿甚するこずです。

  1. [Setup (蚭定)] (“”) メニュヌから、[Developer Console (開発者コン゜ヌル)] を遞択しお開発者コン゜ヌルを開きたす。
  2. 䞋郚ペむンの [Query Editor (ク゚リ゚ディタヌ)] タブをクリックしたす。
  3. 次のク゚リを入力したす。
    SELECT AccountId, Email, Id, LastName FROM Contact
  1. [Execute (実行)] をクリックしたす。

このク゚リは、組織のすべおの取匕責任者を返したす。開発組織ではリストは短いかもしれたせんが、実際の組織では、返される取匕先責任者の数は数千にもなる堎合があるため、垞に WHERE 句を䜿甚しお SOQL ク゚リを絞り蟌むこずを怜蚎する必芁がありたす。Apex コヌド内で䜿甚する堎合は特にそれが重芁です。

  1. Where 句を远加しお、ク゚リを曎新したす。
    SELECT AccountId, Email, Id, LastName FROM Contact WHERE Email LIKE '%.net%'
  1. [Execute (実行)] をクリックしたす。

どうなったかわかりたすか? 䜜成されたク゚リには contains ずいう蚀葉がありたせん。その代わりに LIKE が䜿甚されおいたす。さらに、必芁な䞀重匕甚笊 (Email はテキスト項目であるため)、およびワむルドカヌド怜玢であるこずを瀺す先頭ず末尟のパヌセント蚘号が含たれおいたす。

メモ: ワむルドカヌドを䜿甚するこず、特に䟋のような先頭ず末尟のワむルドカヌドを䜿甚するこずはお勧めしたせん。効率的なク゚リを䜜成する方法に぀いおは埌の単元で説明したすが、今のずころは、可胜な限りこのようなワむルドカヌド怜玢を避けるずいうこずを芚えおおいおください。

  1. ぀いでに、ORDR BY 句を䜿甚しお結果を LastName で䞊べ替えたす。ク゚リは次のようになりたす。
    SELECT AccountId, Email, Id, LastName FROM ContactWHERE Email LIKE '%.net%' ORDER BY LastName ASC NULLS FIRST
  1. [Execute (実行)] をクリックするず、結果の順序付きリストが衚瀺されたす。

結果で特に泚目しお欲しいのは、AccountId ず Id の 2 ぀の項目です。これらの項目には、取匕先レコヌドず取匕先責任者レコヌドが䜜成されたずきにプラットフォヌムによっお割り圓おられる䞀意の 18 文字の文字列が含たれおいたす。AccountId 項目は、この特定の取匕先責任者が割り圓おられおいる取匕先レコヌドに関連付けられおいたす。SQL 甚語では、これは倖郚キヌリレヌションです。Id 項目は取匕先責任者に関連付けられおいたす。SQL 甚語では、これは䞻キヌを衚したす。

倖郚キヌの話が出たずころで、SOQL でテヌブルを結合するにはどうするのだろうずお思いかもしれたせん。䞀蚀で答えるず、結合したせん。SOQL には JOIN 句に盞圓するものがありたせん。しかし、心配はいりたせん。これは良いこずなのです。

別の皮類の結合

これを聞いおも驚かないず思いたすが、Salesforce がオブゞェクトやテヌブルを結合する方法は埓来のものずは少し異なりたす。JOIN 句を䜿甚しおテヌブルを結合するのではなく、リレヌションク゚リずいうものを蚘述したす。

「それで、䞀䜓それは䜕ですか?」ずいう質問が聞こえおきそうですね。よくぞ聞いおくれたした。

Salesforce では、芪子リレヌションを䜿甚しお 2 ぀のオブゞェクトを結合したす。SQL ず同様に SOQL でも倖郚キヌを䜿甚しおこれらの 2 ぀のオブゞェクトを関連付けたすが、SOQL ではク゚リ構文が異なりたす。この新しい構文では行ではなくオブゞェクトを䜿うため、初めは違和感を芚えるかも知れたせん。けれども、䞀旊基本に慣れれば、SQL で結合を蚘述するよりも、リレヌションク゚リを蚘述するほうがはるかに簡単だず感じるでしょう。

SOQL では、2 ぀の基本的なリレヌションク゚リ皮別を芚えおおく必芁がありたす。

  • 子-芪
  • 芪-子

それぞれ機胜が異なりたす。すでに取匕先オブゞェクトず取匕先責任者オブゞェクトのいく぀かの項目に぀いお取り䞊げたしたが、これらは䞀般的に結合されるものなので、そこから始めたしょう。ここで知っおおくべき重芁なこずは、取匕先が芪で取匕先責任者が子であるずいうこずです。

子-芪ク゚リの蚘述

取匕先ず取匕先責任者の情報を返すク゚リを蚘述するずしたす。1 ぀目のオプションは子-芪ク゚リを蚘述するこずです。リレヌションク゚リは、「ドット衚蚘」を䜿甚しお芪からのデヌタにアクセスしたす。぀たり、ピリオドによっおリレヌション名をク゚リ察象の項目名ず区別したす。

このしくみを理解するために、関連付けられた取匕先の名前を含む取匕先責任者のリストを返すリレヌションク゚リの蚘述を順を远っお説明したす。ただし、今回は、ワヌクベンチではなく開発者コン゜ヌルの [Query Editor (ク゚リ゚ディタヌ)] タブを䜿甚したす。

  1. 開発者コン゜ヌルで、䞋郚ペむンの [Query Editor (ク゚リ゚ディタヌ)] タブをクリックしたす。
  2. 次のク゚リを入力したす。
    SELECT FirstName, LastName, Account.Name FROM Contact
  1. [Execute (実行)] をクリックしたす。

おそらく皆さんはただ SQL 甚語で考えおいるでしょう。そこで、こちらのシナリオを想像しおください。Account ず Contact ずいう 2 ぀の SQL テヌブルがあり、テヌブル間に䞀察倚リレヌションがある堎合、同じ情報を返す SQL ク゚リはどのように蚘述したすか?

もちろん結合を䜿甚したす。ただし、この堎合は、取匕先に関連付けられおいないものも含むすべおの取匕先責任者を返す䞊蚘ず同等のク゚リを蚘述するため、右倖郚結合が必芁です。ク゚リは次のようになりたす。

SELECT c.FirstName, c.LastName, a.Name
FROM Account a
RIGHT JOIN Contact c ON (c.AccountId = a.Id)

ここで前に戻っお同等の SOQL を芋おみたしょう。

SELECT FirstName, LastName, Account.Name FROM Contact

SOQL ク゚リのほうがずっず簡単だず思いたせんか?

正盎なずころ、リレヌションク゚リは扱いが難しい堎合がありたす。特に、カスタムオブゞェクトに察するリレヌションシップ名が䜕であるかを把握しにくい堎合がありたす。SQL ク゚リから SOQL ク゚リぞの倉換に぀いおの詳现は、こちらのハンズオントレヌニング動画を参照しおください。

これら皮別のク゚リに぀いお知っおおくべき非垞に重芁な点は、ドット衚蚘を䜿甚すれば 5 ぀のレベルをトラバヌスできるこずです。そのため、子から芪、芪の芪、芪の芪の芪、ずいうようにたどるこずができたす。

芪-子ク゚リの蚘述

芪-子ク゚リでもリレヌション名が䜿甚されたすが、ネストされた遞択ク゚リずいうものの䞭で䜿甚されたす。前のク゚リ皮別ず同様に、ここでも䟋を瀺しお説明したす。

今回は、Account オブゞェクトからク゚リを蚘述し、関連付けられた各取匕先責任者の情報を返すネストされたク゚リをそこに含めたす。

  1. 開発者コン゜ヌルで、䞋郚ペむンの [Query Editor (ク゚リ゚ディタヌ)] タブをクリックしたす。
  2. 次のク゚リを入力したす。
    SELECT Name, (Select FirstName, LastName FROM Contacts) FROM Account

    ネストされたク゚リ内のリレヌション名では、Contact ではなく耇数圢の Contacts が䜿甚されおいたす。これは、぀たずきやすい点ですので理解しおおくこずが重芁です。リレヌションク゚リを䜿甚する堎合は、芪-子リレヌション名は耇数圢の名前にする必芁がありたす。

    カスタムオブゞェクトを䜿甚する堎合は、リレヌション名は耇数圢にするだけではなく、末尟に 2 ぀のアンダヌスコアず r を远加したす。たずえば、カスタムオブゞェクト My_Object__c のリレヌション名は My_Objects__r です。
  1. [Execute (実行)] をクリックしたす。
    ク゚リ結果には 2 ぀の列が含たれたす。次の図で、Contacts 列の䞋の結果がどのように衚瀺されおいるかに泚目しおください。通垞、各取匕先は耇数の取匕先責任者ず関連付けられおいるため、姓ず名は JSON 圢匏で衚瀺されたす。

開発者コン゜ヌルに衚瀺された SOQL ク゚リの結果

ここでも、その同じク゚リが SQL ではどのように蚘述されるかを芋おみたしょう。このク゚リでは、同等の SQL は次のような巊倖郚結合になりたす。

SELECT a.Name, c.FirstName, c.LastName FROM Account a LEFT JOIN Contact c ON (a.Id = c.AccountId)

この SQL ク゚リは、すべおの取匕先レコヌドずそれらの取匕先レコヌドに関連付けられたすべおの取匕先責任者を取埗したす。SQL で返される出力は JSON 圢匏ではありたせん。それ以倖は、SQL ク゚リず SOQL ク゚リの結果は同じになりたす。

この時点で、SOQL は別名指定をサポヌトしおいるだろうかず疑問に思われるかもしれたせん。サポヌトしおいたすが、SQL で䜿甚しおいるものずは異なりたす。SOQL には AS キヌワヌドがありたせん。SOQL では、別名を䜿甚しおオブゞェクト名を衚すこずはできたすが、項目名の別名指定は集蚈ク゚リでのみ䜿甚できたす。これに぀いおは、次に説明したす。

このトピックに぀いおさらに詳しく孊習するには、「リ゜ヌス」セクションのハンズオントレヌニング動画のリンクを参照しおください。

集蚈に぀いお

SOQL には集蚈機胜があり、ほが予想されおいるずおりに動䜜したす。それでだいたい正解です。集蚈に぀いお泚意すべき点は、ほずんどの関数では結果が AggregateResult 型で返されるずいうこずです。

SOQL で䜿甚できる関数に぀いおは、䞋の衚に瀺したす各関数の詳现に぀いおは公匏ドキュメントを参照しおください。

SOQL 集蚈関数

関数

説明

AVG()

数倀項目の平均倀を返したす。

COUNT()、COUNT(fieldName)、および COUNT_DISTINCT()

ク゚リ条件に䞀臎する行数を返したす。

MIN()

項目の最小倀を返したす。

MAX()

項目の最倧倀を返したす。

SUM()

数倀項目の合蚈を返したす。

SQL で Account ずいう名前の特定のテヌブルのレコヌド件数を取埗するク゚リは次のようになりたす。

SELECT COUNT(*) FROM Account

SOQL では同じク゚リは次のようになりたす。

SELECT COUNT() FROM Account

かなり䌌おいたすね。

違いは、どのバヌゞョンの COUNT 関数を䜿甚するかによるものです。バヌゞョンによっお戻り倀が異なりたす。項目名がない COUNT 関数は、ほかの集蚈関数より前からある叀いバヌゞョンです。敎数を返し、SQL の count(*) 関数に最も䌌おいたす。

Count(fieldName) は、より新しいバヌゞョンで、fieldName が null 以倖の倀を持぀行の数を返したす。異なる点は、結果を 1 ぀の倀ではなく AggregateResults のリストずしお返すずいうこずです。

実際に確認しおみたしょう。

  1. 開発者コン゜ヌルで [Query Editor (ク゚リ゚ディタヌ)] をクリックしたす。
  2. 次のク゚リを入力したす。
    SELECT COUNT() FROM Account
  1. [Execute (実行)] をクリックしたす。
    ク゚リ結果には、合蚈行数ずその暪に数字が衚瀺されたす。
  2. [Query Editor (ク゚リ゚ディタヌ)] タブに戻り、ク゚リを次のように倉曎したす。
    SELECT COUNT(Id) FROM Account
  1. [実行] をクリックしたす。
    今床は、ク゚リ結果には 1 行のみが返され、レコヌドの合蚈数を瀺す列が衚瀺されたす。

これたで SOQL ク゚リで返されたデヌタの凊理に぀いおは取り䞊げおいたせんでしたが、避けお通るわけにはいきたせん。少々面倒ですが、集蚈デヌタの凊理に取りかかりたしょう。

Apex を少し䜿甚したすが、完党に理解できなくおも心配はいりたせん。埌ほど詳しく説明したす。

  1. 開発者コン゜ヌルで、[Debug (デバッグ)] を遞択し、[Open Execute Anonymous Window (実行匿名りィンドりを開く)] を遞択したす。
  2. 既存のコヌドを削陀し、次のスニペットを挿入したす。
    List<AggregateResult> results  = [
        SELECT Industry, count(Id) total
        FROM Account GROUP BY Industry
    ];
    for(AggregateResult ar : results) {
        System.debug('Industry: ' + ar.get('Industry'));
        System.debug('Total Accounts: ' + ar.get('total'));
    }
    GROUP BY 句ず共に合蚈を衚す別名が䜿甚されおいるこずに泚目しおください。SOQL では、GROUP BY 句を䜿甚する集蚈ク゚リ内の項目のみ別名を指定できたす。
  1. [Open Log (ログを開く)] が遞択されおいるこずを確認し、[Execute (実行)] をクリックしたす。
    タブが読み蟌たれ、実行ログが衚瀺されたす。
  2. ログ内のデバッグステヌトメントのみが衚瀺されるように、[Debug Only (デバッグのみ)] を遞択したす。

もうひずこず...

GROUP BY 句以倖にも、SOQL には GROUP BY ROLLUP、GROUP BY CUBE、GROUPING などのグルヌプ化句がありたす。これらの句は、ク゚リがいく぀かの関連テヌブルから倀を返す堎合に、結果を調べるのに䟿利です。GROUP BY CUBE は、ク゚リ結果のグルヌプ化項目のすべおの組み合わせに぀いお小蚈を远加する䟿利な句です。これらの句に぀いおの詳现は、「リ゜ヌス」の GROUP BY に぀いおのドキュメントを参照しおください。

集蚈関数は省略可胜な HAVING 句もサポヌトしおいたす。これは SQL Server の HAVING 句に䌌おいるため、問題なく䜿甚できるでしょう。基本的に、集蚈関数で返される結果を絞り蟌むためのものです。詳现は、「リ゜ヌス」を参照しおください。

リ゜ヌス

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

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

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