見ての通り、絶賛書きかけだよ
弊社では職種を問わずSQL(SELECT文)を書いて、分析や簡単な自動化を行ったりする機会があります。
ただ、SQLは(構文や概念が独特という意味で)難しいので、SELECT文に限って、段階を踏んできっちり説明する資料が欲しいと思い、つらつらと書いていきます。
この記事は、データベースを作っていく立場ではなく、既に存在するデータベースを参照して何か情報を得ようとする人に向けて書いています。入門書だとたいてい、環境構築にそれなりのページが割かれるのですが、そこは社内的に必要ないので省略します。
MySQLで使える構文をベースに解説していきます。
はじめに
- SELECT文とは、データの集合を加工し、別のデータの集合を作っていく構文です。
- 変数やループは使わず、集合全体を、くっつけ、削り取り、集約し、またくっつけ、…というふうに書きます。このイメージを掴むことがとても大事。
- 本職のプログラマでもSQL苦手という人がいます
- 手続き型言語とはだいぶ違う思考回路が必要なので、覚えるとプログラマとしての幅が広がるかもしれません。
- SQLの構文キモいって言ってる偉い人(C. J. Date)もいるので、難しいと思うのはあなたがアホだからではありません。SQLが悪い。SQLが悪いということにしていいので、諦めないでね。
目次(予定)
基礎編
- データと表
- スカラ値いろいろ
- その場で表を作る
- 表の加工
- 列を減らす (project 射影)
- 行を減らす (WHERE句、restrict 制限)
- 縦方向にくっ付ける (UNION 和)
- 横方向にくっ付ける (NATURAL JOIN 自然結合)
- 左右でバランスが悪い場合その1 (LEFT OUTER JOIN 外部結合)
- 左右でバランスが悪い場合その2 (INNER JOIN 内部結合)
- 考えうる全ての組み合わせを作る (CROSS JOIN デカルト積)
- 並び替え (ORDER BY)
- 件数制限 (LIMIT)
- 加工した表を更に加工する (サブクエリ)
- 1x1の表 (スカラサブクエリ)
- 区切って集約 (GROUP BY)
- 相関サブクエリ (EXISTS)
- スカラ値の加工
- CASE式
- CONCATによる文字列結合
雑学編
- NULLの理解
- 真偽値
- SELECT文の実行順序
- MySQLの日時の扱い
組み合わせ編
- 最大/最小の取得 (ORDER BYとLIMITの組み合わせ)
- 時間ごとの集計 (GROUP BYと集約関数)
- 抽選 (ORDER BY RAND)
- 表と表の比較
現実世界編
- パフォーマンスチューニングの考え方
- インデックスの基礎
- OR条件をUNIONにする
- 平らにする
- サブクエリの大きさを気にする