SELECTと集合とActiveRecord

SELECTと集合とActiveRecord

SQLとは集合演算である」しか知らなかった状態からもう少し計算機上の処理というところにまで踏み込んで学習をしたのでその橋渡し的な部分についてまとめます。同様の知識状態の方は末尾の参考文献に上から順に触れると良いでしょう。「穀物の英語」は別にいいです。
本記事は学習のまとめとしての位置づけが強く、内容の正確性は保証できません。誤り等ございましたらコメントにてご指摘いただけると幸いです。

select文

SQLにおける基本であるselect文は全体集合における集合Aと集合Bの直積として表される。

  • SELECT [集合A] FROM [全体集合] WHERE [集合B]
  • SELECT [カラム名] FROM [テーブル名] WHERE [条件]
-- 21世紀以降の三大穀物の生産高を取得
SELECT rice, wheat, maize FROM Grain WHERE year > 2000 ;

集合Aは列(カラム/column)に対する操作、集合Bは行(ロー/row)に対する操作であり、文字通りそれぞれ直交している。集合演算としては任意のテーブルΩという全体集合から集合Aと集合Bの両方に属するものを取り出してくることを意味する。

ここではテーブルを全体集合としてとらえた。直感的にはDBMSで管理されているデータすべてが全体集合とするほうが自然だが、SELECT文での操作対象としての全体集合は指定されたテーブルである。FROM節でDBMSから部分集合を切り出してきて、それをSELECT文における全体集合として再定義していると考えると良いかもしれない。今までx∊ℝで考えてきたが、この命題ではx∊ℤについて考える、というのと構造的には同じ。ところでFROM節なんていう用語はあるのでしょうか。


DBMS

データ・ファイルとデータ管理プログラムのセットのことを「データベース管理システム(DBMS=Data Base Management System)」と呼びます。そうです! 現在では,DBMSのことをデータベースと呼ぶのです。マイクロソフト社のSQL Serverや,オラクル社のOracleなどは,市販DBMSの代表です。身近なところでは,Microsoft Officeファミリの一製品であるAccessDBMSです。
忙しいあなたのためのSQL入門 第1回(1)

とのことです。たぶんMySQLSQLiteDBMSでしょう。
DBMSで管理されているデータ」というのは雑な言い方をすれば「すべてのテーブル」ということです。


select文でとってきたデータはビューという仮の集合に送られる。Acessではビューに対してそのまま次のSQL文(クエリ)を発行することができる。MySQLSQLiteでは何もしないとビューは標準出力となり文字通り見ることしかできずその場でメモリから消滅するので明示的にビューを作成する必要がある。

ActiveRecord

SQLの記法は英文としては自然だが集合Aや集合Bよりも大きな全体集合がそれらにはさまれる形になっている。

それに対し、ActiveRecord、すなわちRuby on Railsでの記法はテーブル名をクラス名と対応させることによって、その集合に対する集合演算であるということがより視覚的にとらえやすくなっている。SELECT文を英文として見て日本語訳した場合もこの順番が自然になるため日本語話者的にもうれしい。

  • [クラス名].where([条件])
# 21世紀以降の生産高を取得
g21 = Grain.where("year > 2000")

カラム名を意味する集合Aの指定が抜け落ちており、対象とするテーブル=集合とその中における条件という構成になってる。Rubyのコードなので集合演算の結果はビューではなくクラスの実体(オブジェクト)として渡される。集合Aに対応するカラム名については受け取った実体のメンバ変数としてアクセスできる。ちなみにgrainは不可算名詞です。

補足

SQLは大文字と小文字の区別はないとのこと。HTMLと同じですね。今回はテーブル名やカラム名と区別がつきやすいように大文字にしています。

参考文献