今日はなにの日。

気になったこと勉強になったことのメモ。

今日は、SQLに似たSOQLって何の日。

とある日

Qiitaのトレンドを、見ててをある記事1があった。

その記事のタイトルにSOQLってあって、

なにこれSQLに似てる。関係あるのかなと思いクリック。

え。これはもうSQLじゃん。はじめてみた。ってことでググっみた。

SOQLとは

ググった結果、一番上2に出てきたものをとりあえず見てみた。

SOQL および SOSL の概要

Salesforce のカスタム UI を作成している場合、Salesforce Object Query Language (SOQL) と Salesforce Object Search Language (SOSL) の API を使用して、組織の Salesforce データを検索できます。 Salesforce 専用に設計された類似の言語って感じらしいが、Salesforceってなにとなった。

SOQLとは

ググった結果、一番上[^2]に出てきたものをとりあえず見てみた。

SOQL および SOSL の概要

Salesforce のカスタム UI を作成している場合、Salesforce Object Query Language (SOQL) と Salesforce Object Search Language (SOSL) の API を使用して、組織の Salesforce データを検索できます。 Salesforce 専用に設計された類似の言語って感じらしいが、Salesforceってなにとなった。

Salesforceとは

顧客管理ソリューションを行っていて、SaaS型のアプリケーションとなってようです。

様々なサービスを展開してる。ただお金がかかるので自分には使えない。

SOQLとSQLどこが似てるのか

まず、どちらともデータベースに対して操作を行う際に使用される。

様々な点において酷似している点があるのだが、 今回は個人的に気になった3つを挙げます。

1.SELECT

SELECTはテーブルからデータを取得する際に使用される。

SQL SELECT句

SELECT * FROM dual;

SOQL SELECTステートメント

SELECT CreatedDate, Name, Phone, Type FROM Account

SELECTで取得する列名を記述してFROMでどのテーブルから取得するか記述されている。

ホント見た目は、SQLとSOQLそっくりですね。

2.集計関数

COUNTで個数、AVGで平均値、SUMで合計値を集計する関数である。

SQL集計関数

SELECT id, COUNT(*) , AVG(age), SUM(salary) FROM employees;

SOQL 集計関数

SELECT COUNT(Id) FROM Account

SOQLには、他にも集計関数が用意されている。

関数 説明
AVG 数値項目の平均値を返します。
MAX 項目の最大値を返します。
MIN 項目の最小値を返します。
SUM 数値項目の合計を返します。
COUNT クエリ条件に一致する行数を返します。

説明もSQLとSOQLには変わりはない。

基本的な集計関数だけが用意されている感じ。

STDDEV関数(標準偏差)やVARIANCE関数(分散)など計算を行う関数は調べた感じなさそうです。複雑な処理を行う関数は実装してなさそうですね。

3.比較演算子

=、<、>のことを指しSQLだけでなくプログラミング言語等にも存在する。比較された値に対する評価を返す。 他にもINやLIKEなどが存在する。

SQLの比較演算子

SELECT * FROM employees WHERE id = 5 AND salary > 1520 AND manager_id <= 3306;

SELECT * FROM employees WHERE manager_id IN (SELECT id FROM employees);

SOQLの比較演算子

SELECT Name FROM Account 
WHERE BillingState IN ('California', 'New York')

比較演算子に関しても同じ動きをするようです。 ただ、LIKEやINに関してはSQLとは違う動きをする場合があるようなので注意が必要。

SOQLとSQLどこが違うのか

違う点については、かなり多いのですが面白いと思った3つをあげます。

1.DMLの種類

SQLでは、DMLはSELECT INSERT DELETE UPDATE などがありますが、SOQLではSELECTのクエリのみしかないそうです。
それと、SELECT句でワイルドカードの*もSOQLでは存在しない。使用した場合問題が発生するらしいので怖いですな。

2.NULL比較

このNULLに対する扱い方がSQLとSOQLでは大きく違います。

SQL

SELECT * FROM dual WHERE id IS NULL;

SOQL

SELECT AccountId
FROM Event
WHERE ActivityDate != null

SQLだとNULL比較する際に、IS NULLという述語を使う必要がありますが、SOQLだと数値リテラルや文字リテラルと同じように比較演算子の=と!=を使ってNULLを比較する。

3.日付形式と日付リテラル

DBMSには、様々な日付を扱う関数が存在します。

SQL

add_months  :数ヵ月後の日付を求める
months_between:2つの日付の間に何ヵ月あるか求めるには

SOQL TODAY   :本日の 00:00:00 から、その 24 時間後までが指定されます。
THIS_MONTH:今月の最初の日の 00:00:00 から、その月のすべての日が指定されます。

SQLは、日付を使って演算をする関数があるですが、SOQLには指定された範囲の中から日付・時刻を返す関数しかないです。

どうやら、SOQLには日付リテラルや数値リテラルの演算を行う関数などは実装されていないらしい。

まとめ

SQLとSOQLは確かに似てはいたのだが、使える機能の範囲や値に対する細かい仕様が違った。

SOQL新しい機能があるのかと期待したがそんなのものは特になく、使える機能が少なく少し残念だった。

まぁ、SOQLを使う予定はないですが、面白い新発見でした。

更に詳しい内容は、公式のリファレンスをどうぞ。

Salesforce Developers

SQL から SOQL への移行 単元 | Salesforce Trailhead