Tips

SQL練習問題 – 一覧まとめ

SQL練習問題 – 一覧まとめ

SQL練習問題の一覧です。
難易度にばらつきがありますので、基礎的なポイントを確認したい場合には、★のついていない基礎力チェックシリーズ(問25以降)から始めてみてください。自信のある方は力試しシリーズの問1から、実力を試してみたい方は★★★の問題へチャレンジしてみると力試しになるかと思います。


力試しシリーズ

この問題が解ければあなたのSQL力は業務レベル!?

問題
番号
問題 難易度 備考
1 各グループの中でFIFAランクが最も高い国と低い国のランキング番号を表示してください。
2 全ゴールキーパーの平均身長、平均体重を表示してください
3 各国の平均身長を高い方から順に表示してください。ただし、FROM句はcountriesテーブルとしてください。 ★★
4 各国の平均身長を高い方から順に表示してください。ただし、FROM句はplayersテーブルとして、テーブル結合を使わず副問合せを用いてください。 ★★
5 キックオフ日時と対戦国の国名をキックオフ日時の早いものから順に表示してください。
6 すべての選手を対象として選手ごとの得点ランキングを表示してください。(SELECT句で副問合せを使うこと)
7 すべての選手を対象として選手ごとの得点ランキングを表示してください。(テーブル結合を使うこと) ★★
8 各ポジションごとの総得点を表示してください。
9 ワールドカップ開催当時(2014-06-13)の年齢をプレイヤー毎に表示する。 ★★
10 オウンゴールの回数を表示する
11 各グループごとの総得点数を表示して下さい。 ★★
12 日本VSコロンビア戦(pairings.id = 103)でのコロンビアの得点のゴール時間を表示してください
13 日本VSコロンビア戦の勝敗を表示して下さい。
14 グループCの各対戦毎にゴール数を表示してください。 ★★
15 グループCの各対戦毎にゴール数を表示してください。 ★★
16 グループCの各対戦毎にゴール数を表示してください。 ★★★
17 問題16の結果に得失点差を追加してください。 ★★★
18 ブラジル(my_country_id = 1)対クロアチア(enemy_country_id = 4)戦のキックオフ時間(現地時間)を表示してください。
19 年齢ごとの選手数を表示してください。
20 年齢ごとの選手数を表示してください。ただし、10歳毎に合算して表示してください。 ★★
21 年齢ごとの選手数を表示してください。ただし、5歳毎に合算して表示してください。 ★★
22 以下の条件でSQLを作成し、抽出された結果をもとにどんなことが分析できるか考えてみてください。 ★★
23 身長の高い選手ベスト5を抽出し、以下の項目を表示してください。
24 身長の高い選手6位~20位を抽出し、以下の項目を表示してください。

基礎力チェックシリーズ

SQLを勉強しはじめたばかりの方向け!たくさん解いてSQL基礎力を高めましょう!

