質問: MySQLの複雑な検索プログラムのビジュアル化 MySQL教科書の170ページぐらいです。 MySQLの検索カリキュラムが複雑になってきました。 素人なので内容が不透明化してきました。 そこで「MySQLの複雑な検索プログラムのビジュアル化」をしました。 教科書の例題は下記です。 --------------------------------------------- 問題2 次のテーフ ゙ル「tb」で、カラム「uria」が50以上 のデータだけを対象にして、「bang」ごとの「uria」 の平均で120以上のものだけを、「uria」の平均 の多いものから表示してください。 ----------------------------------------------- それで恥ずかしながら ですが!よくわかりませんので独断と偏見でビジュアル化しました。 例題と合致しているでしょうか? 少し勇気がいりましたが、よろしくお願いします。
回答: 中途テーブル表示をビジュアル化と云ってるようだけど、 group by の前にhaving が来るのは間違い。 1: select * from tb; →全行表示 2: select * from tb WHERE uria>=50; → uria が50以上の行表示;ここまでは合ってる。 3: select bang from tb WHERE uria>=50 GROUP BY bang; → bang のgroupを表示 ここでの表は とりあえず bang の行のみとすべき bang A102 A103 A104 A101 A107 4: select bang, AVG(uria) from tb WHERE uria>=50 GROUP BY bang HAVING AVG(uria)>=120; ここで、集約関数の結果をまず表示し、havingで対象行を特定する > select bang, AVG(uria) from tb WHERE uria>=50 GROUP BY bang; bang | AVG(uria) A102 | 129.50 → 対象 A103 | 43.33 → 除外 A104 | 137 → 対象 A101 | 242 → 対象 A107 | 87 → 除外 5: ORDER BY AVG(uria) DESC で並べ替え、問題2の結果が出てくる。 > select bang, AVG(uria) from tb WHERE uria>=50 GROUP BY bang HAVING AVG(uria)>=120 ORDER BY AVG(uria) DESC; bang | AVG(uria) A101 | 242 A104 | 137 A102 | 129.5 最後に、group by句にないtukiカラムをselect句に書くのは標準SQLとしては間違い。 初期のSQLには、入ってないのに、なんで途中から出てくるかな?