スッキリわかるSQL入門を読んだ
業務でLaravelのORMを触る機会が増えてきたのですが、SQLについてまったく知識がないので入門書を読んでみました。
その中で覚えておきたいと個人的に感じた箇所を残しておきたいと思います。
比較演算子
比較演算子で「等しくない」は != ではなく <> と書く。
LIKE演算子で使えるパターン文字
IN / ANY / ALL 演算子
集計関数
(SUM, MAX, MIN, AVG, COUNT)はSELECT文で使用できる。ORDER_BYまたはHAVING句の中で利用する。
WHERE句には利用できないので、集計処理後に絞り込みたいときはHAVINGを使う。
副問合せ(サブクエリ)
SQLの内部(カッコ内)に別のSELECT文をネストして記述すること。
検索結果のパターンは主に3つ。
・単一行(1行1列)
・複数の値(n行1列)
・表形式の複数値(n行m列)
ここの章に関しては、前章までで身につけたSQL関数をネストして利用する例について解説がありました。
日本語の解説だったので、個人的には、もうすこし複雑なサンプルデータに対して実行するクエリについての解説がほしかったかなと感じました。
内部結合(INNER JOIN)
結合について、内部結合と外部結合で結果がおおきく変わるので忘れないようまとめました。
内部結合は費目テーブルにidが2つ見つかった場合、家計簿テーブルの行数を複製されます。
結合相手がない場合は・・・?
id: 4が費目テーブルにない場合は、家計簿テーブルの行(昼食)が結果から消滅します。
もし、結合相手が見つからなくてもNULLでも出力したい場合はLEFT JOINを使います。
左外部結合(LEFT JOIN)
LEFT JOINを使うと、左表に結合相手が見つからなくても、すべての値がNULLの行を新たに生み出して結合します。
左外部結合以外にも、右外部結合・完全外部結合があり、総称して外部結合(outer join)といいます。これは内部結合と違って本来消滅する行も強制的にNULLとして出力します。
トランザクションって?
名前は聞くけど、あまり理解出来ていなかったので・・。
安全で確実なデータ操作・データ管理がとっても大事です。たとえば急にコンピューターの電源が落ちて、SQLの処理が中断されてしまうといったケースもあるかも・・。
そうならないようにDBMSに対して複数のSQLを送る際に、SQL文をひとかたまりとして扱うよう指示します。この処理のかたまりを「トランザクション」といいます。
トランザクションに含まれる複数のSQL文は「すべて実行されたか」「1つも実行されていないか」の状態になることが保証されています。
コミットすることでトランザクション中のすべての処理が確定(デフォルトで自動コミットモードになってる)、ロールバックをするとトランザクション中のすべての処理がキャンセルされます。
インデックスについて
テーブルの列に対して、索引情報を生成することができる。
これでメモの行が「給料」の行を探したいときに、「4/11と5/11の行にある」とすぐに分かります。逆にインデックスがない場合、片っ端から探すことになります。
インデックスが存在する列の検索は多くの場合高速になるが、書き込み性能の低下を招くこともあるので濫用は禁物です・・。
最後に
入門書ということで、新入社員と先輩社員が読者と一緒に勉強していくストーリーになっています。
新入社員「ぜんぶインデックスつければいいんですね!」先輩社員:「いやいや・・・」のように会話形式で説明してくれるのが分かりやすかったです笑。
全体を通してSQLのクエリより、日本語の説明文が多い印象でした。
その分、「SQLでできること」は分かりやすかったですが、個人的にはすぐに業務で使うイメージが湧きにくかったです。もうすこし具体的なサンプルデータを用いての解説があったら良かったなと感じました。
各章のおわりにドリル(練習問題)がついているので、これを問いたら体系的に身につくかも。
参考
スッキリわかるSQL入門 第2版 ドリル222問付き! スッキリわかるシリーズ 中山清喬
スキ頂けると嬉しいです〜