【Tips 紹介】抜け・漏れ・ダブりのないSQL 文を書くための「アウトプット → インプット → 処理」フレームワーク
目的
この記事では、短時間で抜け・漏れ・ダブりないSQL 文を書くTips を紹介します。☺️
SQL 文の中でもCRUD 操作に代表される DML(データ操作言語) を取り上げます。このため、JOIN 句を交えた、簡単なSELECT 文レベルの SQL 構文の知識があることを前提 にしています。
背景
これまで、多くの時間をSQL の学習に費やしてきました。
これまでのアプローチは、量を重要視したアプローチ で、多くのSQL を書き、身体で構文を覚えるアプローチでした。😓 一方、このアプローチは、触ったことのないデータベースや、未知の問題を解く際にはパフォーマンスが劣る ことを以前から認識していました。🤔
方法
そこで、「アウトプット → インプット → 処理」 の順番に考えると、初見のデータベースや、未知の問題でも抜け・漏れ・ダブりないSQL 文を設計できることに気がつきました。💡この記事では架空の「従業員データベースから、部署毎に従業員の平均年齢を求める」というお題で説明を進めます。正解SQL 文は以下の通りです。このSQL 文では、従業員に関する情報を持ったemployees テーブルと、部署に関する情報であるdepartment を内部結合し、部署idと、部署名毎に従業員の平均年齢を求めています。🤔
SELECT
d.id AS department_id,
d.name AS department_name
AVG(age) AS avg_age_by_department
FROM
employees e
JOIN
department d
ON
e.dept_id = d.id
GROUP BY
d.id,
d.name
ORDER BY
avg_age_by_department DESC
;
アウトプット - このデータベースから、取り出したいカラムや、求めたい値は、何だろう?
アウトプット は、データベースから取り出したいカラムや、集計で求めたい値を指します。今回のお題では、部署IDの d.id、部署名 d.name、平均年齢 avg_age_by_department が該当します。
インプット - アウトプットのために、必要なインプットは、何だろう?
インプット は、アウトプットに必要なインプットとなる、FROM 句以下のテーブルを指します。
今回のお題では、従業員テーブル employees、部署テーブル department が該当します。
処理 - どんな処理が必要だろう?
処理 は、アウトプットに必要な処理を指します。JOIN 句による結合、SUM、AVG、MAX 等の集約関数、IFNULL、COALESCE 関数による値の置換、テーブルやカラムのエイリアス指定を指します。今回のお題では、内部結合、AVG 関数、AS 句によるエイリアスが該当します。🤔
結果
- 「アウトプット → インプット → 処理」のフレームワークに沿うと、必要なカラムやテーブルが整理され、未知の問題でも、楽にSQL を書ける ようになりました。
- 又、初見のデータベースでも、短時間でデータの抽出や加工ができる ようになりました。☺️
考察(示唆)
- このフレームワークの肝は、欲しいアウトプットを決めるところから始める 点にあります。その上で、アウトプットに必要なインプットと処理を考え、書き出す点が重要です。
- 今回はDML を取り上げましたが、DCL(データ制御言語)、TCL(トランザクション制御言語) にも応用できると考えています。🤔
結論
- 構造的な思考法を取り入れると、プログラミングの勉強は、ずっと楽になる と痛感しています。
- 今後は Python やJava 等の他言語への応用についても、研究してみたい と考えています。🤔
出所
「アウトプット → インプット → 処理」フレームワークではありませんが、SQL 文の学習に役立った書籍を紹介します。☺️
Discussion