RDBは、
・射影:列を絞り込む
・選択:行を絞り込む
・結合:2つの(物理ないし論理)表をつなげる
ことによって、新たな(論理)表を生み出し、必要なデータを取得する。
したがって、RDBを操作するSQLにおいても、SELECT文で、上記の操作を定義する。
■SELECT文と、RDBの操作との関係
SELECT文は
SELECT テーブル名.項目名,・・・・・
FROM テーブル名 なんとかJOIN テーブル名 ON 2つのテーブルを結ぶ条件
WHERE 選択条件文
ORDER BY 並び替え項目,・・・ DESC
GROUP BY グループ化する項目
HAVING 集合関数に関する条件
という形になる。このとき
1行目の SELECT テーブル名.項目名,・・で 射影
2行目の FROM テーブル名 なんとかJOIN で結合
3行目の WHERE 選択条件文で選択
になっている。したがって、この3行で、論理表のデータは取得できていることになる。
■論理表を作成した後で・・・
この論理表を元に、並び替えと、集合関数に関する操作ができる。
並び替えは、ORDER BY でおこない、
集合関数(COUNT(*) など、複数レコードにまたがる操作)を使っている場合、
その関数をグループ化するなら、GROUP BY 、さらに、その集合関数の操作に対し、
条件がつくならHAVINGとなる。
(集合関数の条件操作は、論理表が確定した「あと」の操作になるため、
論理表を作るために(=その状態では論理表確定「まえ」)設定するWHERE句では
指定できない)
■SELECT文作成戦略
これを受けて、SELECT文は、以下の手順で考えることになる。
(1)まず必要な項目(テーブル名.項目名)をあげよ
→それが、SELECT のところにかかれる
(2)(1)で上げた項目のテーブル名をあつめ、出てくるテーブルの
結合方法について、のべよ
→それが、FROM のところにかかれる
(3)(1)、(2)でできたテーブルのうち、必要なレコードを選択する
条件を述べよ
→それが、WHERE のところにかかれる
-----(ここまでで、必要なデータは取得されるはず)----
(4)もし、並び替えが必要なら、その際の項目と、昇順降順を考えよ
→これが、ORDER BYになる
-----(以下は、(1)で集合関数を使った場合)----
(5)(1)で集合関数を利用していて、グループごとに集計する場合、
その項目を挙げよ
→これがGROUP BYになる。
(6)その際、集合関数に関して、条件があれば、それを述べよ
→これがHAVINGになる。
こんなかんじ。
あ、サブクエリーの話が抜けてるけど(^^;)・・