LoginSignup
0
0

相関サブクエリを自分なりに理解してみた

Last updated at Posted at 2023-11-22

はじめに

SQLの勉強をしていて、相関サブクエリが理解しにくかったので
本記事で言語化し、思考整理します。

▼ 参考にしたサイト

サブクエリの復習

相関サブクエリの話をするうえで、サブクエリを簡単にまとめる。

  1. クエリの中に記述するクエリ
  2. SELECT句、FROM句、WHERE句に加えて、HAVINGやORDER BYなど様々な場所で使える
  3. 記述場所によって、記述マナーが異なるので要注意
  4. テーブル定義でサブクエリで定義する場合、AS句で別名の定義が必要
  5. スカラ・サブクエリ(表内の実データの抽出など)は値が単一でなければならない

相関サブクエリについて自分なりに理解してみた

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

結果

指定されたカラムごとでの結果出力ができますよっていう手法でした。
正直もうこれは形式的に覚えていいのではないかと思っている。

説明してても難しい。
習うより慣れろ、出くわしたときに再び戦えるようにここに残しておく。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0