SQLのSELECT
文を書く際、キーワードの役割や各句の順番がよくわからなくなる(おじさんだからだ)。そこで、同文で使われる主要な句の種類と順番の覚え方をまとめてみる。
なお、SQLiteのドキュメントを参考にしているが、どのSQLでも大枠は変わらないはずである。
SELECT文で使う主なキーワードの種類
それぞれのキーワードが何をしているかを理解すれば、それを記述する順番は考えればわかるようになる。きっとなるはずだ。
キーワード | 概要 |
---|---|
テーブル名1 INNER JOIN テーブル名2 ON 条件式 |
条件式に基づいてテーブル名1とテーブル名2を横に結合する。 |
WHERE 条件式 |
条件式に基づいて行をフィルタリングする。 |
GROUP BY 列名 HAVING 条件式 |
指定した列の値が同じ行を1つのグループにまとめる。グループをフィルタリングしたい時はHAVING 句を使う。こちらは任意。 |
ORDER BY 列名 |
指定された列名に基づき、結果を並び替える。 |
LIMIT 行数 |
必要な行数を、上から数えた行数で取得する。 |
目的はSELECT
文の構造の大枠を把握すること(そして各句の記述順を覚える助けとすること)であるため、各キーワードのオプションについては省略する。
個人的な感覚では、混乱しやすいのはWHERE
の位置ではないかと思う。なぜ混乱しやすいかと言えば、WHERE
が何に対する条件なのか直感的に把握しづらいためだ。
改めて、SELECT
文の処理の流れを整理してみたい。
SELECT文の処理の流れ
- データを取得するテーブルを定める…
FROM
句 - 2つ以上のテーブルが必要なら1と結合する…
JOIN
句 - 一部の行を取得したい時はフィルタリングする…
WHERE
句 - グループで集約したい時はグループ化する…
GROUP
句 - 一部のグループを取得したい時はフィルタリングする…
HAVING
句 - 並び替えたい時は並び替える…
ORDER BY
句 - 取得する数を制限したいときは制限する…
LIMIT
句
整理した。先のテーブルとだいたい同じだ。とはいえ、取得したいデータに応じて、SELECT文が合理的に構成されていることがわかる。
句の順番の覚え方のコツ
SELECT
文の処理の流れに基づいて、各句を覚える際のコツをまとめる。
FROMとJOINはセット
JOIN
をどこに使うかも、地味にややこしく感じる。これはFROM
とセットで使われることを覚えておけば混乱しない。
また、ON
は結合条件であるが、見方を変えればフィルタリング条件である。そのため、この時点ではWHERE
はいらない。
WHEREは個々の行を絞る
WHERE
は、FROM
で得られたテーブル(単純なテーブル、あるいは結合して得られたテーブル)の個々の行をフィルタリングするために使う。
JOIN
をFROM
のオプションと理解していれば、単純な構造なので覚えやすいかと思う。
ちなみに’where’は、数学的な定義や証明の中で、式や変数が特定の特性を持つことを示すために使われる。SQLのWHERE
キーワードは、このニュアンスで使われている。
HAVINGはGROUP BYの条件文
SQLには、ON
やWHERE
、IN
など、条件のニュアンスを持つキーワードが複数存在する。GROUP
をフィルタリングするためにどのキーワードを使うかも、慣れるまでは悩ましい。
身も蓋もないが、『ある特定の条件を「持っている」グループを選ぶ』というように覚えるしかない。グループは何かを「持っている」ため、ぼっちには居る「場所」がない、とでも覚えておく。
また、HAVING
キーワードは基本的に集約関数と併用する点にも注意したい。これは、HAVING
句がグループ化された結果に対して適用される条件であるためだ。HAVING
句が偽のグループはそのまま破棄される。
なお、HAVING
句うに集約関数以外を指定すると、任意の行が選ばれる。エラーは起きないが、結果は予測しづらくなる。
ORDER BYは結果を並び替える
ORDER BY
は、諸々の操作をした結果をソートするために使う。そのため書く場所は最後、ではなく最後から2番目である。
とはいえ結果が出た後に実行されることを理解していれば、書く場所に迷うことはない。
LIMITは最後に取得する結果の行の範囲を絞る
LIMIT
は最後に書く。LIMIT
という単語のイメージにも、なんとなく限界感があるので、こちらも覚えやすいかと思う。
おしまい。