【SQL】クエリの可読性がUP!コメントアウトの活用法

【SQL】クエリの可読性がUP!コメントアウトの活用法

どうも、hosigakiです!
皆さんは、コメントアウトって知っていますか?

今日はコメントアウトの活用方法をご紹介します!

コメントアウトとは?

「コメントアウト」とは、クエリ内に書くことができるメモのことです。
コメントアウトは、決められた書き方を守れば、どれだけ書いてもクエリの実行結果に影響を与えません。

SELECT
    user_id #この文章がコメントアウトだよ
FROM
    users

コメントアウトを使いこなせば、クエリの可読性をUPさせることができるのでお勧めです!
さっそくコメントアウトの書き方を見ていきましょう!

コメントアウトの書き方

コメントアウトの書き方には、3種類あるので、お好みの書き方を使いましょう!

①コメント冒頭に # をつける

SELECT
    user_id  #シャープをつけると、コメントアウトになるよ
FROM
    users

②コメント冒頭に -- をつける

SELECT
    user_id  --ハイフンを2本連続で書くと、コメントアウトになるよ
FROM
    users

③コメントを /* */ で囲む

SELECT
    user_id  /*バックスラッシュとアスタリスクで囲むと、コメントアウトになるよ*/
FROM
    users

/*
こんな感じで、コメントアウトを
2行以上書くこともできるよ
*/

コメントアウトの活用法

複雑なクエリにコメントアウトをつける

以下のようなクエリを書く際は、後から見返したときにクエリ内容の理解を助けるため、コメントアウトをつけましょう。

  • たくさんのテーブルを連結したクエリ
  • 複雑な条件を記載したクエリ
  • 調べながら書いた、知識があやふやなクエリ

特に、自分以外の人もクエリを見る予定の場合は、理解しづらそうな部分や認識齟齬が生れそうな部分などにコメントアウトを残すことで、相手の理解を助けることができます。

■ コメントアウトがないクエリ。ぱっと見で理解しづらい。

DECLARE d1, d2 DATE;
SET d1 = "2022-8-1";
SET d2 = "2022-8-31";

WITH
purchase_user_list AS (
SELECT
    user_id,
    DATE(purchased_at, "Asia/Tokyo") AS purchased_date,
    RANK() OVER(PARTITION BY user_id ORDER BY purchased_at) AS purchase_times
FROM
    purchases
WHERE
    DATE(user_created_at, "Asia/Tokyo") BETWEEN d1 AND d2
    AND
    DATE(purchased_at, "Asia/Tokyo") BETWEEN d1 AND d2
),

p_count AS (
SELECT
    purchased_date,
    COUNT(user_id) AS n_of_purchase,
    SUM(CASE WHEN purchase_times >= 2 THEN 1 ELSE 0 END) AS n_of_repeat_purchase
FROM
    purchase_user_list
GROUP BY
    purchased_date
)

SELECT
    days,
    p_count.n_of_purchase,
    p_count.n_of_repeat_purchase,
    CASE 
        WHEN p_count.n_of_purchase = 0 OR p_count.n_of_purchase IS NULL THEN 0 
        ELSE p_count.n_of_repeat_purchase / p_count.n_of_purchase 
    END AS repeat_purchase_rate
FROM
    unnest(GENERATE_DATE_ARRAY(d1, d2)) AS days
    LEFT OUTER JOIN p_count
        ON days = p_count.purchase_date
ORDER BY
    days

■ コメントアウトがあるクエリ。コメントアウトの内容だけ見れば、どんな内容か想像がつく

/*d1からd2間の登録者の購入数中のリピート購入率を、購入日別で算出*/
DECLARE d1, d2 DATE;
SET d1 = "2022-8-1";
SET d2 = "2022-8-31";

WITH
--d1からd2間の登録者の購入レコード。user_id, 購入日, そのユーザーにとって何回目の購入か を算出。
purchase_user_list AS (
SELECT
    user_id,
    DATE(purchased_at, "Asia/Tokyo") AS purchased_date,
    RANK() OVER(PARTITION BY user_id ORDER BY purchased_at) AS purchase_times
FROM
    purchases
WHERE
    DATE(user_created_at, "Asia/Tokyo") BETWEEN d1 AND d2
    AND
    DATE(purchased_at, "Asia/Tokyo") BETWEEN d1 AND d2
),

--purchase_user_listを元に、購入日別の購入数とリピート購入数を算出。
p_count AS (
SELECT
    purchased_date,
    COUNT(user_id) AS n_of_purchase,
    SUM(CASE WHEN purchase_times >= 2 THEN 1 ELSE 0 END) AS n_of_repeat_purchase
FROM
    purchase_user_list
GROUP BY
    purchased_date
)

--p_countテーブルを元に、購入日別の購入数, リピート購入数, リピート購入率を算出。
SELECT
    *,
    CASE 
        WHEN n_of_purchase = 0 OR n_of_purchase IS NULL THEN 0  #0除算エラーやNULL値出力を防ぐために、率の分母が0もしくはNULLの場合は0と出力。
        ELSE n_of_repeat_purchase / n_of_purchase 
    END AS repeat_purchase_rate
FROM
    p_count
ORDER BY
    purchase_date

一部のクエリをコメントアウトする

  • スポットで分析しているとき
  • 定点観測用のクエリを作成しているとき

などで、例えば「クエリ内の一部の条件をなくした場合の抽出結果も見ることで、違った抽出結果にならないか否かを検証したい!」って時があると思います。

そんな時は、消したいクエリ部分をコメントアウトすることで、素早くそれを検証することができるのでお勧めです!
(以下の例では、7行目と8行目をコメントアウトしています。)

SELECT
    DATE(purchased_at) AS purchased_date,
    SUM(CASE WHEN product_name = "干し柿" THEN 1 ELSE 0 END) AS n_of_hosigaki_purchases
FROM
    purchases
WHERE
--    DATE(user_created_at, "Asia/Tokyo") BETWEEN d1 AND d2
--    AND
    DATE(purchased_at, "Asia/Tokyo") BETWEEN d1 AND d2
GROUP BY
    purchased_date
ORDER BY
    purchased_date

コメントアウトを駆使することで、クエリの読み手の内容理解を助けたり、より効率的に分析を進めることができます。
ただし、使いすぎて文字量が多くなったら、逆に可読性が落ちてしまうので注意!

可読性を意識しながら、コメントアウトを有効活用いただけると幸いです!

ここまで読んでいただきありがとうございました!
また次の記事でお会いしましょう(^^)/

-SQL
-, ,