相関サブクエリ
では次に、
手続き型言語で解く場合
もしEmployeesテーブルがCSV
- max_
ageという整数型の変数を用意し、 0で初期化する - レコードを1行ずつ走査する
- カレントレコードのsexが
「男」 ならば、 ageとmax_ ageを比較し、 ageのほうが大きければ、 max_ ageにageを代入する - すべてのレコードについて走査したら、
max_ ageを男性の最高齢値として返す - 2.からの処理を、
女性についても繰り返す
ここでは、
SQLで解く場合
一方、
SELECT *
FROM Employees E1
WHERE age = (SELECT MAX(age)
FROM Employees E2
WHERE E1.sex = E2.sex);
結果
emp_id name dept sex age ------- ------ ------ ------ ----- 003 石川 営業 男 40 006 藤田 総務 女 50
行われている動作
リスト2の2つ目のSELECT文においても、
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 相関サブクエリによる集合のカット(性別) 図5 相関サブクエリによる集合のカット(性別)](/assets/images/dev/serial/01/sql_academy2/000902/002.png)
2つの図から明らかなように、
以上のことから、
集合をカットする基準を変化させてみる
さて、
SELECT *
FROM Employees E1
WHERE age = (SELECT MAX(age)
FROM Employees E2
WHERE E1.dept = E2.dept);
emp_id name dept sex age ------- -------- ------ ------ ----- 003 石川 営業 男 40 006 藤田 総務 女 50 007 小川 開発 女 29 008 長谷川 開発 女 29
![図7 相関サブクエリによる集合のカット(部署別) 図7 相関サブクエリによる集合のカット(部署別)](/assets/images/dev/serial/01/sql_academy2/000902/thumb/TH300_003.png)
開発部は、