これからはじめる SQL 入門

レビューに参加した経緯で 技術評論社 さんから献本していただきました。ありがとうございます!

SQL とはなにか

本書は「データベースを操作するための言語」として、RDBMS とその実行環境として PostgreSQL を使って SQL 入門を行います。私自身、これまでおもに RDBMS を使ったシステム開発に携わってきたことから「データベース」と聞くと RDBMS を真っ先にイメージしてしまいます。本書ではローカル環境にインストールされたデータベースに対して実際に SQL を実行して、その結果を確認するといったようにインタラクティブに操作しながら学習を進めていきます。

一方で「Chapter 1 データベースと SQL」をレビューしていて私自身の「データベース」の背景についての誤解に気付いたり、SQL とはなにかと考えるよい機会となりました。もちろん本書は入門者向けに簡潔に説明されているので、データベースそのものやそのモデルの背景や歴史的経緯などについては説明されていませんし、これから SQL を学ぶ人たちが最初にそういったことを気にする必要もありません。

SQL は1980年代に生まれた技術であるそうです。古くからある技術がいまもなお使われ続けているということから多くの歴史的経緯や変遷を辿っていることが伺えます。いまも SQL が使われる分野は拡大されていて、仕様も拡張されつ続けています。直近で拡張された規格を3つあげると、2008年、2011年、2016年になるそうです。

例えば SQL:2016 を調べてみると、json を扱う機能であったり、Row Pattern Recognition という正規表現を使って特定の行グループを絞り込む (ログのような時系列なデータからグループ分割したものに条件指定して取り出す?) ための機能であったりが追加されています。その時代で求められる機能や要件を取り込みながら SQL は進化しています。「SQL とはなにか」という問いへの答えも、その時代でよく使われている用途に応じて変わっていくように私は思います。

本章の最後に「クラウドコンピューティングとデータベース」というコラムがあります。そのコラムではクラウド環境で利用される RDBMS の紹介に加え、DWH (データウェアハウス) のプロダクトの問い合わせにも SQL のサブセットが使えることが紹介されています。DWH も SQL を使うプロダクトの1つとして大きな領域です。ここでさらに wikipedia の Database#Examples をみると、データベースを分類する方法として3つの方法があると記載されています。

データベースを分類する方法として、1つ目は書誌、文書、統計、マルチメディアといったその内容の種類から、2つ目は会計、音楽、映画、銀行、製造業、保険といったアプリケーションの分野から、3つ目はデータベース構造やインターフェースの種類といった技術的な側面から分類されます。

これらの分類方法から wikipedia では DWH 以外にも様々なデータベースが紹介されています。記載されているもののうち、私が見聞きしたことのあるものだけを取り上げてみても以下のようなものがあります。

  • インメモリデータベース
  • クラウドデータベース
  • 分散データベース
  • ドキュメント指向データベース
  • 組込みデータベース
  • グラフデータベース
  • ナレッジベース

もちろん、関係モデルをデータ構造として扱うデータベースであれば、このような分類の違いをあまり意識することはないかもしれませんし、全く独自のクエリ言語を提供しているものもあるかもしれません。ついつい身近に使っているものだけをデータベースであるかのように錯覚してしまいがちですが、データベースには多くの種類があります。そして、その多くで SQL (またはそのサブセット) を使ってデータを操作できることは、ライブラリの再利用性、システムの相互運用性、学習コストの削減など、多くのメリットがあります。

今後も新しいデータベースが現れてくるでしょう。しかし、そのプロダクトが SQL (またはそのサブセット) を提供する限り、その分類に関係なくそのデータの操作ができます。SQL を使えるということは、IT エンジニアだけではなく、業務においてデータに関わるすべての職種、営業であったりマーケティングであったり、カスタマーサポートであったり、それ以外の多くの職種の人にとって重要なスキルとなるでしょう。

SQL を手打ちして慣れる

本書をレビューしていて過去のことを思い出しました。昔、私は SIer である基幹システムのヘルプデスクのような業務に携わっていました。お客さんから基幹システムのデータや処理についての問い合わせがあったときに調査して回答するといったような業務です。

基幹システムのデータベースにはお客さんの PC からもアクセスできる状態でした。データを直接みたいときにお客さんは Microsoft Access を使ってデータを確認していました。特定テーブルのデータをみる分にはそれで十分であったかもしれませんが、様々な調査のために複数テーブルのデータを結合し、ある条件でデータを絞り込みたいときなど、私宛に連絡がきて、私が SQL を使って該当データを調査して回答するといったことが日常でした。

