The JOIN operation(SQLZoo第六部分)

-- 5.1 修改此SQL以列出 賽事編號matchid 和球員名 player ,該球員代表德國隊Germany入球的。要找出德國隊球員,要檢查: teamid = 'GER'
SELECT matchid,player FROM goal WHERE teamid = 'GER';
-- 5.2 由以上查詢,你可見Lars Bender's 於賽事 1012入球。.現在我們想知道此賽事的對賽隊伍是哪一隊。
--     留意在 goal 表格中的欄位 matchid ,是對應表格game的欄位id。我們可以在表格 game中找出賽事1012的資料。
--     只顯示賽事1012的 id, stadium, team1, team2
SELECT id,stadium,team1,team2 FROM game WHERE id = 1012;
-- 5.3 語句FROM 表示合拼兩個表格game 和 goal的數據。語句 ON 表示如何找出 game中每一列應該配對goal中的哪一列 -- goal的 id 必須配對game的 matchid 。 簡單來說,就是
--     ON (game.id=goal.matchid)
--     以下SQL列出每個入球的球員(來自goal表格)和場館名(來自game表格)
--     修改它來顯示每一個德國入球的球員名,隊伍名,場館和日期。
SELECT player, teamid, stadium, mdate FROM game a 
                                      join goal b on a.id=b.matchid
                                      WHERE teamid = 'GER';
-- 5.4 使用上題相同的 JOIN語句,
--     列出球員名字叫Mario (player LIKE 'Mario%')有入球的 隊伍1 team1, 隊伍2 team2 和 球員名 player
SELECT team1,team2,player FROM game a 
                          JOIN goal b ON a.id = b.matchid
                          WHERE b.player LIKE 'Mario%';
-- 5.5 列出每場球賽中首10分鐘gtime<=10有入球的球員 player, 隊伍teamid, 教練coach, 入球時間gtime
SELECT player,teamid,coach,gtime FROM goal a
                                 JOIN eteam b ON a.teamid = b.id
                                 WHERE gtime < 10;
-- 5.6 列出'Fernando Santos'作為隊伍1 team1 的教練的賽事日期,和隊伍名。
SELECT mdate,teamname FROM game a
                      JOIN eteam b ON a.team1 = b.id
                      WHERE coach = 'Fernando Santos';
-- 5..7 列出場館 'National Stadium, Warsaw'的入球球員。
SELECT player FROM goal a
              JOIN game b ON a.matchid = b.id
              WHERE stadium = 'National Stadium, Warsaw';  
-- 5.8 以下例子找出德國-希臘Germany-Greece 的八強賽事的入球
--     修改它,只列出全部賽事,射入德國龍門的球員名字
--     HINT
--     找非德國球員的入球,德國可以在賽事中作team1 隊伍1(主)或team2隊伍2(客)。
--     你可以用teamid!='GER' 來防止列出德國球員。 你可以用DISTINCT來防止球員出現兩次以上。
SELECT DISTINCT player FROM game a
                       JOIN goal b ON a.id = b.matchid
                       WHERE teamid != 'GER' AND (team1 = 'GER' OR team2 = 'GER');
-- 5.9 列出隊伍名稱 teamname 和該隊入球總數 
--     COUNT and GROUP BY
--     你應該在SELECT語句中使用COUNT(*)和使用GROUP BY teamname
SELECT teamname,COUNT(player) FROM goal a
                             JOIN eteam b ON a.teamid = b.id
                             GROUP BY teamname;
-- 5.10 列出場館名和在該場館的入球數字
SELECT stadium,COUNT(player) FROM game AS a 
                             JOIN goal AS b ON a.id = b.matchid
                             GROUP BY stadium; 
-- 5.11 每一場波蘭'POL'有參與的賽事中,列出賽事編號 matchid, 日期date 和入球數字。
SELECT matchid,mdate,COUNT(player) FROM game AS a
                                   JOIN goal AS b ON a.id = b.matchid
                                   WHERE team1 = 'POL' OR team2 = 'POL'
                                   GROUP BY matchid,mdate;
-- 5.12 每一場德國'GER'有參與的賽事中,列出賽事編號 matchid, 日期date 和德國的入球數字。
SELECT matchid,mdate,COUNT(player) FROM game a
                                   JOIN goal b ON a.id = b.matchid
                                   WHERE (team1 = 'GER' OR team2 = 'GER') AND b.teamid = 'GER'
                                   GROUP BY matchid,mdate;
-- 5.13 List every match with the goals scored by each team as shown.
--      This will use "CASE WHEN" which has not been explained in any previous exercises.
--      mdate	        team1	score1	team2	score2
--      1 July 2012	    ESP	    4	    ITA	    0
--      10 June 2012	ESP	    1	    ITA	    1
--      10 June 2012	IRL	    1	    CRO	    3
--      ...
--      Notice in the query given every goal is listed. 
--      If it was a team1 goal then a 1 appears in score1, otherwise there is a 0.
--      You could SUM this column to get a count of the goals scored by team1.
--      Sort your result by mdate, matchid, team1 and team2.
SELECT mdate,matchid,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 a
                    LEFT JOIN goal b ON a.id = b.matchid
                    GROUP BY mdate,matchid,team1,team2;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值