はじめに
SQLの勉強をしていて、相関サブクエリが理解しにくかったので
本記事で言語化し、思考整理します。
▼ 参考にしたサイト
サブクエリの復習
相関サブクエリの話をするうえで、サブクエリを簡単にまとめる。
- クエリの中に記述するクエリ
- SELECT句、FROM句、WHERE句に加えて、HAVINGやORDER BYなど様々な場所で使える
- 記述場所によって、記述マナーが異なるので要注意
- テーブル定義でサブクエリで定義する場合、AS句で別名の定義が必要
- スカラ・サブクエリ(表内の実データの抽出など)は値が単一でなければならない
相関サブクエリについて自分なりに理解してみた
PointListテーブルからJapaneseのMAX値を出力する例
class | name | Japanese |
---|---|---|
A | yamada | 100 |
A | sato | 90 |
A | iida | 50 |
B | uchida | 99 |
B | kisida | 29 |
C | tanaka | 95 |
C | kitayama | 50 |
SELECT * FROM PointList AS T1
WHERE Japanese = (SELECT MAX(Japanese)
FROM PointList AS T2
WHERE T1.Class = T2.Class);
思考回路としては
*だからカラムは全出力
テーブルはPointList(T1)を参照
Japanese=サブクエリの条件を満たす・・・・・・。
ん~~~、T1.Class = T2.Class
がわからん。
おそらく時間おいてみてみると同じことを思うと思う。
相関サブクエリを理解するうえで
どういう処理順で動いているかがすごく大切!
下記で分解して検討
SELECT * FROM PointList AS T1
WHERE Japanese = (サブクエリの中身);
~通常クエリ~
(SELECT MAX(Japanese)
FROM PointList AS T2
WHERE T1.Class = T2.Class);
これで1行ごとに処理が進んでいく。
クエリ実行(①)⇒サブクエリ実行(②)⇒1行取得
の繰り返しが高速で行われて結果出力がされる。
ここで出てくるのがムズイポイント
WHERE T1.Class = T2.Class
これは外クエリと同じ時間軸でサブクエリの参照する場所推移するイメージ。
外クエリで参照した「テーブル.Class」をサブクエリでも参照するよってこと。
クエリで「A class」を参照しているときはサブクエリでも「A class」を参照する。
クエリで「B class」を参照しているときはサブクエリでも「B class」を参照する。
クエリで「C class」を参照しているときはサブクエリでも「C class」を参照する。
つまり?それぞれの「Class」ごとで計算しますよ!!!!
⇒本例だとA~C classまでなので「A」「B」「C」それぞれで結果を求めるよ!!
▼結果はこうなる
class | name | Japanese |
---|---|---|
A | yamada | 100 |
B | uchida | 99 |
C | tanaka | 95 |
結果
指定されたカラムごとでの結果出力ができますよっていう手法でした。
正直もうこれは形式的に覚えていいのではないかと思っている。
説明してても難しい。
習うより慣れろ、出くわしたときに再び戦えるようにここに残しておく。