Chapter 3の最後に「SQL を身に付けるには」というコラムがあります。

筆者の経験を踏まえて、1つアドバイスがあります。それは コピー&ペーストに頼らず、自分の手でタイプして体になじませる というものです。

このコラムに書かれている著者の経験に私は全く同意するところです。私自身も SQL に慣れるきっかけになったのが、日常的にお客さんから問い合わせを受けて、必要なデータを取得する SQL を手入力して調べたりしていました。

そして、SQL に慣れてきたときに運用工数を削減することを目的に、お客さんにも SQL を覚えてもらおうとしていた時期もありました。当時やり取りしていた情報システム部の担当者も自身のスキルアップを目的に SQL を学習したいと仰っていました。そこで問い合わせの回答をするときにそのデータを調査したときの SQL も添付して回答していました。そんなことを半年ぐらい行っていたのですが、残念ながらお客さんの方が SQL はやはりわからないと学習を断念してしまいました。

いま思い返すと、そのときに本書があったらまた違った結果になっていたのではないかと悔しく思います。まさに私がお客さんに提供していたのはコピー&ペーストできる SQL であって、お客さんが自分で手打ちして SQL を覚えるための仕掛けとして不十分であったことが本書を読んでいて実感した次第です。これから SQL を学習される方は、本書を読み進めながらコピー&ペーストせずに手打ちしながら SQL に慣れていくのを実践してみてください。

本文とコラムとのバランス

冒頭の「はじめ」のところで以下のように書かれています。

本書は、著者が初心に戻り「自分が SQL を学び始めたときにこのような解説書があればよかった」と思える一冊に仕上げようという思いで筆を執ったものです。

著者が IT エンジニアであるため、システム開発する上で迷うところやつまづきそうな落とし穴、有用な情報を「コラム」として所々で補足しています。SQL を学ぶという視点からは確かに副次的な情報であるため、そういった情報は本文に含めずにコラムとしてうまくバランスをとっているように思います。というのは、本書の読者は IT エンジニアだけではないと想定しているのだと思います。私がレビューしていて、こういった情報もあった方が良いのではないかと指摘したこと・しようと思ったことの大半がコラムで簡潔にまとめられているので親切な入門書になっていると思います。

コラムの目次がないのはもったいないと思ったので以下にまとめてみました。

Chapter 1 データベースとSQL

Chapter 2 PostgreSQL環境の準備

  • Column: 環境構築やツールに関する補足情報 ・・・ 42

Chapter 3 データの取得と絞り込み(SELECT)

  • Column: ORDER BY 句を省略した場合の並び順 ・・・ 57
  • Column: OFFSET 句の代替 ・・・ 82
  • Column: SQL を身に付けるには・・・ 84

Chapter 4 データの作成・変更(INSERT,UPDATE,DELETE)

  • Column: CRUDSQL ・・・ 102

Chapter 5 データ型

  • Column: 文字型をどう使い分けるか? ・・・ 114
  • Column: 符号なし整数を扱うデータ型は? ・・・ 118
  • Column: シーケンスの重複を自動で防ぐには? ・・・ 125
  • Column: もっと複雑な配列も扱える ・・・ 135
  • Column: そのほかのデータ型 ・・・ 138
  • Column: JSON 型の使いどころ ・・・ 143

Chapter 8 テーブルの結合

  • Column: AS も省略できる ・・・ 205

Chapter 9 サブクエリ

  • Column: IN と EXISTS の違い、JOIN への書き換え ・・・ 240

Chapter 10 一歩進んだ SQL

  • Column: 全文検索システム ・・・ 251
  • Column: WHERE 句で関数や演算子を使う際の注意 ・・・ 252
  • Column: WITH 句を使った SELECT 文 ・・・ 263
  • Column: ほかの RDBMS での UPSERT ・・・ 266
  • Column: オートコミット ・・・ 273

Chapter 11 データベースとテーブルの操作

  • Column: 複数の制約を組み合わせる ・・・ 287
  • Column: ほかの RDBMS では列の場所を指定できる? ・・・ 287
  • Column: VIEW の変更 ・・・ 314
  • Column: データベースと日本語 ・・・ 315

まとめ

本書は SQL を段階的に学んでいく上で丁寧な解説と構成になっています。そのため、どちらかと言えばシステム開発に直接関わらない人向けにとってよい入門になると思います。冒頭でも述べた通り、データベースの重要性や SQL の応用範囲は広がる一方です。本書がデータを扱うすべての職種の人にとって SQL を学ぶきっかけになればと思います。

これからはじめる SQL入門

これからはじめる SQL入門