SQLアタマアカデミー
第9回 SQLでループ! 相関サブクエリの使い方~切れ過ぎるナイフにご用心~ (2)相関サブクエリ
相関サブクエリ
では次に,
手続き型言語で解く場合
もしEmployeesテーブルがCSV
- max_
ageという整数型の変数を用意し, 0で初期化する - レコードを1行ずつ走査する
- カレントレコードのsexが
「男」 ならば, ageとmax_ ageを比較し, ageのほうが大きければ, max_ ageにageを代入する - すべてのレコードについて走査したら,
max_ ageを男性の最高齢値として返す - 2.からの処理を,
女性についても繰り返す
ここでは,
- 注1)
- リレーショナル型のオブジェクトではない,
通常のテキストエディタで編集可能なファイルのことです。
SQLで解く場合
一方,
リスト2 相関サブクエリ
SELECT *
FROM Employees E1
WHERE age = (SELECT MAX(age)
FROM Employees E2
WHERE E1.sex = E2.sex);
結果
図3 リスト2の実行結果
emp_id name dept sex age ------- ------ ------ ------ ----- 003 石川 営業 男 40 006 藤田 総務 女 50
- 注2)
- 「明示的に」
と限定を付けたのは, SQLのコード上では手続きを記述しなくても, SQLエンジンが処理を実行するときにはソートやループのような手続きの実行が行われることが多くあるからです。
行われている動作
リスト2の2つ目のSELECT文においても,
図4 リスト2のクエリで行われている動作
SELECT '001', '橋本', '営業', '男', 37 FROM Employees WHERE 37 = 40; SELECT '002', '山下', '営業', '男', 24 FROM Employees WHERE 24 = 40; SELECT '003', '石川', '営業', '男', 40 FROM Employees WHERE 40 = 40; ←ヒット! SELECT '004', '中島', '総務', '男', 35 FROM Employees WHERE 35 = 40; SELECT '005', '前田', '総務', '男', 26 FROM Employees WHERE 26 = 40; ―――――――――――――――――――――――――――――――――――― ←男女を分ける境界線 SELECT '006', '藤田', '総務', '女', 50 FROM Employees WHERE 50 = 50;←ヒット! SELECT '007', '小川', '開発', '女', 29 FROM Employees WHERE 29 = 50; SELECT '008', '長谷川', '開発', '女', 29 FROM Employees WHERE 29 = 50;
図5 相関サブクエリによる集合のカット
2つの図から明らかなように,
以上のことから,
集合をカットする基準を変化させてみる
さて,
リスト3 相関サブクエリ
SELECT *
FROM Employees E1
WHERE age = (SELECT MAX(age)
FROM Employees E2
WHERE E1.dept = E2.dept);
図6 リスト3の実行結果
emp_id name dept sex age ------- -------- ------ ------ ----- 003 石川 営業 男 40 006 藤田 総務 女 50 007 小川 開発 女 29 008 長谷川 開発 女 29
図7 相関サブクエリによる集合のカット
開発部は,
バックナンバー
SQLアタマアカデミー
- 最終回 OLAP関数で強力な統計処理を実現!―手続き型から理解するSQL (5)集合指向と手続き型
- 最終回 OLAP関数で強力な統計処理を実現!―手続き型から理解するSQL (4)OLAP関数と集約関数を組み合わせる
- 最終回 OLAP関数で強力な統計処理を実現!―手続き型から理解するSQL (3)OLAP専用関数
- 最終回 OLAP関数で強力な統計処理を実現!―手続き型から理解するSQL (2)OLAP関数の基本構文
- 最終回 OLAP関数で強力な統計処理を実現!―手続き型から理解するSQL (1)OLAP関数とは何か
- 第10回 結合大全 (5)非等値結合
- 第10回 結合大全 (4)自己結合
- 第10回 結合大全 (3)外部結合
- 第10回 結合大全 (2)内部結合
- 第10回 結合大全 (1)クロス結合