見出し画像

【SQLZOO答え】6.The JOIN operation

SQL入門を勉強するため、友人にSQLの練習問題ないかと聞いたら、
SQL ZOO】というサイトを教えてもらいました。
ただし、問題を解いてるうちに、わからない問題に関して、クエリの答えがおらず、結果しか教えてくれないので、答えをアウトプットしようと思い、noteを始めました。 

0.SQLZOO練習問題

The JOIN operation

1.matchid と player 名をドイツ(Germany)チームの全ゴールについて表示する。

最初の例としてラストネームが Bender である選手のゴール記録が示されている。「*」でテーブルの全フィールド(カラム)を宣言する。これは matchid, teamid, player, gtime を短く書く方法である。
ドイツプレイヤーを識別するには、次を確認: teamid = 'GER'

select
 matchid, player
from
 goal 
where
 teamid = 'ger';

2.試合 1012 の id, stadium, team1, team2 を表示する。

上記のクエリ―では、Lars Benderのゴールは ゲーム 1012 で確認できる。さて、この試合でどのチーム達がプレイしていたか知りたい。
goalテーブルで試合番号は matchid だが、gameテーブルでは id となっていることに注意する。 試合 2012 の情報を知るには game の該当する行を参照する。

select
 id,stadium,team1,team2
from
 game
where
 id = 1012;

3.ドイツの全ゴールについて player, teamid ,stadium, mdate を表示するように修正する。

JOIN を利用して、2つのステップを組み合わせて単独のクエリ―にすることができる。gameとgoalの詳細を得るには、

SELECT *
FROM game JOIN goal ON (id=matchid)

FROM節はgoalテーブルとgameテーブルのデータを統合する。 ON で gameの行と goalの行を、goalテーブルのidをgameの matchidと一致させて対応させる。 (もっと明確に言うとすれば、こう言う。
ON (game.id=goal.matchid)
得点が有るたびに、goalテーブルから playerを表示して、stadium 名は game ゲーブルから表示する。

select
 player, teamid ,stadium, mdate
from
 game 
join
 goal 
  on (id=matchid)
where
 teamid = 'ger';

4.Marioという名前の選手のゴールについて、team1, team2 , player を表示する。

player LIKE 'Mario%'

select
 team1, team2 , player
from
 game 
join
 goal 
  on (id=matchid)
where
 player LIKE '%Mario%';

5.最初の10分間でゴールしたという条件で、 player, teamid, coach, gtime を表示。gtime<=10

eteam には各参加国のコーチが記載されている。 JOIN で goal を eteam に結合する。 goal JOIN eteam on teamid=id

select
 player, teamid, coach, gtime
from
 goal
join
 eteam
  on teamid=id 
where
 gtime<=10;

6.team1のコーチcoachが 'Fernando Santos' となる試合日mdateとチーム名teamnameを表示。

game と eteam を結合するには、game JOIN eteam ON (team1=eteam.id)、または、game JOIN eteam ON (team2=eteam.id)
id は game と eteam で同じ名前なので、単にidと書く代わりにeteam.idと書かねばならないことに注意する。

select
 mdate, teamname
from
 game as g
join
 eteam as e
  on g.team1 =e.id
where
 coach = 'Fernando Santos';

7.'National Stadium, Warsaw' スタジアムで開催された試合でゴールした選手を表示する。

select
 player
from
 game gm
join
 goal go
  on gm.id=go.matchid
where
 stadium = 'National Stadium, Warsaw';

8.ドイツと対戦して、ゴールした選手の名前を全て表示する。

ドイツプレイヤーではないプレイヤーで、GER が team1 または team2 のidに現れるプレイヤーを選択する。
teamid!='GER' でドイツプレイヤーをリストアップするのを防ぐ。
DISTINCT でプレイヤーの名前が繰り返し登場するのを止める。

select
 distinct(player)
from
 game ga
join
 goal go
   on go.matchid = ga.id 
where
 (team1='ger' or team2='ger') 
  and teamid<>'ger';

9.チーム名teamnameとゴール数の合計を表示する。

ドイツプレイヤーではないプレイヤーで、GER が team1 または team2 のidに現れるプレイヤーを選択する。
teamid!='GER' でドイツプレイヤーをリストアップするのを防ぐ。
DISTINCT でプレイヤーの名前が繰り返し登場するのを止める。

select
 teamname, count(teamid)
from
 goal g
join
 eteam e
  on g.teamid=e.id
group by
 teamname;

10.スタジアムstadiumの名前と、そのスタジアムでのゴール数を各スタジアムごとに表示する。

select
 stadium, count(gtime)
from
 game ga
join
 goal go
  on ga.id=go.matchid
group by
 stadium;

11.'ポーランド(POL)が参戦している全試合の matchid と 日程 とその試合のゴール数 を表示する。

select
 matchid, mdate, count(teamid)
from
 game 
join
 goal 
  on
   matchid = id 
where
 (team1 = 'POL' or team2 = 'POL')
group by
 matchid;

12.ドイツ'GER'が得点した試合の matchid と 日程 と ドイツの得点 を表示する。

select
 matchid, mdate, count(teamid)
from
 game 
join
 goal 
  on
   matchid = id 
where
 teamid = 'ger'
group by
 matchid;

13.ドイツ'GER'が得点した試合の matchid と 日程 と ドイツの得点 を表示する。

各試合ごとに各チームの得点を表示する。
注意) 全得点状況が、記録されている。もし、チーム名が goal に記録されていれば、 その時点でチームが1得点していることにななり、チーム名が記載されていなければ、得点は0点である。
チーム名有り → 1チーム名なし → 0
この、得点状況を 1と0 に CASE WHEN で変換した結果をSUM で集計すれば、そのチームの得点を集計できる。
結果は、日程順で並べ替えて出力する(日程が同じなら、idの順番)。

select
 mdate,
 team1,
 sum(case when teamid=team1 then 1 else 0 end) score1,
 team2,
 sum(case when teamid=team2 then 1 else 0 end) score2
from
 game
left join
 goal
  on id=matchid
group by
 mdate,team1,team2
order by
 mdate, matchid

その他の答へ        

0.SELECT basics
1.SELECT name
2.SELECT from World
3.SELECT from Nobel
4.SELECT within SELECT
5.SUM and COUNT
6.JOIN
7.More JOIN operations
8.Using Null
8+ Numeric Examples
9.Self join
10.Tutorial Quizzes
11.Tutorial Student Records
12.Tutorial DDL

※問題を攻略でき次第、随時更新いたします。

この記事が気に入ったらサポートをしてみませんか?