SQL練習問題 – 一覧まとめ

この記事は2016年12月5日に書かれたものです。内容が古い可能性がありますのでご注意ください。


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


SQL入門練習問題シリーズ

SQL入門記事の練習問題。その名の通り入門者向け!

 

 

問題
番号
問題 難易度 備考
1 playersテーブルから「所属クラブ(club)」、「背番号(uniform_num)」、「名前(name)」、「ポジション(position)」のカラムをこの順で抽出する。 【SQL入門】SELECT文の基本構文
2 playersテーブルから「所属クラブ(club)」、「背番号(uniform_num)」、「名前(name)」、「ポジション(position)」のカラムをこの順で抽出する。 【SQL入門】SELECT文の基本構文
3 playersテーブルを用いて、各選手の名前とBMIを表示してください。 【SQL入門】定数や計算結果を表示する
4 テーブル名countriesのベルギーのランキングを1位にする。 【SQL入門】UPDATE文の基本構文
5 ベルギー以外の国のランキングを1つ上げる。 【SQL入門】UPDATE文の基本構文
6 countriesテーブルのカメルーンのデータを削除する。 【SQL入門】DELETE文の基本構文
7 FWの選手を全て削除する。 【SQL入門】DELETE文の基本構文
8 playersテーブルにイチロウ選手を登録してください。背番号は51、所属チームはオリナーズ、idは1000としてください。 【SQL入門】INSERT文の基本構文
9 ブラジルA、ブラジルB、ブラジルC、ブラジルDの4チームをcountriesテーブルにまとめて追加してください。idは100~103を割り当て、グループはXとしてください。 【SQL入門】INSERT文で複数行を同時に挿入する
10 トランザクションの開始文は「START TRANSACTION」ともう一つはなにか。 【SQL入門】トランザクションとは
11 goalsテーブルにブラジルvsクロアチア戦(pairings.id=1)で前半10分にフレジ(players.id=19)がゴールを決めたデータ挿入処理をトランザクション開始を宣言して実行してください。なお、トランザクションの終了文はROLLBACKとする。 SQL入門】トランザクションとは
12 現在接続しているMySQLの自動コミットモードを明示的にONに設定してください。 【SQL入門】コミットとロールバック
13 クロアチア(countries.id=4)がAグループからBグループに、スペイン(countries.id=5)がBグループからAグループに変更になりました。また、ブラジルの二人の身長が間違っており、正しくはジュリオセザール選手(players.id=1)が183cm、ジェフェルソン選手(players.id=2)の身長が185cmでした。それぞれ1つのトランザクションにまとめて計2つのトランザクションでデータを修正してください。 【SQL入門】コミットとロールバック
14 自動コミットモードをOFFにして作業をしています。players_tmpテーブルのデータを一旦全削除するつもりでしたが、間違えてpairings_tmpテーブルを削除したのでデータをロールバックしました。どのようなSQLになりますか?最初に自動コミットモードをOFFにしてデータ削除からロールバックまでを実施てください。 【SQL入門】コミットとロールバック
15 以下はそれぞれ原子性、一貫性、独立性、永続性のどれを説明しているか答えなさい。 【SQL入門】ACID特性
16 以下の述語に関する説明で間違っているものをすべて選びなさい 【SQL入門】述語とは
17 「goals」テーブルから、入力ミスでゴールを決めた選手情報(player_id)がないデータを選択してください。 【SQL入門】NULLの判定
18 「goals」テーブルから、フランス対ホンジュラス戦(pairing_id=10)で、ゴールした選手がわかっているデータを選択してください 【SQL入門】NULLの判定
19 名前に「アルメ」が含まれる選手のデータを「players」テーブルから抽出してください LIKE演算子による条件指定
20 名前が「フェル」で始まって、「ン」以外で終わる人のデータを「players」テーブルから抽出してください。 LIKE演算子による条件指定
21 名前が「アン」で始まって6文字の名前の選手の情報を「players」テーブルから抽出してください。 LIKE演算子による条件指定
22 BETWEEN演算子を使用して生年月日(players.birth)が1995年代の選手のデータを抽出してください。 【SQL入門】BETWEEN演算子による条件指定
23 BETWEEN演算子を使用して、体重が60kg未満100kg以上の選手を抽出してください。 【SQL入門】BETWEEN演算子による条件指定
24 IN演算子のみを使用して、体重(players.weight)が62、92、100kgの選手のデータを抽出してください。 【SQL入門】IN演算子による条件指定
25 IN演算子と算術演算子%(剰余)のみを使用して、身長(players.height)もしくは体重(players.weight)が偶数(値 % 2 = 0)の選手のデータのみ抽出してください。 【SQL入門】IN演算子による条件指定
26 ALL演算子と>演算子のみを使用して、日本(players.country = 12)の選手で体重(players.weight)が最も重い人よりも重い選手のデータを抽出してください。 【SQL入門】ANY/ALL演算子による条件指定
27 以下の説明に当てはまる集約関数を答えてください。

