SQLの実行順序を知らないときにやらかしたこと

現象:外部結合で発生したNULLをSELECT内でISNULLを使用して別のもの、
例えば0に置き換えてGroupByでまとめると元々0だったデータとNULLだったデータがまとまってくれない

原因:SELECT句はGroupByよりもSQL内部の実行が遅い
GroupBy実行: 0 でまとめた行と NULLでまとめた行ができる
 ↓
SELECT実行:NULLでまとめられた行をISNULLで0に置き換える
その結果、0を含んだ行が2件出来上がってしまう

SELECT
 IFNULL(TABLE_B.NUMBER, 0)
FROM
(
 SELECT
  IFNULL(TABLE_A.NUMBER, 0) as NUMBER
 FROM
  TABLE_A
) as TABLE_B
GROUP BY
 TABLE_B.NUMBER

対処:上記のコードのように、サブクエリで一時テーブルを取得する際のSELECTで先に置き換えてからJoinを行う
サブクエリはSQLの中で恐らく1番初めに実行される(サブクエリ内部でクエリを実行する際も順序は存在するがまとめてサブクエリとして扱うことにする)
(ここはあまり把握できていなくて、調べてもあまり出てこなかったのであくまで個人の感覚ですが、サブクエリで取得したテーブルはFROMにも使用できるのでこう考えています。)
のでGroupByの対象になる。

サブクエリだけでなく一時テーブルやwith句などの方法もありますが、データ量によってSQLを実行した際のメモリの食い方なども違いがあるかもしれないです。