SQLの練習問題です。
筆者の環境は以下となっていますが、別のデータベースやツールでもほとんど同じように動作すると思います。
- MariaDB 5.5.48
- PhpMyAdmin 4.4.15.1
よくわからないという方は、XAMPをインストールすると簡単に筆者と同じ環境を構築できます。以下のサイトで紹介されています。
WINDOWS XAMPP にて LARAVEL をインストール (XAMPP V1.8.3インストール)
問題として使用するデータは以下からダウンロード可能です。phpMyAdminからデータベース(worldcup2014)を作成しインポートしておいてください。
worldcup2014.zip
問題:すべての選手を対象として選手ごとの得点ランキングを表示してください。(テーブル結合を使うこと)
正解:
SELECT p.name AS 名前, p.position AS ポジション, p.club AS 所属クラブ, COUNT(g.id) AS ゴール数 FROM players p LEFT JOIN goals g ON g.player_id = p.id GROUP BY p.id, p.name, p.position, p.club ORDER BY ゴール数 DESC
結果は前回の問題6と同じになります。
ロドリゲス選手が6得点で得点王になっていれば正解です。
また、DBに登録されている選手数が736人ですので、実行結果も同じ数になっているか確認しておきましょう。
テーブル結合ではJOIN句を用いた内部結合か、LEFT JOIN句を用いた外部結合のどちらを使用するかを判断する必要があります。
前回の問題6と同じ結果としたい場合には、LFET JOIN句を使用する必要があります。
JOIN句を使用した場合には抽出されるデータ件数が108件になり大きく減ることになります。
これは、1得点も挙げていない選手が結果の中に抽出されていないためです。
また、選手ごとの得点を表示するためにはグループ関数(count)を使います。またグループ化を行うのでGROUP BY句をしますが、グループ関数を使っている場合には、SELECT句に書いているカラムはすべてGROUP BY句に記述しなければいけないとうルールがありますので注意してください。
選手ごとのランキングですので「GROUP BY p.id」や「GROUP BY p.name」にしてしまいがちですが、これらはSQL構文誤りとなります。(MySQLではエラーにならず実行できてしまいます。)