読者です 読者をやめる 読者になる 読者になる

気ままなタンス*プログラミングなどのノートブック

プログラミングやRPGツクール、DTM、VOCALOIDについてのんびり書きます。

【DBメモ】SQLの実行順序

IPA試験問題でSQLの実行順序に関する設問があって、勉強になったのでメモ。

H20 DB 午後1 問3

テーブル構造

チケット(公演番号, 公演日, 開演時刻, 座席番号, 席種, 予約番号)
    主キー:公演番号, 公演日, 開演時刻, 座席番号

席種残数(公演番号, 公演日, 開演時刻, 席種, 空席数)
    主キー:公演番号, 公演日, 開演時刻, 席種


対象のSQL

SELECT * FROM 席種残数 C1
    WHERE 空席数 <  ( SELECT COUNT(*) FROM チケット C2
                      WHERE C2.公演番号 = C1.公演番号
                        AND C2.公演日 = C1.公演日
                        AND C2.開演時刻 = C1.開演時刻
                        AND C2.席種 = C1.席種
                     ) * 0.1
      AND 空席数 > 0

SQLの文脈

とあるチケット予約システムに関するお話。 公演イベントに関する予約ができる。

SQLの目的は、「空席数の割合が、チケット枚数の10%未満になっている」公演情報を抽出すること。

SQLの実行順序

  1. まず外側のSELECT文が実行される。
  2. 1のから1行が選択される
  3. 2の行に対して、サブクエリが実行される(例:公演[A]、公演日[2016/04/10]、開演時刻[10:00]、席種[S]のチケット枚数をカウント)
  4. 3の実行結果のうち、空席数の割合が10%未満のものを求める
  5. 1の処理結果がなくなるまで、2~4が繰り返される

感想

順序を意識せずなんとなく、書けてしまう相関サブクエリについて、 理解を深めることができたように思う。

相関サブクエリの中には、外側のテーブル名が指定されていることから 混乱してしまうこともある。

まずは外側が実行され、その外側から抽出した1行をパラメータとして、 サブクエリを実行されるという認識を持つとわかりやすい。