リレーショナル・データベースの世界 .. 世界を集合で表現する(第9回 SQLでループ! 相関サブクエリの使い方〜切れ過ぎるナイフにご用心〜)

SQLの原理 は 世界を集合で表現する。

なるほど納得 

http://www.geocities.jp/mickindex/database/idx_database.html

SQL関数型言語
(集合と述語(特性関数)

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をいれる、ってことだよね。きっと