SalesforceのSOQLはSQLと何が違う?元プログラマーが解説する3つのポイント

公開日: 最終更新日:

20260406_001.jpg

この記事でわかること

  • Salesforceの「SOQL」とは何か
  • 元プログラマーが痛感したSQLとSOQLとの違い
  • SQL経験者がハマりやすい3つの落とし穴とその回避策
  • SOQLとSOSLの違い

目次

はじめに

こんにちは、テラスカイ・テクノロジーズのA.Kです。
普段はSalesforceの要件整理などを担当しています。私は中途入社なのですが、新卒の時はSIerでプログラマーをしていたため、SQL(普通のデータベース言語)を書くのが得意でした。
 

文法だけを見るとこれまで書きなれたSQLに似ている部分が多く、「SQLを書いた経験があるからカンタンそう」と思っていました…
でもSalesforceのSOQLには最初は苦戦しました。

今回はそんな私の経験をもとに「SOQL」とは何なのか、SQLと何が違うのか、どこで躓いたのかをお伝えします。

そもそも「SOQL」ってなに?

SOQLは「Salesforce Object Query Language」の略です。
 Salesforceでは、取引先や商談、顧客情報などのデータを「オブジェクト」として管理しています。SOQLは、これらのオブジェクトから必要なデータを取得するための問い合わせの言語です。
 

少し難しく聞こえるかもしれませんが、簡単にいうと、
「Salesforce上のデータにフィルタ機能をかけて必要な情報を取り出す命令文」
 というイメージです。
 

お客様の依頼やApexでデータを取得をしたい時に使うことが多く、Salesforceを扱う上でとても便利な存在です。
 

ちなみにSalesforceにはSOQLと似た言葉でSOSL(Salesforce Object Search Language)というものがあります。
SOQLが「条件を指定して、データを取得する」のに対し、SOSLは「キーワードから横断的に検索する」ための言語です。似ていますが用途は少し異なります。

 

\Salesforceの設定でお困りですか?専門エンジニアがサポートします/
 
今すぐ相談する  事例を見る

SOQLとSQLは何が違うの?

ここで、皆さん思うはずです。
 「じゃあどんなところがSQLと違うの?」
 実際、文法はかなり似ています。
 
     SELECT Name FROM Account
 
のように書ける点はSQL経験者の方にも馴染みがあると思います。
 

ただ、いくつか大きな違いがあります。
  
①SELECT *が使えない
 

SQLではよく
 
     SELECT * FROM Accout
 
のように「全部の項目出して」というように書けます。
 

しかしSOQLではこれができません。
 必ず、取得したい項目を一つずつ指定する必要があります。
 

最初は正直、「え、面倒…」と思いました。
 でも理由を知って納得しました。
 

Salesforceは世界中のユーザーが同時に利用するクラウドサービスです。そのためサーバーに過度な負担をかけないようにさまざまな制限が設けられています。
 

「必要なデータだけを取得する」というルールがSalesforceにはあるのです。

 

② SOQLにはJOINがない
 

データの世界では、情報はバラバラの表に分かれています。
  
たとえば、・会社の情報・その会社に所属している人の情報は、別々に管理されていることが多いです。
 
🔸SQLの場合
 SQLでは、別々の表を「JOIN」という命令でくっつけます。イメージはこんな感じです。
 

会社の表 + 人の表 → 1つの結果にする
 

必要なときに、あとから表をつなぎ合わせるのがSQLです。

 

     SELECT Account.Name, Contact.LastName
     FROM Account
     INNER JOIN Contact ON Account.Id = Contact.AccountId

このように、「どの項目がどの項目と一致するか」をJOINを使ってつなげる必要があります。

 

🔸SOQLの場合
 一方、SOQLには「JOIN」という命令がありません。
その代わり、Salesforceでは、人のデータの中に「どの会社に所属しているか」という情報が最初から入っています。
 

なので、
 「表をつなぐ のではなく、つながりを『たどる』」
 という考え方になります。

(1)会社→従業員(親→子)

     SELECT Name, (SELECT FirstName, LastName FROM Contacts)
     FROM Account

これは「会社(親)」から見て「従業員(子)」を一覧で取得するパターンです。
 このようにカッコ()を使って子の情報を取得します。

 

(2)従業員→会社(子→親)

     SELECT LastName, Account.Name
     FROM Contact

これは「従業員(子)」から見て「所属している会社(親)」をたどるパターンです。
 Account.Nameのように書くことで関連している会社の情報を取得します。
 

SQLは自由に表同士をつなげますが、SOQLは「あらかじめつながっているもの」しかたどれません。これは不便というより、”たくさんの人が同時に使うクラウドサービスだからこその安全設計”とも言えます。

 

③ クエリ内にコメントが書けない

SQLでは、次のようにコメントを書くことができます。

     /*
     取引先テーブルから取引先名を取得
     */
     SELECT Name -- 取引先名
     FROM Account

 

些細なことなのですが、SOQLではコメントアウトができません。これは地味に困ります。
 

試行錯誤しながらクエリを作成しているときに部分的にコメントアウトしながら試したい場面がよくあります。
 

Apexのコード内ではコメントは書けますが、SOQLの文法そのものにはコメント構文がありません。そのため、クエリの意図を残したい場合は、Apex側のコードにコメントを書くなどの工夫が必要になります。

 

\Salesforceの設定でお困りですか?専門エンジニアがサポートします/
 
導入事例を見る テラテクのエンジニア派遣について

まとめ

SOQLはSQLと似ています。でも少し違います。だからこそ、SQL経験者ほど油断します。
 

・SELECT * が使えない
・JOINの考え方が違う
・コメントアウトができない

違いは今回挙げたものだけではなく他にもいろいろあるので、最初は戸惑いました。でも、その理由を理解すると、SOQLはまるでパズルのようで、少しずつ解けるのが面白くなってきます。
 

テラテクでは、私のように異なるバックグラウンドを持つメンバーが集まり、分からないことは相談しながら、新しい技術にも前向きに挑戦しています。これからSalesforceに触れる方の参考になれば嬉しいです。

著者プロフィール

A.K(Salesforceデベロッパー)

🏅保有資格
・Salesforce 認定 Platform アドミニストレーター
・Salesforce 認定 Platform アプリケーションビルダー
・Salesforce 認定 Platform デベロッパー
・Salesforce 認定 Agentforce スペシャリスト

不動産業界のプロジェクトに1年従事。Salesforceでの業務改善についてApex、LWC、ExperienceCloud等を活用した要件整理を行う。