リレーショナル・データベースの世界 .. 世界を集合で表現する(第9回 SQLでループ! 相関サブクエリの使い方〜切れ過ぎるナイフにご用心〜)
SQLの原理 は 世界を集合で表現する。
なるほど納得
http://www.geocities.jp/mickindex/database/idx_database.html
SQLを支える多彩な武器
1)CASE式
2)GROUP BY句、PARTITION BY句
群論の類別(PartionCut)を実装したもの。集合を切り分けて新たな集合を作る
3)HAVING句
集合に対する条件、つまり2階の条件を設定する
階(オーダ)の概念とSQLの集合指向という概念を理解できる。
4)EXISTS述語
HAVINGが集合論的な意味での2階の機能であるのにたいして、こちらは、
述語論理における2階の機能。 SQLのもつ唯一の高階関数
手続き型と集合指向の対比
SQLでは、集合を次々に組み替えて、求める集合にたどり着く
相関サブクエリの動作イメージは,(group by,partition by同様に)集合のカット
手続き型言語がレコード単位で考えるのに対し,
SQLがレコードの「集合」レベルで考える言語
相関サブクェリーによる性別による集合カットの例
SELECT * FROM Employees E1 WHERE age = (SELECT MAX(age) FROM Employees E2 WHERE E1.sex = E2.sex);
相関サブクエリの2つの側面
手続き言語的な観点から見た場合,相関サブクエリの持つ役割はループ隠し
集合指向言語的な観点から見た場合,集合のカット
- 変数のスコープの考察(E1とE2の範囲をみてみましょう)
INSERT INTO EmpMaxAge SELECT dept, name, age FROM Employees E1 WHERE age = (SELECT MAX(age) FROM Employees E2 WHERE E1.dept = E2.dept);
SQL には「変数」の概念は存在市内が、相関名にはちょっと変数っぽい性質がある
- 第一正規化、幽霊エラー
SELECT dept, name, age, (SELECT name FROM Employees E2 WHERE E1.dept = E2.dept AND E2.age = (SELECT MAX(age) FROM Employees E3 WHERE E2.dept = E3.dept)) AS max_age_name FROM Employees E1;
最高年齢の社員は2人いる場合、1行に2行を表示できずエラーとなり、
テーブル状態によって発生したりしなかったり
- LOOP
ある2点の時刻におけるデータを比較するためには行間比較が必要
手続き型言語でファイルを扱う場合には、こういう行間比較のためには「ループ」による処理 が基本、
代わりにSQLは、独自の原理に基づ
いた方法を用います。
いわゆる時系列分析
標準SQLの新しい機能であるOLAP関数を利用する方法
従来の自己結合(相関サブ クエリ)を使う方法の
2通り
SELECT LS0.sample_date AS cur_date, MAX(LS1.sample_date) AS latest FROM LoadSample LS0 LEFT OUTER JOIN LoadSample LS1 ON LS1.sample_date < LS0.sample_date GROUP BY LS0.sample_date;
以下説明用
SELECT LS0.sample_date AS cur_date, LS1.sample_date AS latest FROM LoadSample LS0 LEFT OUTER JOIN LoadSample LS1 ON LS1.sample_date < LS0.sample_date;
グループ関数MAXを使いたいのでGROUP BYをいれる、ってことだよね。きっと