質問: ### 前提・実現したいこと MySQLを勉強しているのですが,少し疑問に思った部分があったので, 疑問を解決したいです. ### 使用しているデータ <都道府県テーブル> 都道府県コード 都道府県名 人口 面積 <市町村テーブル> 都道府県コード 市町村コード 区分 市町村名 人口 面積 世帯数 ### 該当のソースコード 以下のSQLは市町村数が上位10個の都道府県を表示するためのものです. 適切に動作し,出力結果も正しいです. ですが,私の認識では,GROUP BYで指定したものか,集約関数しかSELECTのカラムに選択出来ないと思っていました. しかし,今回はGROUP BYに都道府県コードを設定し,SELECTには都道府県名を指定しています. ``` SELECT 都道府県名, COUNT(*) AS 市町村数 FROM 都道府県 JOIN 市町村 USING (都道府県コード) GROUP BY 都道府県コード ORDER BY 市町村数 DESC LIMIT 10; ``` 以下のように,GROUP BYの部分を都道府県名に変更しても.同じ結果が出力されます. エラーも出ません. ``` SELECT 都道府県名, COUNT(*) AS 市町村数 FROM 都道府県 JOIN 市町村 USING (都道府県コード) GROUP BY 都道府県名 ORDER BY 市町村数 DESC LIMIT 10; ``` ### 解決したい問題 確かに,都道府県コードと都道府県名は一対一対応なので,取替え可能ですが, そういう話でもないような気がします. GROUP BYに指定したもの意外をSELECTに設定できている疑問を解決したいです. よろしくお願いします. ### 補足情報(言語/FW/ツール等のバージョンなど) DockerでMySQLを実行しています.
回答: > > GROUP BYで指定したものか,集約関数しかSELECTのカラムに選択出来ない > > > 標準SQLとしてはこの認識で問題ないと思います。 少しリファレンスなどを見た感じでは、MySQLの`GROUP BY`は標準SQLを拡張した仕様らしく、`GROUP BY`で指定されていないカラムも`SELECT`で使用できるようです。 ただし、集約される行にあるどの値が返ってくるかが不確定みたいです。 参照:リファレンス ※日本語版は文がちょっと変ですが、英語版の方も合わせてみてもらえればと思います。 今回のケースでは、「都道府県コードと都道府県名は一対一対応」となっているため確実に想定している値が出ているだけ、という状況なのでしょう。