問題
番号
問題 難易度 備考
25 全選手の以下のデータを抽出してください。 射影
26 グループCに所属する国をすべて抽出してください。 選択(=)
27 グループC以外に所属する国をすべて抽出してください。 選択(!=)
28 2016年1月13日現在で40歳以上の選手を抽出してください。(誕生日の人を含めてください。) 選択(>=、<=)
29 身長が170cm未満の選手を抽出してください。 選択(>、<)
30 FIFAランクが日本(46位)の前後10位に該当する国(36位~56位)を抽出してください。ただし、BETWEEN句を用いてください。 選択(BETWEEN)
31 選手のポジションがGK、DF、MFに該当する選手をすべて抽出してください。ただし、IN句を用いてください。 選択(IN)
32 オウンゴールとなったゴールを抽出してください。goalsテーブルのplayer_idカラムにNULLが格納されているデータがオウンゴールを表しています。 選択(IS NULL)
33 オウンゴール以外のゴールを抽出してください。goalsテーブルのplayer_idカラムにNULLが格納されているデータがオウンゴールを表しています。 選択(IS NOT NULL)
34 名前の末尾が「ニョ」で終わるプレイヤーを抽出してください。 選択(LIKE前方or後方)
35 名前の中に「ニョ」が含まれるプレイヤーを抽出してください。 選択(LIKE前方後方一致)
36 グループA以外に所属する国をすべて抽出してください。ただし、「!=」や「<>」を使わずに、「NOT」を使用してください。 選択(NOT)
37 全選手の中でBMI値が20台の選手を抽出してください。BMIは以下の式で求めることができます。 選択(AND)
38 全選手の中から小柄な選手(身長が165cm未満か、60kg未満)を抽出してください。 選択(OR)
39 FWかMFの中で170未満の選手を抽出してください。ただし、ORとANDを使用してください。 選択(AND、ORの組み合わせ)
40 ポジションの一覧を表示してください。グループ化は使用しないでください。 DISTINCT
41 全選手の身長と体重を足した値を表示してください。合わせて選手の名前、選手の所属クラブも表示してください。 算術演算子(SELECT句)
42 選手名とポジションを以下の形式で出力してください。シングルクォートに注意してください。 文字列結合、エスケープシーケンス
43 全選手の身長と体重を足した値をカラム名「体力指数」として表示してください。合わせて選手の名前、選手の所属クラブも表示してください。 列見出し
44 FIFAランクの高い国から順にすべての国名を表示してください。 ソート(単一カラム)
45 全ての選手を年齢の低い順に表示してください。なお、年齢を計算する必要はありません。 ソート(降順)
46 全ての選手を身長の大きい順に表示してください。同じ身長の選手は体重の重い順に表示してください。 ソート(複数カラム)
47 全ての選手のポジションの1文字目(GKであればG、FWであればF)を出力してください。 単一行関数(文字列関数)
48 出場国の国名が長いものから順に出力してください。 単一行関数(文字列関数)
49 全選手の誕生日を「2017年04月30日」のフォーマットで出力してください。 単一行関数(DATE_FORMAT)
50 全てのゴール情報を出力してください。ただし、オウンゴール(player_idがNULLのデータ)はIFNULL関数を使用してplayer_idを「9999」と表示してください。 単一行関数(IFNULL)
51 全てのゴール情報を出力してください。ただし、オウンゴール(player_idがNULLのデータ)はCASE関数を使用してplayer_idを「9999」と表示してください。 単一行関数(CASE)
52 全ての選手の平均身長、平均体重を表示してください。 グループ関数(AVG)
53 日本の選手(player_idが714から736)が上げたゴール数を表示してください。 グループ関数(COUNT)
54 オウンゴール(player_idがNULL)以外の総ゴール数を表示してください。ただし、WHERE句は使用しないでください。 グループ関数(COUNT)
55 全ての選手の中で最も高い身長と、最も重い体重を表示してください。 グループ関数(MAX)
56 AグループのFIFAランク最上位を表示してください。 グループ関数(MIN)
57 CグループのFIFAランクの合計値を表示してください。 グループ関数(SUM)
58 全ての選手の所属国と名前、背番号を表示してください。 内部結合(INNER JOIN)
59 全ての試合の国名と選手名、得点時間を表示してください。オウンゴール(player_idがNULL)は表示しないでください。 内部結合(INNER JOIN)
60 全ての試合のゴール時間と選手名を表示してください。左側外部結合を使用してオウンゴール(player_idがNULL)も表示してください。 外部結合(LEFT JOIN)
61 全ての試合のゴール時間と選手名を表示してください。右側外部結合を使用してオウンゴール(player_idがNULL)も表示してください。 外部結合(RIGHT JOIN)
62 全ての試合のゴール時間と選手名、国名を表示してください。また、オウンゴール(player_idがNULL)も表示してください。 2つ以上の外部結合
63 全ての試合のキックオフ時間と対戦国の国名を表示してください。 自己結合
64 全てのゴール時間と得点を上げたプレイヤー名を表示してください。オウンゴールは表示しないでください。ただし、結合は使わずに副問合せを用いてください。 副問合せ(SELECT句)
65 全てのゴール時間と得点を上げたプレイヤー名を表示してください。オウンゴールは表示しないでください。ただし、副問合せは使わずに、結合を用いてください。 結合と副問合せ(SELECT句)
66 各ポジションごと(GK、FWなど)に最も身長と、その選手名、所属クラブを表示してください。ただし、FROM句に副問合せを使用してください。 副問合せ(FROM句)
67 各ポジションごと(GK、FWなど)に最も身長と、その選手名を表示してください。ただし、SELECT句に副問合せを使用してください。 副問合せ(SELECT句)
68 全選手の平均身長より低い選手をすべて抽出してください。表示する列は、背番号、ポジション、名前、身長としてください。 副問合せ(WHERE句)
69 各グループの最上位と最下位を表示し、その差が50より大きいグループを抽出してください。 HAVING句
70 1980年生まれと、1981年生まれの選手が何人いるか調べてください。ただし、日付関数は使用せず、UNION句を使用してください。 集合演算子(UNION)
71 身長が195㎝より大きいか、体重が95kgより大きい選手を抽出してください。ただし、以下の画像のように、どちらの条件にも合致する場合には2件分のデータとして抽出してください。また、結果はidの昇順としてください。 集合演算子(UNION ALL)
72 Viewは仮想テーブルなので、その中にデータは存在しません。それではViewの実態は何でしょう? Viewとは
73 以下の○○○に当てはまる用語を解答してください。
Viewを作成するには○○○文を使用します。
作成したViewは実テーブルを参照するのと同じように○○○文を利用します。
Viewの作成
74 作成したViewを変更するためには以下のうちどの文を使用すればよいでしょうか?
・UPDATE VIEW文
・ADD VIEW文
・ALTER VIEW文
・SELECT VIEW文
Viewの変更・更新
75 Viewを削除する文を以下から選択してください。
・DELETE VIEW文
・ALTER VIEW文
・RESET VIEW文
・DROP VIEW文
Viewの削除

動作環境について

筆者の環境は以下となっていますが、別のデータベースやツールでもほとんど同じように動作すると思います。

  • MariaDB 5.5.48
  • MySQL Workbench 6.3

よくわからないという方は、XAMPをインストールすると簡単に筆者と同じ環境を構築できます。以下のページで紹介されています。
【PHP入門】環境構築

問題として使用するデータは以下からダウンロード可能です。phpMyAdminからデータベース(worldcup2014)を作成しインポートしておいてください。
worldcup2014.zip

関連する連載リンク

SQL基礎 連載目次

WEBアプリケーション関連 人気連載リンク

データベースの基礎が学べるSQL基礎講座
SQL基礎 連載

より実践的なWEBアプリ開発講座!Bootstrap活用を学ぶなら・・
魁!小野の塾 連載

Recent News

Recent Tips

Tag Search