SQL ZOO我的答案之合拼兩個表格

本文深入讲解SQL查询技巧,包括如何使用JOIN操作从多个表中提取数据,如比赛、球员及进球信息;展示如何通过复杂查询获取特定条件下的数据,如德国队进球、特定教练的比赛等。文章还涉及音乐专辑与歌曲的关联查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、修改此SQL以列出 賽事編號matchid 和球員名 player ,該球員代表德國隊Germany入球的。要找出德國隊球員,要檢查: teamid = 'GER'

      SELECT matchid,player FROM goal WHERE teamid = 'GER'

2、只顯示賽事1012的 id, stadium, team1, team2

      SELECT id,stadium,team1,team2  FROM game WHERE id = 1012

3、我們可以利用JOIN來同時進行以上兩個步驟。

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

      語句FROM 表示合拼兩個表格game 和 goal的數據。語句 ON 表示如何找出 game中每一列應該配對goal中的哪一列 -- goalid 必須配對gamematchid 。 簡單來說,就是
      ON (game.id=goal.matchid)

      以下SQL列出每個入球的球員(來自goal表格)和場館名(來自game表格)

      修改它來顯示每一個德國入球的球員名,隊伍名,場館和日期。

      SELECT player,teamid,stadium,mdate  FROM game JOIN goal ON (id=matchid) WHERE teamid='GER';

4、列出球員名字叫Mario (player LIKE 'Mario%')有入球的 隊伍1 team1, 隊伍2 team2 和 球員名 player

      SELECT team1,team2,player  FROM game JOIN goal ON (id=matchid) WHERE player LIKE 'Mario%';

5、表格eteam 貯存了每一國家隊的資料,包括教練。你可以使用語句 goal JOIN eteam on teamid=id來合拼 JOIN 表格goal 到 表格eteam

      列出每場球賽中首10分鐘gtime<=10有入球的球員 player, 隊伍teamid, 教練coach, 入球時間gtime

      SELECT player,teamid,coach,gtime  FROM goal JOIN eteam ON goal.teamid=eteam.id  WHERE goal.gtime<=10

6、要合拼JOIN 表格game 和表格 eteam,你可以使用
  game JOIN eteam ON (team1=eteam.id)
      或
  game JOIN eteam ON (team2=eteam.id)

 注意欄位id同時是表格game 和表格 eteam的欄位,你要清楚指出eteam.id而不是只用id

 列出'Fernando Santos'作為隊伍1 team1 的教練的賽事日期,和隊伍名。

   SELECT mdate,teamname  FROM game JOIN eteam ON game.team1=eteam.id  WHERE eteam.coach='Fernando Santos'

7、列出場館 'National Stadium, Warsaw'的入球球員。

     SELECT player  FROM goal JOIN game ON game.id=goal.matchid WHERE game.stadium ='National Stadium, Warsaw'

8、以下例子找出德國-希臘Germany-Greece 的八強賽事的入球

     修改它,只列出全部賽事,射入德國龍門的球員名字。

     HINT

     找非德國球員的入球,德國可以在賽事中作team1 隊伍1(主)或team2隊伍2(客)。 你可以用teamid!='GER' 來防止列出德國球員。 你可以用DISTINCT來防止球員出現兩次以上。
     SELECT DISTINCT(player) FROM goal JOIN game ON matchid =game.id WHERE teamid!='GER' and (team1='GER' or team2='GER')

      (INNER JOIN 中条件放在on中和where中,返回的结果集是相同的。但是left join,right join, full join外连接就不一样了。on为了反映外连接中一方的全连接,而where没有这个功能,内连接配对是可以的。)

      参考https://www.cnblogs.com/guanshan/articles/guan062.html

9、列出隊伍名稱 teamname 和該隊入球總數

     SELECT teamname, COUNT(*)  FROM eteam JOIN goal ON id=teamid GROUP BY teamname

10、列出場館名和在該場館的入球數字。

     SELECT game.stadium, COUNT(*) FROM game JOIN goal ON game.id=goal.matchid GROUP BY game.stadium

11、每一場波蘭'POL'有參與的賽事中,列出賽事編號 matchid, 日期date 和入球數字。

     SELECT goal.matchid, game.mdate,COUNT(*)  FROM game JOIN goal ON goal.matchid = game.id WHERE(game.team1 = 'POL' OR game.team2 = 'POL') GROUP BY goal.matchid, game.mdate

    (goal.matchid, game.mdate在各自的表中都不唯一,而我们想要展示的是一个赛事编号和一个日期想对应的,所以两者同时使用GROUP BY)

12、每一場德國'GER'有參與的賽事中,列出賽事編號 matchid, 日期date 和德國的入球數字。

SELECT goal.matchid, game.mdate,COUNT(*)  FROM game JOIN goal ON goal.matchid = game.id  WHERE(game.team1 = 'GER' OR game.team2 = 'GER') AND teamid='GER' GROUP BY goal.matchid, game.mdate

