多重の入れ子構造を使って巨大なSQLを書くと、SQLが肥大化しがちです。するとSQLの可読性が下がり、メンテナンスが難しいという問題が発生する場合も。今回は、そんな複雑になりがちなSQL文を見やすくきれいに整形する方法をご紹介したいと思います。
1. SQLの整形とは
SQLの整形とは、SQLの体裁を整えて、書いた人以外の人が読んでも一発でその内容が理解できるような形にすることです。
SQLが数行程度で済むうちは大丈夫ですが、行数が増えてくると「コードの読みやすさ」は最重要課題になります。特に開発の現場では次のような問題が発生します。
• チームメンバーが解読に困って、チームでの作業に支障が出る
• 保守を引き継いだ人が解読に困って、改修やメンテナンスの作業に支障が出る
• 文法ミスや「,」や「;」の打ち忘れが、どこで発生しているのか見つけ難い
一行の長いSQL文があった場合、決まったポイントで改行やインデントを加えます。するとどこが抽出対象でどこが抽出条件なのかなどを、パッと見て把握しやすくなります。
例えば、次のようなSQLがあったとします。
SELECT num, name FROM user_table WHERE country = 'JPN' AND age >= 20 AND age <= 30 AND ( grade = 'A' OR grade = 'C' OR grade = 'D');
これを改行で整形すると、次のようになります。
SELECT
num,
name
FROM
user_table
WHERE
country = 'JPN'
AND age >= 20
AND age <= 30
AND (
grade = 'A'
OR grade = 'C'
OR grade = 'D'
);
こうしておくと、どこから何をどんな条件で操作しようとしているSQLなのかを、後日ぱっと見たときや、専門外の人が見たときでも、内容を把握しやすくなるのです。
さらにこの条件の場合、もっとすっきりとさせることもできます。
SELECT
num,
name
FROM
user_table
WHERE
country = 'JPN'
AND age BETWEEN 20 AND 30
AND grade IN ( 'A', 'C', 'D');
それでは、整形の仕方を詳しく見ていきましょう。
1.1 基本的な整形ルール
基本的な整形ルールとして、インデントの活用や大文字、小文字の使い分け、条件(ANDやOR)の位置を揃えるなどが挙げられます。このルールには国際標準などはなく、個人の好みや現場の取り決め(コーディング規約)によって異なるルールを設定して書かれているような状況ではありますが、ここでは、よく見かける整形ルールをご紹介したいと思います。
1.1.1 インデント
上でも挙げましたが、このようにずらっと一行に書かれたSQLがあったとします。
SELECT num, name FROM user_table WHERE country = 'JPN' AND age >= 20 AND age <= 30 AND ( grade = 'A' OR grade = 'C' OR grade = 'D');
これを改行とインデント※ で整形すると、次のようになります。
※ インデント:行頭に空白やタブを入れること
SELECT
num,
name
FROM
user_table
WHERE
country = 'JPN'
AND age >= 20
AND age <= 30
AND (
grade = 'A'
OR grade = 'C'
OR grade = 'D'
);
1.1.2 大文字・小文字を使い分ける
かつてSQLといえば、仕様の関係上、全ての文字が大文字という時代もありました。しかし今では、大文字と小文字を使い分けることができます。人や現場によってルールが異なりますが、例えばSQLの構文(SELECTやINSERTなど)は大文字、テーブル名やカラム名を小文字といったように使い分けると、構文の部分と固有名の部分が見分けやすくなるという意見が多いようです。
■ 全て大文字の場合
SELECT
ID,
NAME
FROM
USER_TABLE
WHERE
COUNTRY = 'JPN'
AND AGE BETWEEN 20 AND 30
AND GRADE IN ( 'A', 'C', 'D');
■ 大文字と小文字を使い分けた場合
SELECT
id,
name
FROM
user_table
WHERE
country = 'JPN'
AND age BETWEEN 20 AND 30
AND grade IN ( 'A', 'C', 'D');
1.1.3 AND/ORの条件は行の先頭に記述する
ANDやORといった条件は、行の先頭に記述することでも可読性を改善できます。
■ 行の末尾に記述した場合
(略)
WHERE
country = 'JPN' AND
age >= 20 AND
age <= 30 AND (
grade = 'A' OR
grade = 'C' OR
grade = 'D'
);
■ 行の先頭に記述した場合
(略)
WHERE
country = 'JPN'
AND age >= 20
AND age <= 30
AND (
grade = 'A'
OR grade = 'C'
OR grade = 'D'
);
1.2 SQLの整形を行う方法
次に、このSQLの整形作業を効率的に行うための手段にはどのようなものがあるかを、ご紹介します。
1.2.1 SI Object Browserを使う
Oracleデータベースを利用している環境では「SI Object Browser」を導入している現場も多いです。SI Object Browserには「SQL整形」という機能があり、SQLの自動整形を行ってくれるので便利です。
まずは自動整形を行い、自動整形でも可読性が十分ではない箇所を手動で直すと良いでしょう。
1.2.2 手作業
SI Object BrowserのSQL整形機能で対応しきれない微調整などには、高機能テキストエディタの利用がおすすめです。Windows標準のメモ帳でも対応することができますが、作業効率がぐんと変わります。
筆者がSEの実務で使用していたオススメは、サクラエディタです。インストールせずに使うこともできるため、自分にインストール権限のないPCなどでも使用することができます。特にSQL整形には矩形選択がとても便利ですので、興味のある方はそちらの記事もご覧下さい。
なおSQLの強調キーワード(構文を自動で色分けしてくれる機能)も、初期機能で設定されています。
1.2.3 外部サービス
SQLの自動整形ができるWebサイトを使って、オンラインで整形する方法もあります。ただしこの場合、そのサービスに整形したいSQLを送信することになります。つまりSQLに含まれる個人情報や顧客情報資産を、漏洩させてしまう恐れがあるのです。
項目の内容だけでなく、業務で作成されたSQLであればそのソース自体が、外部への持ち出し禁止とされている現場は多々あります。
そのため無料ツールサイトを業務で使用することはおすすめできませんが、個人開発などの場合であればとても便利に使える場面もあるので、使い分けに気を付けて活用して下さい。
2. オンラインで無料で使用できるSQL整形ツール3選
業務情報を扱う場合は利用できませんが、個人開発などの場面であればオンラインの無料ツールはとても便利です。ここでは、3つのおすすめサイトをご紹介します。
2.1 SQL文整形(ラッコツールズ)
▸ サイトURL:https://rakko.tools/tools/37/
インデントや改行を調節して、SQL文を整形します。複数のオプションが選択できるので、お好みのSQL文に一発で整形可能です。
■ 整形前
SELECT num, name FROM user_table WHERE country = 'JPN' AND age >= 20 AND age <= 30 AND ( grade = 'A' OR grade = 'C' OR grade = 'D');
■ 整形後
SELECT
num,
name
FROM
user_table
WHERE
country = 'JPN'
AND age >= 20
AND age <= 30
AND (
grade = 'A'
OR grade = 'C'
OR grade = 'D'
);
2.2 SQLフォーマッターFor Web
▸ サイトURL:https://atl2.net/webtool/sqlフォーマッターfor-web/
こちらもインデントや改行を調節して、SQL文を整形します。こちらはカンマやAND/ORの位置を前か後か、お好みで選ぶことも可能です。
■ 整形後
SELECT
num,
name
FROM
user_table
WHERE
country = 'JPN'
AND age >= 20
AND age <= 30
AND (
grade = 'A'
OR grade = 'C'
OR grade = 'D'
)
;
2.3 Instant SQL Formatter
▸ サイトURL:https://www.dpriver.com/pp/sqlformat.htm
海外サイトですが、日本語も文字化けせず利用することができます。英語ではありますが、テーブル名やカラム名の大文字小文字化などの設定可能部分が最も多いサイトです。
■ 整形後
SELECT num,
name
FROM user_table
WHERE country = 'jpn'
AND age >= 20
AND age <= 30
AND ( grade = 'a'
OR grade = 'c'
OR grade = 'd' );
3. SQLやデータベースに関する案件の例
最後に、現在プロエンジニアに掲載されているデータベース関連のおすすめ案件をご紹介します。
自社サービス向けのデータ分析支援を行うエンジニアを募集する案件です。月額単価は90万円~で、スキル見合いとなっております。
詳しくは案件情報ページをご覧下さい。
▸ データエンジニア★自社サービス向けデータ分析支援
新システムのデータベース設計を行い、旧システムのデータベースからデータ移行作業まで行う案件です。月額単価は70万円~で、スキル見合いとなっております。
詳しくは案件情報ページをご覧下さい。
▸ データベースエンジニア★勤怠・購買管理システムのデータ移行
4. まとめ
SQLの整形ルールや方法について、いかがでしたでしょうか。整形ルールには国際規格や標準といったものがないのが現状で、それぞれが好みで行っている場合もあります。ですが開発現場によってはコーディング規約や暗黙のルールがある場合もありますので、先輩などに確認してみることもおすすめです。個人で開発する場合でも、SQLは特にきれいに整えると可読性と保守性がぐっと上がったことが実感できるものです。長いSQLを扱う際には、ぜひ実践してみて下さいね。