1.最小値を返す関数2.平均値を返す関数3.合計値を返す関数
4.レコード数を返す関数5.最大値を返す関数

【SQL入門】集約関数とは
28 1.ワールドカップに参加しているのは何か国でしょうか。
countriesテーブル(id,name,ranking,group_nameの4つのカラムで構成されている)を使って答えを導いてください。

【SQL入門】COUNT関数の基本構文

29 1.2014年ワールドカップに参加した選手の中で最も背が高い選手の身長は何㎝でしょうか。
playersテーブル(id,country_id,uniform_num,position,name,club,birth,height,weightの9つのカラムで構成されている)を使って答えを導いてください。2.2014年ワールドカップの最初の試合は何月何日に行われたでしょうか。
pairings_tmpテーブル(kickoff,my_country,enemy_countryの3つのカラムで構成されている)を使って答えを導いてください。

【SQL入門】MAX/MIN関数の基本構文

30 1.2014年ワールドカップ参加選手の体重を合計すると何㎏になるでしょうか。
playersテーブル(id,country_id,uniform_num,position,name,club,birth,height,weightの9つのカラムで構成されている)を使って答えを導いてください。

【SQL入門】SUM関数の基本構文

31 1.2014年ワールドカップ参加選手の平均身長と平均体重を求めてください。playersテーブル(id,country_id,uniform_num,position,name,club,birth,height,weightの9つのカラムで構成されている)を使って答えを導いてください。

【SQL入門】AVG関数の基本構文

32 1.参加国は何種類のグループに分けられているでしょうか。
countriesテーブル(id,name,ranking,group_nameの4つのカラムで構成されている)を使って答えを導いてください。

【SQL入門】DISTINCTの基本構文 重複行の除外

33
  1. 各クラブに在籍している選手の数を表示する。

【SQL入門】GROUP BY句の基本構文

34
  1. 各グループのランキングの平均を算出する。
  2. 全選手の中から身長が195㎝以上の選手を抽出する。

【SQL入門】GROUP BY句の基本構文~HAVING句での絞り込み~

35
  1. WHERE句とHAVING句を同時に使って平均ランキングが10以下のグループを抽出する。

【SQL入門】GROUP BY句の基本構文~HAVING句の注意点~

36 1.2014年ワールドカップで行われた試合を時系列に沿って表示してください。
pairings_tmpテーブル(kickoff,my_country,enemy_countryの3つのカラムで構成されている)を使って答えを導いてください。

【SQL入門】ORDER BY句の基本構文

37 2014年ワールドカップ開催時の世界ランキングを上位から順に表示してください。その際、ランキング、国名、グループ名の順に表示されるようにしてください。 【SQL入門】ORDER BY句 列番号による並べ替え
37 ワールドカップ出場選手の身長(players.height)の平均を小数点第3位を四捨五入して表示してください。 【SQL入門】算術関数
38 TRUNCATE関数とPOW関数を使用しワールドカップ出場選手の体重(players.weight)の平均を小数点第2位を切り上げて表示してください。 【SQL入門】算術関数
38 クロアチア(players.country_id = 4)の選手で名前(players.name)に「チ」が含まれる選手の名前の「チ」を「ち」にに置き換えて表示してください。 【SQL入門】文字列関数
39 2014 FIFAワールドカップ開催時(2014年6月12日)に35歳以上だった選手をDATE_ADD関数を使用して抽出してください。 【SQL入門】日付関数
40 以下のSQLで各選手のゴール数をカウントしています。
このSQLではplayer_idがNULLになってしまっているところは0と出力されています。
COALESCE関数を使って、この部分も正常にカウントさせれるように変更してください。
【SQL入門】変換関数
41 2014年ワールドカップ開催時の世界ランキング1位の国には”王者”、2位~9位の国には”強豪”、それ以外の国には”チャレンジャー”というふうに分類を行ってください。 【SQL入門】CASE式の基本構文 単純CASE式と検索CASE式
問、次の図が表す結合の種類は何でしょうか。 【SQL入門】結合とは
問、内部結合を用いて、キックオフ時刻と対戦カードが一度に確認できるようにデータを取得してください。 【SQL入門】内部結合の基本構文
問、ブラジルの選手について、誰がどの時間帯にゴールを決めたのか調べるためのデータを取得してください。 【SQL入門】外部結合の基本構文

力試しシリーズ

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

問題
番号
問題 難易度 備考
1 各グループの中でFIFAランクが最も高い国と低い国のランキング番号を表示してください。
2 各国の平均身長を高い方から順に表示してください。ただし、FROM句はcountriesテーブルとしてください。
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)

動作環境について

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

  • MariaDB 5.5.48
  • MySQL Workbench 6.3

よくわからないという方は、XAMPをインストールすると簡単に筆者と同じ環境を構築できます。以下のサイトで紹介されています。
WINDOWS XAMPP にて LARAVEL をインストール (XAMPP V1.8.3インストール)

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

  • このエントリーをはてなブックマークに追加

PAGE TOP