13、列出每场赛事两队得分(这个题目一开始也不清楚干嘛)

       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 JOIN goal ON matchid = id
      GROUP BY mdate,matchid,team1,team2;

       SELECT mdate,team1,
       SUM( CASE WHEN teamid=team1
                            THEN 1
                            ELSE 0 END) AS score1,/*这是什么造型啊*/加上AS就懂了
      team2,
      SUM( CASE WHEN teamid=team2
                           THEN 1
                            ELSE 0 END) AS score2/*这是什么造型啊*/加上AS就懂了
      FROM game JOIN goal ON matchid = id
      GROUP BY mdate,matchid,team1,team2;

     

 

1、找出 收錄 歌曲song 'Alison' 碟名title 和 歌手 artist。.

      SELECT album.title,album.artist  FROM album JOIN track  ON (album.asin=track.album)  WHERE song = 'Alison'

2、哪一歌手artist 錄了歌曲 song 'Exodus'?

      SELECT album.artist FROM album JOIN track  ON (album.asin=track.album)  WHERE song = 'Exodus'

3、為大碟album 'Blur', 顯示每一首歌的歌名 song

      SELECT track.song  FROM album JOIN track  ON (album.asin=track.album WHERE album.title = 'Blur'

4、為每一大碟album顯示碟名title和每大碟的歌曲track數量。

      SELECT album.title,COUNT(song) track  FROM album JOIN track ON album.asin=track.album GROUP BY title

5、為每一大碟album列出碟名title 歌名中有'Heart'一詞的歌曲數量。 (沒有這些歌的大碟不用列出).

      SELECT album.title,COUNT(song) track  FROM album JOIN track ON album.asin=track.album AND track.song LIKE '%Heart%' GROUP BY title

6、主題歌曲是歌名 song 和大碟名字 title相同。找出主題歌曲。

      SELECT track.song FROM album JOIN track ON album.asin=track.album and album.title=track.song

7、同名大碟是指大碟和歌手名字相同。 (例如大碟'Blur' 是由樂隊 'Blur'主唱)。 找出同名大碟。

      SELECT title FROM album where title=artist

8、找出歌曲收錄在2隻以上的大碟中。列出收錄次數。

     SELECT song, COUNT(DISTINCT(title))  FROM album JOIN track ON asin=album GROUP BY song HAVING COUNT(DISTINCT(title))>2;having可以和聚合函数一起使用。但是这个答案在练习时总显示结果数据不对,不知道错哪儿了、

(虽然 COUNT(DISTINCT(title))和 COUNT(DISTINCT(asin))结果是一样的,但是题目答案可能设定的是 COUNT(DISTINCT(asin)),改成asin就正确了)

9、好價大碟是指大碟中每一首歌曲的價格是少於5角。 找出好價大碟,列出大碟名字,售價和歌曲數量。

      SELECT title,price,COUNT(song)  FROM album JOIN track ON asin=album  GROUP BY title,price HAVING price/COUNT(song)<0.5;5角是0.5元

10、按歌曲量(多至少)列出每一大碟的碟名和歌曲數量。

      SELECT title,COUNT(asin) FROM album JOIN track ON asin=album GROUP BY title,asin ORDER BY COUNT(asin) DESC ;

 

### SQLZOO JOIN 练习解答 在处理数据库查询时,`JOIN` 是种用于组来自两个或多个表的数据的重要工具。对于 `LEFT JOIN` `RIGHT JOIN` 的区别,在某些情况下,选择适的连接方式可以极大地影响查询的结果集。 #### 左连接 (LEFT JOIN) 左连接返回左表中的所有记录以及右表中存在的匹配记录。如果右表中不存在匹配,则结果集中相应的列将包含 NULL 值[^1]。 ```sql SELECT A.column_name, B.column_name FROM TableA AS A LEFT JOIN TableB AS B ON A.common_field = B.common_field; ``` #### 右连接 (RIGHT JOIN) 右连接则相反,它会返回右表中的所有记录以及左表中存在的匹配记录。同样地,当左表缺少对应数据时,这些字段会被填充为 NULL。 ```sql SELECT A.column_name, B.column_name FROM TableA AS A RIGHT JOIN TableB AS B ON A.common_field = B.common_field; ``` 为了更好地理解如何应用这两种类型的联接操作,下面提供几个基于 SQLZOO 平台上的练习实例: ##### 示例 1: 查询世界人口超过五千五百万的国家及其所属大洲的人口总 此问题可以通过执行内连接来解决,因为这里只需要考虑那些确实存在于两张表格内的条目;但是也可以通过其他形式的外键关联实现相同的功能。 ```sql SELECT continent, SUM(population) FROM world WHERE population > 55000000 GROUP BY continent; -- 或者使用 INNER JOIN 实现同样的效果 SELECT T1.continent, SUM(T2.population) FROM world AS T1 INNER JOIN world AS T2 ON T1.name = T2.name WHERE T2.population > 55000000 GROUP BY T1.continent; ``` ##### 示例 2: 列出欧洲各国首都名称与所在国名 这个问题适采用左连接的方式来进行求解,即使有些国家可能暂时还没有定义其首都城市也不会丢失该国的信息。 ```sql SELECT country.name, city.name FROM country LEFT JOIN city ON country.capital = city.id WHERE country.continent='Europe'; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值